C ++ Производительность произвольного доступа к трехмерному массиву - PullRequest
2 голосов
/ 17 июня 2019

Я бы хотел повысить производительность приложения, в котором хранится 3D-карта.В настоящее время он использует QtreeNode в качестве структуры для хранения карты.Однако доступ к случайной позиции с координатами x, y, z имеет сложность log2n.

Я хотел бы сохранить часть карты, к которой, как мне известно, обращаются 90% времени, в статическом массиве, определяемом как:

Tile* tileArray[16][3500][3500] // [z, x, y];

Причина, по которой я установил z в качестве первого измерения, заключается в том, что итерации приложения обычно выполняются этаж за этажом и строка за строкой, как показано ниже:

for (int32_t z = fromZ; z <= toZ; ++z) {
    for (int32_t x = fromZ; x <= toX; ++x) {
       for (int32_t y = fromY; y <= toY; ++y) {
            Tile* accessTile = tileArray[z][x][y];
      }
   }
}

Tile * - указатель наструктура данных, содержащая информацию об этой позиции на 3D-карте.Поскольку система является 64-битной, а размер указателя составляет 8 байт, и она занимает 1,5 ГБ ОЗУ.

Я хотел бы спросить, есть ли проблема со случайным доступом к такому массиву с x, y, zкоординаты.По логике, сложность должна быть O (1), но я не уверен, как процессор вычисляет точную позицию в памяти.

Я не боюсь чрезмерного использования ОЗУ.

...