Я пытаюсь оптимизировать доступ и изменение данных 3D-среды, потому что некоторые операции нужно делать миллионы раз. В настоящее время я следующие оптимизации на месте:Ускоренный способ преобразования 1D -> 3D с использованием мощностей 2 измерения
- с помощью плоского массива (1D)
- Размеры по степеням 2
- Bit-сдвига, где это возможно, вместо умножения/деления
индексирование 3D-векторов выглядит следующим образом:
- изменение вектора X будет увеличивать/уменьшать индекс Ь у 1
- Изменение вектора Y будет увеличение/уменьшение индекса по 3DEnvironmentSize.X
- Изменение Z вектора будет увеличивать/уменьшать индекс на 3DEnvironmentSize.X * 3DEnvironmentSize.Y
Учитывая следующий псевдокод:
mapSize.X = 4
mapSize.Y = 4
mapSize.Z = 2
Xdif = 1
Ydif = mapSize.X = 4
Zdif = mapSize.X * mapSize.Y = 16
Xexponent = log2(Xdif) = log2(1) = 0 (2^0 = 1 = Xdif)
Yexponent = log2(Ydif) = log2(4) = 2 (2^2 = 4 = Ydif)
Zexponent = log2(Zdif) = log2(16) = 4 (2^4 = 16 = Zdif)
Можно было бы перейти от 3D -> 1D данного вектора (1,2,1), используя следующий:
location.X = 1
location.Y = 2
location.Z = 1
shiftIndex.X = location.X << Xexponent = 1 << 0 = 1
shiftIndex.Y = location.Y << YExponent = 2 << 2 = 8
shiftIndex.Z = location.Z << Zexponent = 1 << 4 = 16
index = shiftIndex.X + shiftIndex.Y + shiftIndex.Z = 1 + 8 + 16 = 25
Как вы можете видеть, я использую бит-сдвиг для увеличения скорости обработки. Теперь я знаю, как конвертировать 3D -> 1D с использованием devisions и делением остатков с данным индексом 30, как так:
index = 30
location.X = index % mapSize.X
location.Y = (index/mapSize.X) % mapSize.Y
location.Z = ((index/mapSize.X)/mapSize.Y) % mapSize.Z
Есть ли способ использовать битый сдвиг (или что-нибудь еще в этом отношении) вот как-то что сделает это быстрее? Я пытаюсь это сделать в течение некоторого времени, но я не могу взломать его, если это возможно даже в первую очередь.
Спасибо за ответ, но нет, я не пытаюсь получить доступ быстрее элементов в массиве. Однако недостатком наличия 1D-массива является то, что вам нужно будет вычислить координаты из индекса. Я пытаюсь оптимизировать то, как это делается (как можно быстрее). – Neijwiert