Есть много возможных оптимизаций.Я думаю, что один из них, который я бы использовал, - избегать толкания / расталкивания матрицы каждый раз, что может занять очень много времени.Поскольку вы только переводите, вы можете отслеживать ваш последний перевод и просто сдвигаться на относительную величину.В псевдокоде:
glPushMatrix()
Point3D offset(0,0,0)
for box in collids:
glTranslatef(box.x + offset.x, box.y + offset.y, box.z + offset.z)
draw_cube()
offset -= (box + offset)
glPopMatrix()
Одно предупреждение: хотя OpenGL использует только 32-разрядные числа с плавающей запятой (в большинстве реализаций), вероятно, лучше использовать числа с плавающей запятой двойной точности для хранения смещения, чтобы уменьшить накопление округленияошибки.
(отредактировано для исправления вычисления смещения.)