Я обнаружил, что удивительные большие миры Minecraft очень медленны для навигации, даже с четырехъядерным процессором и мясной видеокартой.
Я предполагаю, что медлительность Minecraft проистекает из:
- Java, так как пространственное разбиение и управление памятью быстрее в родном C ++.
- Слабое разделение мира.
Я могу ошибаться в обоих предположениях. Однако это заставило меня задуматься о том, как лучше управлять большими мирами вокселей. Как это настоящий 3D мир, где блок может существовать в любой части мира, это в основном большой 3D массив [x][y][z]
, где каждый блок в мире имеет тип (то есть BlockType.Empty = 0
, BlockType.Dirt = 1
и т.д.)
Я предполагаю, что для того, чтобы этот мир работал хорошо, вам необходимо:
- Используйте дерево определенного сорта ( oct / kd / bsp ), чтобы разбить все кубы; кажется, что oct / kd был бы лучшим вариантом, так как вы можете просто разделить на уровне каждого куба, а не уровне треугольника.
- Используйте некоторый алгоритм, чтобы определить, какие блоки в данный момент можно увидеть, поскольку блоки ближе к пользователю могут запутывать блоки позади, делая их бессмысленными для рендеринга.
- Держите объект блока легким, чтобы его можно было легко добавлять и удалять с деревьев.
Я думаю, что нет правильного ответа на этот вопрос, но мне было бы интересно узнать мнение людей по этому вопросу. Как бы вы улучшили производительность в большом мире на основе вокселей?