android/java上glmapbufferrange()的安全使用

zkure5ic  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(316)

我有工作代码使用 glMapBufferRange() 来自android上的opengl es 3.0,如下所示:

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()ByteBuffer 在第三行。 glMapBufferRange() 声明为返回 Buffer : public static Buffer glMapBufferRange (int target, int offset, int length, int access) 在我的测试平台上,函数返回 ByteBuffer 所以cast是可行的,但是对所有支持opengles3+的平台或android版本进行这种假设似乎并不安全。虽然它看起来很合理,但我还没有找到任何文档来保证它,而且如果它得到了保证,那么似乎应该将函数声明为返回 ByteBuffer .
正确的使用方法是什么(最好有文档支持) Buffer 退回人 glMapBufferRange() ?

tvokkenx

tvokkenx1#

正如你已经发现的,文件是缺乏的。但是仍然有一个相当确凿的参考:opengljava绑定的实现是公共android源代码的一部分。
如果您看一下 glMapBufferRange() ,它位于文件glmapbufferrange.cpp中,您可以看到缓冲区是通过调用名为 NewDirectByteBuffer() . 基于此,可以安全地假设缓冲区确实是一个 ByteBuffer .
虽然供应商可以更改android代码,但似乎不太可能有人会更改java绑定的行为(除了修复bug)。如果您担心在以后的android版本中实现可能会发生变化,那么您当然可以使用标准的java类型检查:

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

或者你可以用更细致的思考,从打电话开始 getClass() 在返回的缓冲区上。下一个问题当然是,如果返回的缓冲区不是 ByteBuffer . 对我来说这是唯一有意义的类型。

相关问题