在Android / Java上安全使用glMapBufferRange()

我在Android上使用OpenGL-ES 3.0中的glMapBufferRange()来处理代码,如下所示:

  glBindBuffer(GL_ARRAY_BUFFER, myVertexBufferName); glBufferData(GL_ARRAY_BUFFER, myVertexBufferSize, null, GL_STATIC_DRAW); ByteBuffer mappedBuffer = (ByteBuffer)glMapBufferRange( GL_ARRAY_BUFFER, 0, myVertexBufferSize, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); // [fill buffer...] glUnmapBuffer(GL_ARRAY_BUFFER); 

我的问题是在第三行将glMapBufferRange()的结果向下转换为ByteBufferglMapBufferRange()被声明为返回一个Buffer

public static Buffer glMapBufferRange (int target, int offset, int length, int access)

在我的testing平台上,该函数返回ByteBuffer的子类,以便投射,但是对于支持OpenGL-ES 3+的所有平台或Android版本,这种假设似乎并不安全。 虽然看起来合理,但我还没有find任何保证它的文档,如果它被保证,似乎该函数应该被声明为返回ByteBuffer

使用glMapBufferRange()返回的Buffer的正确方法是什么(最好由文档支持glMapBufferRange()

    Related of "在Android / Java上安全使用glMapBufferRange()"

    正如你已经发现的那样,文档是缺乏的。 但是还有一个相当确凿的参考:OpenGL Java绑定的实现是公共Android源代码的一部分。

    如果您查看glMapBufferRange()的JNI包装的实现,可以通过调用名为NewDirectByteBuffer()的函数来查看缓冲区是否分配。 基于此,假设缓冲区确实是一个ByteBuffer似乎是安全的。

    虽然供应商可以更改Android代码,但似乎很less有人会改变Java绑定的行为(除了可能修复错误)。 如果您担心在以后的Android版本中实现可能会发生变化,您当然可以使用标准的Javatypes检查:

     Buffer buf = glMapBufferRange(...); ByteBuffer byteBuf = null; if (buf instanceof ByteBuffer) { byteBuf = (ByteBuffer)buf; } 

    或者你可以使用更复杂的reflection,从返回的缓冲区调用getClass()开始。 接下来的问题当然是你如果返回的缓冲区不是ByteBuffer 。 这真的是唯一对我有意义的types。