【问题标题】:Loading Android OpenGL ES 2.0 textures using an array, not a Buffer使用数组而不是缓冲区加载 Android OpenGL ES 2.0 纹理
【发布时间】:2013-07-31 19:55:03
【问题描述】:

这个问题类似于How to get around the performance issues with Buffer.put() and Android OpenGL,但我问它是因为:

  • 略有不同 - 我的问题是纹理,而不是顶点缓冲区
  • 虽然问题很清楚,但似乎大多数答案都没有抓住重点
  • 这个问题已经存在 3 年了,也许有新的东西可以解决我的问题
  • 我真的很惊讶这是一个问题......我觉得我一定是误解了一些东西。

无论如何,我在 Android 上使用的是 OpenGL ES 2.0。我有一个大纹理(比如 1024x1024),必须随每一帧更新。没有办法绕过这个 AFAIK - 纹理的内容本质上是一个视频。

问题在于 Android Java 接口使用 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) 

是一个缓冲区,而不是byte[]int[]

因此,我必须将内容生成到 int[] 中,然后调用 IntBuffer.put( ) 对于整个巨大的数组。 Traceview 和在调用前后对 System.nanoTime() 的调用表明,这会占用大量 CPU,这不足为奇。

如何解决这个问题?我尝试使用 IntBuffer.array() 将内容作为数组获取,但是

  • array() 对分配有IntBuffer.allocateDirect() 的缓冲区的调用不成功
  • glTexImage2D() 调用不适用于分配有IntBuffer.allocate() 的缓冲区

我能想到的其他事情:

  • 从本机代码调用 glTexImage2D,我认为这不是 Android GL 本机代码接口的问题
  • 在另一个线程上执行工作。但我不知道这是否会导致产生纹理内容的线程和调用 glTexImage2D 的 GL 线程之间出现争用问题。无论如何,当逻辑上没有必要时,复制内存仍然需要额外的 CPU 周期。

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

【问题讨论】:

    标签: java android performance opengl-es opengl-es-2.0


    【解决方案1】:

    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/

    【讨论】:

    • 我根据您提供的链接将其标记为答案(谢谢!)您提到的 Buffer.array() 方法的问题是 glTexImage2D() 不喜欢使用 allocate( ) - 仅 allocateDirect()。并且 ByteBuffer.array() 不适用于使用 allocate() 创建的缓冲区。但是,从您提供的链接中,我发现 first 创建一个数组,然后 then 使用 ByteBuffer.wrap() 创建 ByteBuffer 似乎可行。这是令人惊讶的,因为从 wrap() 返回的 ByteBuffer 不是“直接”缓冲区……所以我担心以后会爆炸。
    【解决方案2】:

    你会发现 glTexImage2D() 太慢了,无法从实时视频中加载帧。 为此,您应该使用本文所述的 EGL 图像扩展和 EGL_NATIVE_BUFFER_ANDROID:

    http://software.intel.com/en-us/articles/using-opengl-es-to-accelerate-apps-with-legacy-2d-guis

    另外,看看 TextureView 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多