首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glMapBufferRange()在Android/Java上的安全使用

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

Stack Overflow用户
提问于 2015-04-28 21:46:23
回答 1查看 2.4K关注 0票数 18

我在Android上使用OpenGL-es3.0中的glMapBufferRange()编写了工作代码,如下所示:

代码语言:javascript
复制
  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()declared to return a Buffer

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

在我的测试平台上,这个函数会返回ByteBuffer的一个子类,所以强制转换可以正常工作,但是在支持OpenGL-ES 3+的所有平台或安卓版本上做这样的假设似乎并不安全。尽管这看起来很合理,但我还没有找到任何文档来保证它,而且如果它得到了保证,似乎应该将该函数声明为返回ByteBuffer

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-29 10:50:50

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

如果查看glMapBufferRange.cpp文件中的glMapBufferRange()的JNI包装器的实现,就会发现缓冲区是通过调用名为NewDirectByteBuffer()的函数来分配的。基于此,似乎可以安全地假设缓冲区确实是一个ByteBuffer

虽然供应商可以更改Android代码,但似乎任何人都不太可能更改Java绑定的行为(可能只是为了修复bug)。如果您担心在以后的Android版本中实现可能会发生变化,那么您当然可以使用标准的Java类型检查:

代码语言:javascript
复制
Buffer buf = glMapBufferRange(...);
ByteBuffer byteBuf = null;
if (buf instanceof ByteBuffer) {
    byteBuf = (ByteBuffer)buf;
}

或者,您可以使用更复杂的反射,首先在返回的缓冲区上调用getClass()。下一个问题当然是,如果返回的缓冲区不是ByteBuffer,该怎么办。对我来说,这是唯一有意义的类型。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29921348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档