确定发送到 VBO 的数据限制

Determine limit for data sent to VBO?

本文关键字:数据 VBO      更新时间:2023-10-16

我正在为Playbook编写一个3D应用程序,其中包含PowerVR SGX 540。我注意到,如果我通过opengl在VBO中填充足够的数据,我可能会导致设备崩溃(不仅是应用程序,而是整个设备,需要硬重启)。为了导致崩溃,我发送了一个具有 ~300k 三角形和 ~150k 顶点的模型的数据。我也发送了顶点的正常数据。

我发现如果我发送较少的数据,问题就不会发生(尝试了另一个具有一半三角形和顶点的模型)。此外,如果我使用顶点数组,则不会出现此问题(尽管它非常慢)。

我想知道:

  • 我所看到的是移动硬件的常见结果吗?也就是说,具有 150k 顶点和法线的 300k tri 模型是否矫枉过正?

  • 除了测试一堆不同的模型大小之外,我可以检查有多少内存可用于 VBO 使用(从崩溃中恢复设备需要五分钟)吗?

  • 还有其他原因导致此问题吗?我提供了一些其他信息:

正在将Qt用于我的GUI,并在将3d场景绘制到GUI之前将其绘制到FBO(我还没有检查是否通过创建EGL窗口并绘制到没有UI的情况下重做所有这些内容会重现问题 - 这需要一段时间)。

为了验证不是我用OpenGL

不好,我尝试了对所有3D内容使用原始OpenGL调用,并使用OpenSceneGraph做所有事情。这两种方法都以完全相同的方式失败(VBO 处理较少的数据,顶点数组工作,增加 VBO 数据导致崩溃)。

该程序在我的桌面上运行良好。不幸的是,我没有任何其他移动设备可以测试我的应用程序。

OpenGL ES 仅支持无符号短(16 位)作为索引的数据类型,因此如果您使用的是索引数组,则超出了该限制。