Я разрабатываю 2D-игру на основе спрайтов для мобильных платформ и использую OpenGL (ну, собственно, Irrlicht) для рендеринга графики. Сначала я реализовал рендеринг спрайтов простым способом: каждый игровой объект визуализируется как квад с собственным вызовом отрисовки в графическом процессоре. Это означает, что если у меня было 200 игровых объектов, я делал 200 вызовов отрисовки на кадр. Конечно, это был плохой выбор, и моя игра была полностью привязана к процессору, потому что при каждом вызове отрисовки графического процессора было связано небольшое количество ресурсов процессора. GPU большую часть времени простаивал.
Теперь я подумал, что могу улучшить производительность, собирая объекты в большие партии и обрабатывая эти партии всего несколькими вызовами отрисовки. Я реализовал пакетную обработку (чтобы каждый игровой объект, имеющий одну и ту же текстуру, отображался в одном пакете) и подумал, что мои проблемы исчезли ... только для того, чтобы выяснить, что у меня частота кадров была даже ниже, чем раньше.
Почему? Ну, у меня есть 200 (или больше) игровых объектов, и они обновляются 60 раз в секунду. Каждый кадр мне приходится пересчитывать новую позицию (перемещение и вращение) для вершин в CPU (GPU на мобильных платформах не поддерживает создание экземпляров, поэтому я не могу сделать это там), и выполняю этот расчет 48000 в секунду (200 * 60 * 4, так как каждый спрайт имеет 4 вершины) просто кажется слишком медленным.
Что я могу сделать, чтобы улучшить производительность? Все игровые объекты движутся / вращаются (почти) в каждом кадре, поэтому мне действительно нужно пересчитать позиции вершин. Единственная оптимизация, о которой я мог подумать, - это таблица поиска поворотов, чтобы мне не пришлось их вычислять. Помогут ли точечные спрайты? Какие-нибудь неприятные хаки? Что-нибудь еще?
Спасибо.