У меня очень простое приложение, которое отображает квадрат с opengl, входные данные считываются с помощью GLSurfaceView, а последняя позиция обменивается с потоком рендеринга с использованием изменчивой переменной.В чем причина (ы) задержки ввода/отображения в андроиде?
То, что я наблюдаю (а также было хорошо описано в https://www.mail-archive.com/[email protected]/msg235325.html), заключается в том, что между положением касания и дисплеем существует задержка (задержка).
При активации опции для разработчиков, чтобы показать позицию прикосновения, я вижу, что при быстром движении:
круга отслеживание сенсорного положения, показанном в системе 1 см отсроченных по сравнению с моим положением пальца. Я предполагаю, что это зависит от системы/оборудования и не может быть исправлено приложением.
но движение, сделанное в моем приложении, также откладывается на 1 см после круга отладки. Так что на практике задержка вдвое больше, чем может быть.
Когда движение пальца замедляется, конечная позиция чертежа останавливается и текущее положение касания синхронизируется. Точно так же, как показано в этом видео (ссылка найдена в обсуждении выше) http://www.youtube.com/watch?v=fWZGshsXDhM
По-прежнему я не знаю, что вызывает вторую задержку, я назначил время обмена позиции из onTouchEvent на поток рендеринга, и это только несколько мс. Рендеринг происходит с частотой 18 мс.
Я попытался использовать скорость, чтобы сократить время задержки, предсказав положение 18 мс, но это не изменило восприятие задержки.
Есть ли у кого-то объяснение такого рода задержки? Это связано с системными слоями, прежде чем получить доступ к нему в onTouchEvent? В случае с я не видел никакого способа исправить это.
Не было никакого конкретного ответа в группе google. Также меня беспокоит то, что в потоке упоминается, что задержка исчезает с использованием canva вместо OpenGL. Что вызывает больше вопросов, на которые он отвечает.
Это входная латентность, классическая проблема, связанная с асинхронной работой CPU/GPU. Большинство реализаций GL будут принимать и возвращаться из команд независимо от того, являются ли они полными или нет, и это может привести к тому, что команды с несколькими кадрами будут стоять в очереди в любой момент времени. Прежде чем команды, полученные из пользовательского ввода, пробиваются к окончательному отображаемому изображению, все остальные команды в очереди должны заканчиваться первым. Кроме того, действительно ли дисплей вашего устройства работает с частотой обновления или 55,5 Гц, или вы произвольно выбрали 18 мс в качестве вашего интервала обновления? –
Вы можете выпустить 'glFinish (...)' в стратегических точках, чтобы уменьшить количество «рендеринга», но вы как бы нарушаете современный принцип проектирования компьютерной графики в реальном времени ..., который должен поддерживать Процессор и графический процессор работают асинхронно. Это кратко обсуждается [здесь] (http://www.opengl.org/wiki/Swap_Interval#GPU_vs_CPU_synchronization). –
@ Поведение Andon Tbe выглядит так, как вы описали: как будто кадр был поставлен в очередь. Следуя вашему предложению, я попытался вызвать glFinish и glFlush, но это не изменило поведения. Время в 18 мс - среднее, я просто его измеряю. – yves