OpenGL ES GL_DEPTH_TEST Проблема производительности

Я пишу игру OpenGL ES 2.0 на C++, работающую на нескольких (мобильных) платформах. На IOS,Android,.. в основном все работает нормально, кроме одного устройства:

Вычисление одного кадра в определенной сцене занимает около 8 мс в HTC Desire. Другое устройство, Samsung Galaxy Nexus, которое намного новее, занимает 18-20 мс.

Я копался в проблеме и обнаружил, что она связана с включением / отключением GL_DEPTH_TEST.

  • если я закомментирую все вызовы glEnable(GL_DEPTH_TEST)/glDisable(GL_DEPTH_TEST), время, необходимое для одного кадра, в Nexus уменьшится до 1-2 мс.
  • поэтому я оптимизировал вызовы glEnable()/glDisable(), чтобы они происходили только тогда, когда это абсолютно необходимо. У меня есть 3D и 2D части в моей сцене, и поэтому мне нужно визуализировать 2d без глубины и 3D с тестом глубины.
  • в настоящее время я включаю тест глубины, рисую 3d, отключаю тест глубины, рисую 2d
  • но все равно вычисление занимает 18-20 мс на нексусе
  • Я также проверил, очищен ли буфер глубины больше, чем нужно. Но это только очищается в начале кадра.

Возможно ли, что переключение проверки глубины занимает столько времени?

У кого-нибудь есть другие идеи, что можно проверить?

ОБНОВИТЬ

Я обнаружил, что 3D-объект, который я рендерил, как-то ответственен за медленные вычисления.

  • Если я удаляю 3d объект, производительность хорошая
  • но тот же 3D-объект используется в другой сцене, не вызывая таких проблем
  • и самая странная вещь: Nexus работает под управлением Android 4.2, и у него есть опция в опциях разработчика, чтобы визуализировать загрузку процессора как наложение. Если я включу этот параметр и начну игру, время вычислений будет 5-6 мс вместо 18-20 мс. Как это может быть связано?

0 ответов

Другие вопросы по тегам