当前位置: 首页 > 面试题库 >

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

缑嘉玉
2023-03-14
问题内容

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()to
ByteBufferglMapBufferRange()被声明为返回一个Buffer

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

在我的测试平台上,该函数返回的子类,ByteBuffer因此强制转换有效,但对于支持OpenGL-ES
3+的所有平台或Android版本进行此假设似乎并不十分安全。尽管看起来很合理,但我还没有找到任何可以保证它的文档,如果可以保证,似乎应该将该函数声明为returning
ByteBuffer

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


问题答案:

如您所知,缺少文档。但是仍然有一个相当确定的参考:OpenGL Java绑定的实现是公共Android源代码的一部分。

如果查看glNIBufferCange.cppglMapBufferRange()文件中JNI包装器的实现,可以看到通过调用名为的函数来分配缓冲区。基于此,可以假定缓冲区确实是一个。NewDirectByteBuffer()``ByteBuffer

尽管供应商可以更改Android代码,但似乎几乎没有人会更改Java绑定的行为(可能是为了修复错误)。如果您担心在更高的Android版本中可能会更改实现,则可以使用标准的Java类型检查:

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

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



 类似资料:
  • 在我的应用程序中,用户可以拍照或向应用程序添加照片。当应用程序尝试在ImageView中显示保存的图像时,我会收到java.lang.SecurityException的崩溃报告 错误所在的线路是 我无法在我的设备或模拟器上复制错误,它们都能很好地显示图像。 我使用的完整代码是 我的设备上显示的日志输出(3个项目,一个没有图像) 项目:测试-已解析:file:///storage/emulated

  • 问题内容: 使用NPM全局安装电子时,试图解决此问题并得到以下错误: 问题答案: 正如npm提议的那样: 通过这样做,您可以将全局npm软件包的范围限制在用户帐户内,而不是在计算机中的所有用户之间共享。即使您是唯一的用户,也建议这样做。:-)

  • 问题内容: 使用HttpURLConnection时,如果我们不“获取”并使用它,是否需要关闭InputStream? 即安全吗? 其次, 在完全读取所有内容之前 关闭InputStream是否安全? 是否存在使基础套接字处于ESTABLISHED或CLOSE_WAIT状态的风险? 问题答案: 在读取所有内容之前关闭InputStream是否安全? 您需要先关闭输入流中的所有数据,然后再关闭它,以

  • 问题内容: 如何使用系统文件中的条目进行实施?我特别想比较来自authorized_keys文件中的公共密钥和Apache SSHD 界面中可用的公共密钥。 问题答案: 令我惊讶的是,那里没有明显的东西。我很好奇,并实现了一种解码文件的方法。这取决于用于Base64解码的Apache Commons Codec。

  • 有一次,我被印上了“祝贺”,有一次,我被印上了“站台”。

  • 问题内容: 在Linux上是否使用线程安全写入stdout ?使用下级命令怎么办? 问题答案: 它不是C标准指定的-取决于您对C标准库的实现。实际上,C标准甚至根本没有提到线程,因为某些系统(例如嵌入式系统)没有多线程。 在GNU实现()中,stdio中处理对象的大多数高级函数都是线程安全的。通常没有名字的(例如)。但是,线程安全性处于每个函数调用级别:例如,如果您多次调用,则保证每个调用都是原子