LWJGL - причина цикли c зависаний? - PullRequest
0 голосов
/ 11 марта 2020

В настоящее время я работаю над 2D-игрой, в которой используется LWJGL, но я столкнулся с некоторыми серьезными проблемами с производительностью. Когда я рендерил более ~ 100 спрайтов, окно зависает в течение очень небольшого промежутка времени. Я провел несколько тестов и обнаружил следующее:

  • Проблема возникает при включении или отключении Vsyn c
  • Проблема возникает, даже если я ограничиваю кадры при 60
  • Программа не просто отображает меньше кадров в течение короткого времени, кажется, что рендеринг фактически делает паузу
  • Нет других операций, таких как Matrix-Calculations, которые замедляют работу программы
  • Я уже реализовал пакетный рендеринг, но, похоже, он не улучшает производительность
  • Частота зависаний увеличивается с увеличением количества спрайтов
  • Обновлен драйвер моей видеокарты
  • Проблема возникает, хотя частота кадров кажется вполне приемлемой, при 100 визуализированных спрайтах одновременно у меня ~ 1500 кадров в секунду, при 1000 спрайтах ~ 200 кадров в секунду

Я использую очень базовые c шейдер, матрицы преобразования передаются шейдеру через одинаковые переменные при каждом вызове рендеринга (один раз на спрайт на кадр). Размер шины CPU / GPU не должен быть проблемой.

Я нашел очень похожую проблему здесь , но ни одно из предложенных решений не работает для меня.

Это мой первый вопрос, пожалуйста, дайте мне знать, если я упускаю какую-то важную информацию.

1 Ответ

0 голосов
/ 18 марта 2020

Это, вероятно, G C.

Java к сожалению, не самый лучший язык для игр благодаря G C и отсутствию каких-либо структур, которые можно выделить в стеке, из языков, подобных Java - c#, часто является лучшим выбором благодаря гораздо большему количеству инструментов для управления памятью, таких как стек allo c и просто структуры в целом. Поэтому при написании игры на языках с G C вы должны убедиться, что ваша игра l oop не выделяет слишком много объектов, во многих случаях на других языках люди часто пытаются go для 0 или около 0 выделений в l oop.
Вы можете создавать пулы объектов для ваших сущностей / спрайтов, поэтому вы не выделяете новые, просто повторно используете существующие.

А если это простая 2D-игра, то, вероятно, достаточно просто избегать выделения объектов, когда в этом нет необходимости (например, пропускать всего два целых вместо места размещения объекта на 2-й карте).

И вы должны использовать профилировщик, чтобы подтвердить, какие изменения того стоят.
Существуют и более хитрые решения, такие как использование памяти, выделенной без кучи, для хранения некоторых данных без накладных расходов на объект, но я не думаю, что Для простой игры понадобятся такие решения. Достаточно просто типичных решений для разработчиков игр, таких как объединение в пул и обход ненужных объектов.

...