2014-11-01 2 views
0

У меня есть игра, использующая GLSurfaceView.Renderer обычным способом для рендеринга 3D-графики с OpenGL ES 2.0. Весь код рендеринга находится в пределах метода onDrawFrame(), и когда время выполнения составляет около 24 мс; это легко даст результат 30 FPS. Однако я нахожу, что вызов onDrawFrame() часто вызывается только каждые 50-100 мс, так что общее время onDrawFrame() составляет от 70 до 120 мс, давая в лучшем случае результат 14 FPS.Android onDrawFrame() массивная задержка

Зачем нужно было так долго обращаться к андроиду onDrawFrame()? Читая это на stackoverflow и в других местах, я собираю onDrawFrame() «блокирует» до тех пор, пока GPU не отобразит фрейм, и поэтому я задаюсь вопросом, может ли это быть, что мой рендеринг GPU занимает очень много времени, а не что-то конкретное в Android вызывая задержку?

ответ

0

Да, на основе вашего описания очень вероятно, что рендеринг на графическом процессоре ограничивает частоту кадров.

Представьте свои вызовы OpenGL, отправляющие работу на GPU. После того, как весь код в вашем onDrawFrame() завершен, это означает, что весь ваш рендеринг был , представленный на GPU. Но это не значит, что GPU завершил работу. Это может занять довольно много времени, в зависимости от количества и сложности работы, которую вы представили.

В Android система попытается перерисовать на частоте обновления дисплея, которая обычно составляет 60 Гц. Но если GPU не может производить 60 кадров в секунду, потому что ваш рендеринг слишком сложный, не имеет смысла продолжать вызывать ваш метод onDrawFrame() 60 раз в секунду. Это приведет к тому, что все больше задач GPU будет поставлено в очередь, что приведет к увеличению количества системных ресурсов, используемых для ожидающих команд GPU, и увеличению задержки между вашим кодом, вызывающим вызовы рендеринга, и результатом, появляющимся на дисплее.

Чтобы избежать этого нежелательного поведения, система будет дросселировать вызовы на onDrawFrame() до точки, где графический процессор может не отставать от рендеринга создаваемых вами кадров. Это может позволить вам получить 1 или 2 кадра перед тем, что уже завершил GPU, но затем блокируется до тех пор, пока GPU не завершит достаточную работу, прежде чем попросить вас сделать еще один кадр.

Смежные вопросы