Как синхронизировать собственный рендеринг OpenGL при использовании виджета текстуры flutter на Android

#android #flutter #egl

#Android #flutter #egl

Вопрос:

Я использую виджет текстуры, отображающий его содержимое из собственного кода с использованием OpenGL ES. В машинном коде я вызываю ANativeWindow_fromSurface и из этого создаю поверхность EGL. AIUI, что происходит:

  • ANativeWindow Представляет сторону производителя очереди буфера.
  • Вызов eglSwapBuffers вызывает отправку текстуры в эту очередь.
  • Flutter получает текстуру и отображает ее с помощью Skia при TextureLayer рисовании.
  • Текстура масштабируется в соответствии с размером TextureLayer (масштабирование происходит в AndroidExternalTextureGL::Paint() ).

Я пытаюсь выяснить, как синхронизировать рендеринг OpenGL. Я думаю, что могу использовать choreographer для синхронизации с display vsync, но мне неясно, какую задержку вводит этот механизм bufferqueue-then-render-with-skia. Я не вижу никаких средств для явной синхронизации генерации текстур моего собственного кода с TextureLayer их рисованием.

Масштабирование представляется особенно сложным аспектом. Я хотел бы полностью избежать этого, убедившись, что текстуры, генерируемые машинным кодом, всегда имеют правильный размер. Однако, похоже, нет никакой прямой связи между размером TextureLayer и размером Surface / ANativeWindow. Я мог бы использовать SizeChangedLayoutNotifier (или один из различных альтернативных хаков) для обнаружения изменений размера и передачи их в машинный код, но я думаю, что это будет отставать как минимум на кадр, поэтому масштабирование все равно будет происходить при изменении размера.

Я обнаружил эту проблему, в которой говорится об аналогичных проблемах с изменением размера, но в контексте использования веб-представления OEM. Я не понимаю подробного предложения Hixie по этому вопросу, но, похоже, оно специфично для встраивания представлений OEM, поэтому я не думаю, что это поможет в моем случае.

Возможно, использование виджета текстуры здесь — неправильный подход. Похоже, он предназначен в основном для отображения таких вещей, как видео и превью камеры. Есть ли другой способ разместить изначально отображаемую интерактивную графику OpenGL во Flutter?

Комментарии:

1. Возможно, связано: проблема с флаттером: поддержка привязок OpenGL для iOS и Android #64882