[英]Optimizing this OpenGL rendering algorithm
我的游戏从VBO绘制了一系列多维数据集,并且每次都转换为多维数据集的位置:
...
SetCameraMatrix();
SetFrustum();
//start vbo rendering
glEnableClientState(GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 1);
glVertexPointer(3, GL_FLOAT, 0, 0);
glColor3f(1,0.5,0);
for(int i = 0; i < collids.size(); ++i)
{
glColor3f(collids[i]->Color.x,collids[i]->Color.y,collids[i]->Color.z);
collids[i]->render();
}
//end vbo rendering
glDisableClientState(GL_VERTEX_ARRAY); // disable vertex arrays
glBindBufferARB(GL_ARRAY_BUFFER_ARB,0);
...
render()是这样的:
void CBox::render()
{
glPushMatrix();
glTranslatef(center.x,center.y,center.z);
glDrawArrays(GL_QUADS, 0, 24);
glPopMatrix();
}
有办法优化吗? 由于我一直在画同样的东西,我该怎么做才能减少CPU的使用强度? 谢谢
有许多可能的优化。 我认为我会立即采用的一种方法是避免每次都推/弹出矩阵,这可能非常耗时。 由于您只是翻译,因此您可以跟踪上一次翻译,并且只需相对移动即可。 用伪代码:
glPushMatrix()
Point3D offset(0,0,0)
for box in collids:
glTranslatef(box.x + offset.x, box.y + offset.y, box.z + offset.z)
draw_cube()
offset -= (box + offset)
glPopMatrix()
一个警告:尽管OpenGL内部仅使用32位浮点数(在大多数实现中),但最好使用双精度浮点数存储偏移量,以减少舍入误差的累积。
(编辑以修正偏移量的计算。)
您可以在单个VBO中烘烤所有多维数据集,并且仅绘制一个(但是几何图形必须确实是完全静态的)
您可以使用实例化
但是只有这么小的几何形状,您无能为力。
如果您有很多立方体,则最大的问题将是绘制调用的数量。 图形卡以惊人的速度穿过三角形,瓶颈通常是驱动程序进行通信的驱动程序。 通常,您拨打的电话越少,通话速度就会越快。
考虑到这一点,即使您的几何图形是动态的,也最好将所有内容都放入一个数组中。 更新所有已移动的多维数据集的几何图形(如有必要,将其全部更新),然后一次性将其全部发送出去。 使用VBO更新几何可能涉及一些工作,但我实际上并未尝试过,但是即使您只是使用旧的时尚顶点数组,它也应该比当前设置快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.