确定发送到 VBO 的数据限制
Determine limit for data sent to VBO?
我正在为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 位)作为索引的数据类型,因此如果您使用的是索引数组,则超出了该限制。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 如何在顶点着色器中使用VBO数据作为位置数据,在片段着色器中使用统一数据作为颜色数据
- 如何告诉 VBO 处理给定的数据?(布料模拟)
- 将 OpenGL VBO 与自定义类/数据结构一起使用
- 为什么VAO可以使用VBO数据绑定它?
- 确定发送到 VBO 的数据限制
- OpenGL VBO数据似乎已损坏
- VAO/VBO管理-更改所有VBO数据
- 仅修改VBO缓冲区数据的特定元素类型