Я работаю над небольшой компьютерной игрой на основе плитки / спрайтов с командой людей, и у нас возникают проблемы с производительностью. Последний раз, когда я использовал OpenGL, был где-то в 2004 году, я учил себя, как использовать основной профиль, и я немного запутался.
Мне нужно рисовать около 250-750 48x48 плиток на экране каждый кадр, а также около 50 спрайтов. Плитки изменяются только при загрузке нового уровня, а спрайты все время меняются. Некоторые из плиток состоят из четырех частей 24х24, и большинство (но не все) спрайтов имеют тот же размер, что и плитки. Многие тайлы и спрайты используют альфа-смешение.
Прямо сейчас я делаю все это в непосредственном режиме, который я знаю, это плохая идея. Тем не менее, когда один из членов нашей команды пытается запустить его, он получает очень плохую частоту кадров (~ 20-30 кадров в секунду), и это намного хуже, когда есть больше плиток, особенно когда много таких плиток являются такими, которые режутся на кусочки. Все это заставляет меня думать, что проблема заключается в количестве колл-вызовов.
Я подумал о нескольких возможных решениях этого, но я хотел, чтобы ими руководили некоторые люди, которые знают, о чем они говорят, поэтому я не трачу свое время на что-то глупое:
ПЛИТКА:
- Когда уровень загружен, нарисуйте все плитки один раз в буфере кадров, прикрепленном к большой сигнальной текстуре, и просто нарисуйте большой прямоугольник с этой текстурой на каждом кадре.
- Поместите все плитки в статический буфер вершин, когда уровень загружен, и нарисуйте их таким образом. Я не знаю, есть ли способ рисовать объекты с разными текстурами с помощью одного вызова glDrawElements, или я хотел бы это сделать. Может быть, просто положить все плитки в большую гигантскую текстуру и использовать забавные текстурные координаты в VBO?
спрайты:
- Нарисуйте каждый спрайт с отдельным вызовом glDrawElements. Кажется, это связано с переключением текстур, что, как мне сказали, плохо. Полезны ли здесь массивы текстур?
- Как-нибудь использовать динамическое VBO. Тот же вопрос текстуры, что и в пункте 2 выше.
- Точечные спрайты? Это, наверное, глупо.
Являются ли какие-либо из этих идей разумными? Есть ли хорошая реализация, где я мог бы посмотреть?