Я працюю над невеликою комп'ютерною грою на основі плитки / спрайта з командою людей, і ми стикаємося з проблемами продуктивності. Останній раз, коли я використовував OpenGL, був близько 2004 року, тому я вчив себе, як використовувати основний профіль, і я вважаю себе трохи розгубленим.
Мені потрібно намалювати біля екрану 250-750 плиток 48х48 до екрана кожного кадру, а також, можливо, приблизно 50 спрайтів. Плитка змінюється лише при завантаженні нового рівня, а спрайти змінюються весь час. Деякі з плиток складаються з чотирьох штук 24х24, а більшість (але не всі) спрайтів мають такий же розмір, як і плитки. Багато плиток та спрайтів використовують альфа-змішування.
Зараз я все це роблю в негайному режимі, що я знаю, що це погана ідея. Тим не менше, коли хтось із членів нашої команди намагається запустити його, він отримує дуже погану частоту кадрів (~ 20-30 кадрів в секунду), і це набагато гірше, коли більше плиток, особливо коли багато таких плиток є такі, які нарізати шматочками. Це все змушує мене думати, що проблема полягає в кількості телефонних дзвінків, які здійснюються.
Я думав про декілька можливих рішень цього, але хотів запустити їх деякими людьми, які знають, про що вони говорять, щоб я не витрачав час на щось дурне:
ПЛИТКИ:
- Коли рівень завантажений, намалюйте всі плитки один раз у буфер кадру, прикріплений до великої текстури, і просто намалюйте на кожному кадрі великий прямокутник з такою текстурою.
- Покладіть всі плитки в статичний вершинний буфер, коли рівень завантажений, і намалюйте їх таким чином. Я не знаю, чи є спосіб намалювати предмети з різними текстурами за допомогою одного виклику glDrawElements, чи це навіть щось, що я хотів би зробити. Можливо, просто покладіть всі плитки у велику гігантську текстуру та використовуйте смішні координати текстури у VBO?
СПРИТИ:
- Намалюйте кожен спрайт окремим викликом до glDrawElements. Це, мабуть, передбачає багато переключення текстур, що, як мені кажуть, погано. Чи може тут бути корисними масиви текстур?
- Використовуйте динамічний VBO якось. Питання текстури як номер 2 вище.
- Точкові спрати? Це, мабуть, нерозумно.
Чи є якась із цих ідей розумною? Чи є хороша реалізація десь я могла б переглянути?