А почему игра так медленно рендерит чанки? Телепортируешься куда-то и секунд 5-7 ждёшь пока мир вокруг прорисуется. Вроде ограничений в коде не нашел. Как можно ускорить?
Тут два ботлнека.
1. Передача чанков с сервера на клиент.
2. Генерация рендер-чанков на клиенте.
Рендер-чанк это часть реального чанка размером 16*16*16. При каждом изменении блока необходимо обновить 9 рендер-чанков вокруг. Если не ошибаюсь, то в ваниле эти чанки добавлются в очередь и каждый кадр обновляется n-ое количество чаков. Естественно, это можно и нужно распараллелить. Я делал загрузку в 4 шага. В первом шаге (асинхронном) собирал рендер чанк в буфер тесселятора. Во втором шаге (синхронном), зная размер собранных вершин, аллоцировал VBO. В третьем шаге (асинхронном) копировал память из буфера тесселятора в VBO. В четвертом шаге (синхронном) всякие завершающие действия (например, unmap VBO). Асинхронные шаги выполняются в воркер тредах, которые работают, пока во входной очереди есть таски. Синхронные - в главном треде. Естественно, можно задать сколько угодно тредов, но на каждый тред должен быть свой тесселятор. Еще очень решающей оптимизацией было увеличение самого рендер чанка. В ваниле рендер чанк такой маленький, потому что загрузка происходит синхронно. Я же сделал динамический размер. Самое оптимальное было 32*64*32. При таком размере и загрузка быстрая и occlusion culling приемлемо работал. А еще это ооочень сильно бустит fps. Мир с дальностью прорисовки в 20 чанков в 4 потока рендерился в пределах секунды.
Еще, если интересно, я делал greedy meshing, переопределив тесселятор. Загрузка чанков дольше (и это не страшно, ведь она асинхронная), но быстрее рендеринг за счет уменьшения количества квадов в рендер чанке. Но на самом деле все ломают статические тени, из-за которых плохо склеиваются квады. Если в чистом поле еще хоть как-то работало, то в лесу почти ничего не склеивалось. А еще для ренденринга таких greedy чанков обязательно нужен шейдер и особый формат вершин. В итоге, greedy meshing почти не дал буста.