繁体   English   中英

使用数组而非缓冲区加载Android OpenGL ES 2.0纹理

[英]Loading Android OpenGL ES 2.0 textures using an array, not a Buffer

这个问题类似于如何解决Buffer.put()和Android OpenGL的性能问题,但是我问这个问题是因为:

  • 稍有不同-我的问题是纹理,而不是顶点缓冲区
  • 尽管问题很明确,但似乎大多数答案都没有抓住重点
  • 问题是3岁,也许有什么新东西可以解决我的问题
  • 这是一个问题,真让我感到惊讶……我觉得我一定是误会了。

无论如何,我在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本机代码接口无关
  • 在另一个线程上进行工作。 但是我不知道这是否会在产生纹理内容的线程和调用glTexImage2D的GL线程之间引起争用问题。 无论如何,在逻辑上不必要时,仍然需要额外的CPU周期来复制内存。

如果只有一个采用int []或其他数组类型而不是Buffer的GLES20.glTexImage2D版本,我似乎就不会成为问题。

Android中的Buffer可以由数组支持。 这意味着缓冲区实际上只是包装了数组,对数组的修改反映在缓冲区中。

http://developer.android.com/reference/java/nio/Buffer.html#array()

您可以按照此网站上的代码在字节数组周围创建ByteBuffer

http://examples.javacodegeeks.com/core-java/nio/bytebuffer/convert-between-bytebuffer-and-byte-array/

您会发现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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM