[英]Loading Android OpenGL ES 2.0 textures using an array, not a Buffer
这个问题类似于如何解决Buffer.put()和Android OpenGL的性能问题,但是我问这个问题是因为:
无论如何,我在Android上使用OpenGL ES 2.0。 我有一个很大的纹理(例如1024x1024),必须每帧更新一次。 无法避免这种AFAIK-纹理的内容本质上是视频。
问题是Android Java OpenGL的接口使用java.nio.Buffer对象,而不是数组。 特别是的最后一个参数
public static void GLES20.glTexImage2D (int target, int level, int internalformat, int width, int height, int border, int format, int type, Buffer pixels)
是一个Buffer,不是byte[]
或int[]
。
因此,我不必将纹理的内容(针对每个帧)直接生成为可以传递给glTexImage2D
的int [],而必须将内容生成为int [],然后为整个块调用IntBuffer.put()阵列。 Traceview和对调用的System.nanoTime()调用表明,这占用了大量CPU,这并不奇怪。
如何解决这个问题? 我试图使用IntBuffer.array()以数组形式获取内容,但是
IntBuffer.allocateDirect()
分配的缓冲区, array()
调用不会成功 glTexImage2D()
调用不适用于使用IntBuffer.allocate()
分配的缓冲区 我能想到的其他事情:
glTexImage2D
,我认为这与Android GL本机代码接口无关 如果只有一个采用int []或其他数组类型而不是Buffer的GLES20.glTexImage2D版本,我似乎就不会成为问题。
Android中的Buffer
可以由数组支持。 这意味着缓冲区实际上只是包装了数组,对数组的修改反映在缓冲区中。
http://developer.android.com/reference/java/nio/Buffer.html#array()
您可以按照此网站上的代码在字节数组周围创建ByteBuffer
:
您会发现glTexImage2D()太慢,无法从实时视频加载帧。 为此,您应该使用本文所述的EGL图像扩展名和EGL_NATIVE_BUFFER_ANDROID:
http://software.intel.com/en-us/articles/using-opengl-es-to-accelerate-apps-with-legacy-2d-guis
另外,请查看TextureView类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.