Преобразование из GLSurfaceView в TextureView (через GLTextureView)

Когда был выпущен Android 4.0 (Ice Cream Sandwich), в sdk. Этот вид - TextureView. В документации говорится, что TextureView можно использовать для отображения содержимого сцены OpenGL.

Когда вы посмотрите, как это сделать, вы найдете ссылку на один из примеров.

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/U5RXFGpAHPE

Однако я хотел просто заменить GLSurfaceView на TextureView, а остальную часть моего кода оставить прежним и просто получить преимущества TextureView.


person William Goodale    schedule 21.08.2012    source источник
comment
FWIW, source.android.com/devices/graphics/architecture.html описывает как GLSurfaceView и TextureView сравниваются на системном уровне и каковы компромиссы между ними.   -  person fadden    schedule 21.05.2014


Ответы (4)


Ответ:

1) Начните с исходного кода GLSurfaceView, назовите файл GLTextureView.java

2) Измените заголовок на: GLTextureView extends TextureView реализует SurfaceTextureListener.

3) Переименуйте конструкторы в GLTextureView. Удалите код из метода init ().

4) Организуйте импорт. Всегда выбирайте вариант, отличный от GLSurfaceView.

5) Найдите каждый экземпляр SurfaceHolder и измените его на SurfaceTexture.

6) Добавьте нереализованные методы для SurfaceTextureListener, каждый метод должен быть следующим:

  • onSurfaceTextureAvailable - surfaceCreated (поверхность)
  • onSurfaceTextureDestroyed - surfaceDestroyed (поверхность), (вернуть истину)
  • onSurfaceTextureSizeChanged - surfaceChanged (поверхность, 0, ширина, высота)
  • onSurfaceTextureUpdated - requestRender ()

7) Должна быть одна строка, в которой выполняется вызов getHolder (), измените ее на getSurfaceTexture ()

8) В методе init () поместите следующую строку setSurfaceTextureListener(this)

Затем добавьте OnLayoutChangeListener и пусть он вызовет surfaceChanged(getSurfaceTexture(), 0, right - left, bottom - top).

После этого вы сможете заменить свой код GLSurfaceView на GLTextureView и получить преимущества GLTextureView. Также убедитесь, что ваше приложение поддерживает аппаратное ускорение и что ваш модуль рендеринга расширяет GLTextureView.Renderer.

person William Goodale    schedule 21.08.2012
comment
Добавление к ответам Робина и Уильяма: этот метод работает во всех случаях, когда вы хотите преобразовать SurfaceView в TextureView. - person Edison; 22.04.2013
comment
Можно ли разместить такой пример? Я нашел это: github.com / eaglesakura / gltextureview / blob / master / GLTextureView / Это похоже на метод, который вы описываете? - person Martijn Mellens; 14.08.2013
comment
Обратите внимание: хотя этот ответ действительно работает, вы не хотите выполнять последний шаг пункта 5, то есть onSurfaceTextureUpdated - requestRender(). В этой строке onDrawFrame вызывается постоянно, даже если для режима рендеринга установлено значение RENDERMODE_WHEN_DIRTY. Без него RENDERMODE_WHEN_DIRTY ведет себя должным образом. - person iTwenty; 07.11.2014
comment
@William Goodalte Не могли бы вы взглянуть на эту ветку? stackoverflow.com/questions/32482565/ - person Kaidul; 09.09.2015
comment
На некоторых версиях Android это будет максимально быстро - ›1000 кадров в секунду! Чтобы ограничить частоту кадров, используйте RENDERMODE_DIRTY и используйте Choreographer для вызова requestRender (). - person Learn OpenGL ES; 25.11.2015
comment
5) Найдите каждый экземпляр SurfaceHolder и измените его на SurfaceTexture - я не понимаю этого этапа. Например, у меня есть расширенный SurfaceView, который используется для потока, и в нем есть множество настроек для поверхностного держателя. Как их применить к SurfaceTexture? - person Eugene Alexeev; 27.01.2016

Блестяще!

Незначительное дополнение к блестящему ответу мистера Гудейла:

Я думаю, версия 4.1.1 GLSurfaceView была изменена, чтобы избежать рендеринга на поверхности с нулевой шириной / высотой. И, похоже, нет бесплатного уведомления onSurfaceTextureChanged сразу после onSurfaceTextureAvailable.

Если вы начинаете с исходников 4.1.1, onSurfaceTextureAvailable должен читать следующим образом:

public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,
        int height) 
{
    this.surfaceCreated(surface);
    this.surfaceChanged(surface, 0,width,height);
}

В остальном я был готов примерно за пять минут! Спасибо.

person Robin Davies    schedule 23.08.2012

Спасибо мистеру Гудейлу и мистеру Дэвису за ответы!

У меня есть дополнительные сведения о преобразовании GLSurfaceView в GLTextureView. Первый касается режима рендеринга. Как описано там, просто удалите вызов requestRender () в onSurfaceTextureUpdated.

Второй - о
mGLESVersion = SystemProperties.getInt ("ro.opengles.version", ConfigurationInfo.GL_ES_VERSION_UNDEFINED); Просто используйте ссылку, но вам нужен Context для выполнения context.getClassLoader (); Вы можете вызвать версию отражения getInt из init () и сохранить результат в статическом поле sGLESVersion = getInt (getContext (), «ro.opengles.version», ConfigurationInfo.GL_ES_VERSION_UNDEFINED);

И последнее простейшее изменение касается EGLLogWrapper.getErrorString (error); Просто скопируйте getErrorString из источников EGLLogWrapper.

См. Окончательную версию моего преобразования GLSurfaceView в GLTextureView на GitHub Gist

person AndreyICE    schedule 11.12.2014
comment
Я пробовал это на Android 5.0 (с compileSdkVersion 21). Это вылетало, если я пытался сделать GLTextureView прозрачным - я вызвал setEGLConfigChooser(8, 8, 8, 8, 16, 0); and setOpaque(false). Стоит ли мне попробовать вашу суть с каким-либо конкретным compileSdkVersion в градиенте? - person kiranpradeep; 04.03.2015
comment
Вероятно, стоит отметить, что вы можете сделать это без отражения следующим образом: final ActivityManager activityManager = (ActivityManager) c.getSystemService(Context.ACTIVITY_SERVICE); final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); sGLESVersion = configurationInfo.reqGlEsVersion; - person Cara Esten Hurtle; 05.03.2015
comment
Думаю, это просто потому, что конфига не нашлось. Попробуйте setEGLConfigChooser (8, 8, 8, 8, 24, 0); - person AndreyICE; 05.03.2015

Если вы хотите скопировать / вставить готовый класс, я написал его здесь:

GLTextureView

Вы можете вызвать setRenderer (GLSurfaceView.Renderer), как с GLSurfaceView.

person Yervant    schedule 19.10.2015