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