Я разрабатываю Live Wallpaper, используя OpenGL ES 3.0. Я установил в соответствии с отличным учебником по адресу http://www.learnopengles.com/how-to-use-opengl-es-2-in-an-android-live-wallpaper/, адаптировав GLSurfaceView и используя его в Live Wallpaper.Профилирование GPU для Android - OpenGL Live Wallpaper медленный
У меня есть хорошее знание лучших практик OpenGL/GLSL, и я создал простой конвейер рендеринга, где цикл ничьей настолько плотный, насколько это возможно. Нет перераспределений, используя один статический VBO для не изменяющихся данных, динамический VBO для обновлений, используя только один вызов рисования, без разветвления в шейдерах и так далее. Я обычно получаю очень хорошую производительность, но, по-видимому, случайные, но повторяющиеся времена, частота кадров падает.
Профилирование с помощью экранных стержней дает мне интервалы, когда желтая полоса («ожидая завершения команд») отстреливается и занимает все выше критического порога 60fps.
Я прочитал какие-либо ресурсы по профилированию и интерпретации этих цифр я могу получить мои руки, в том числе хорошо углубленные SO question here. Однако основной вывод из этого вопроса заключается в том, что желтая полоса указывает время, проведенное на , ожидая завершения операций блокировки и для зависимостей кадров. Я не верю, что у меня есть что-то из этого, я просто рисую все в каждом кадре. No reading.
Мой вопрос очень важен - , но я хотел бы знать, что может привести к снижению такого уровня кадров и как двигаться вперед в решении проблемы.
Вот некоторые детали, которые могут или не могут иметь влияние:
- Я рендеринга на спрос, onOffsetsChanged является триггером (визуализироваться при загрязнен).
- Существует одна текстура (созданная и связанная только один раз), 1024x1024 RGBA. Замена одного вызова texture2D простым vec4, похоже, помогает удалить некоторые капли частоты кадров. Уменьшение размера текстуры до 512x512 ничего не делает для производительности.
- Шейдеры не сложны, и, как указано выше, не содержат разветвлений.
- В сцене мало данных. Есть только ~ 300 вершин и одна текстура.
- Systrace не обнаруживает подозрительных методов - связанные с GL методы, такие как совокупность буфера и государственные вызовы, не находятся в верхней части списка.
Update: В качестве эксперимента, я пытался оказать только каждый второй кадр, не просит вынести все onOffsetsChanged (проведите пальцем влево/вправо). Это было ужасно для внешнего вида, но почти полностью избавилось от желтых пятен. Это, кажется, говорит мне, что делать 60 запросов на фрейм слишком много, но я не могу понять, почему.
Вы пробовали соотнесение с частотами cpu/gpu? Android очень хочет использовать как можно меньше энергии. – danjo133
@ danjo133 нет, у меня нет. У вас есть хорошие ресурсы для изучения этого? Я раньше не общался с этими концепциями! –