В моей системе вокселов используется динамический динамический массив, распределенный во время выполнения для каждого фрагмента, однако создание миллионов кубов на кусок невозможно, поэтому мне нужно оптимизировать.Проверяйте соседние вокселы эффективно в 3D-массиве размера n
Первой оптимизацией, которую я намерен реализовать, является, конечно, не генерация данных ячейки для оккультированных вокселов, это хорошая идея на бумаге, но я не знаю, как это сделать.
Все мои попытки оказались сложными для отладки проблем с распределением памяти, и поэтому я должен бросить полотенце и попросить более знающих людей, поскольку я нахожусь в убытке.
Моя нынешняя инкарнация это как таковой
int8_t x = 0, y= 0, z = 0;
const int MAX = CHUNKSIZE-1;
const int MIN = 0;
int8_t sPosX = (x - 1 < MIN) ? x : x-1;
int8_t sPosY = (y - 1 < MIN) ? y : y-1;
int8_t sPosZ = (z - 1 < MIN) ? z : z-1;
int8_t ePosX = (x + 1 > MAX) ? x : x+1;
int8_t ePosY = (y + 1 > MAX) ? y : y+1;
int8_t ePosZ = (z + 1 > MAX) ? z : z+1;
int8_t a=sPosX, b=sPosY, c=sPosZ;
int8_t add = 0;
BlockType BT = BT_grass;
scene::SMesh* mesh = new scene::SMesh();
for(x = 0; x <= MAX; x++)
{
for(y = 0; y <= MAX; y++)
{
for(z = 0; z <= MAX; z++)
{
cm = b_blocks[x][y][z].material;
//b_blocks[x][y][z].setFlags(0xFE, BT);
if(!b_blocks[x][x][z].isActive())
{
continue;
}
else
{
if(sPosX == MIN)
{
createCube(x,y,z,c,mesh,cm);
}
else
{
if(a<=ePosX)
{
if(b<=ePosY)
{
if(c<=ePosZ)
{
printf("x %d, y %d, z %d\n", x, y, z);
if(!b_blocks[x][y][z].isActive())
{
add = 1;
}
}
}
}
if(add == 1)
{
createCube(x,y,z,c,mesh,cm);
add = 0;
}
}
}
}
}
}
КРП (sPosX == MIN) хак я реализовывал не на сегментации генерации кусок (в противном случае она возвращает ошибку сегментации с нарушением доступа к памяти о создании . блок [CHUNKSIZE] [CHUNKSIZE] [CHUNKSIZE], что не очень приятно Этот хак неосторожно убеждается, что все кубы генерируются однако и столь же непривлекательный
Конспективные вопросы здесь заключается в следующем:. что часть моей логики нарушена? (предположительно, все это) и как правильно быстро проверить соседние блоки, которые не вызывают ошибку за пределами границ? (Я попытался с помощью кодирования вручную исключений для каждого последнего угла дела, но это оказалось неосновательный и был порядков медленнее и склонны к segfaulting)
У меня есть мир voxel с открытым исходным кодом, реализованный в C++; Я сделал это, создав класс ['BlockIterator'] (https://github.com/programmerjake/voxels-0.7/blob/master/include/util/block_iterator.h), который обрабатывает перевод с глобальных позиций на куски/фрагменты локальных позиции. также вот определение для [блок-кусок] (https://github.com/programmerjake/voxels-0.7/blob/master/include/util/basic_block_chunk.h#L41) – programmerjake
После сглаживания 1370 нечетных строк я не вижу как это должно мне помочь (в основном потому, что у меня нет времени для углубленного изучения кода и фактически расшифровки всех этих строк относительно друг друга, и если бы у меня было такое время, я бы загрузил источник на что-то вроде minetest и начать читать это). – LordHexahedron