## 6. 索引与缓冲区对象 在之前的章节实例,引擎主循环每执行一次,都需要上传顶点数据到GPU。 这在实际项目中是不可行的,游戏同屏顶点数普遍超过10w,每一帧都上传10w顶点数据到GPU,想想都可怕。 针对性的优化有2点: 减少上传数据量 在GPU上缓存数据 OpenGL分别提供了对应的技术来实现上面的优化,就是顶点索引和缓冲区对象。 CS架构的问题 而当我们再次审视OpenGL这一CS架构设计时,会发现另外一个问题,每个OpenGL API调用都是阻塞的! CPU通知GPU执行一个API,需要等待GPU返回结果后,才能执行下一个API。 那么调用的OpenGL API越多,性能就越差。 每绘制一个物体,都需要调用数个OpenGL API,每一次绘制都在做着重复的事情。
在之前的章节实例,引擎主循环每执行一次,都需要上传顶点数据到GPU。
这在实际项目中是不可行的,游戏同屏顶点数普遍超过10w,每一帧都上传10w顶点数据到GPU,想想都可怕。
针对性的优化有2点:
OpenGL分别提供了对应的技术来实现上面的优化,就是顶点索引和缓冲区对象。
而当我们再次审视OpenGL这一CS架构设计时,会发现另外一个问题,每个OpenGL API调用都是阻塞的!
CPU通知GPU执行一个API,需要等待GPU返回结果后,才能执行下一个API。
那么调用的OpenGL API越多,性能就越差。
每绘制一个物体,都需要调用数个OpenGL API,每一次绘制都在做着重复的事情。
那能不能将多个命令的结果存储在GPU上,然后仅提供一个API给CPU,只需要调用这一个API就可以实现在执行数个命令的效果?
针对这个问题,OpenGL提供了顶点数组对象这一解决方案。
这一章围绕着这几点进行开发实践。