Подтвердить что ты не робот

Преобразование из 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.

4b9b3361

Ответ 1

Ответ:

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

Brilliant!

Небольшое дополнение к г-ну Гудалю блестяще отвечает:

Версия 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);
}

Кроме того, я работал и работал около пяти минут! Спасибо.

Ответ 3

Спасибо г-ну Гудалю и г-ну Дэвису за ответы!

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

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

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

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

Ответ 4

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

GLTextureView

Вы можете вызвать setRenderer (GLSurfaceView.Renderer), например, с помощью GLSurfaceView.