// V1 通过opengl做动画
for (int cursor = 0; cursor < 100; cursor++)
{
glScale3fv(items[cursor].scaleVar);
items[cursor].single_draw_item();
}
// V2 CPU对顶点进行计算,然后批量绘制
for (int cursor = 0; cursor < 100; cursor++)
{
cpu_scale_vertices(items[cursor].scaleVar);
}
batch_draw_100_items();
当每个item动画个异步执行时,V1的实现item缩放过度依赖于opengl,而且没法实现批处理! V2牺牲点CPU计算性能换来GPU的批量绘制。
改进:cpu_scale_vertices操作可以单独在update线程中执行, batch_draw_100_items在GL绘制线程中。
4)一帧绘制中,FBO不能切换过频繁。做路况渲染中,为每个256*256的瓦片建立一个FBO,FBO直接与纹理关联;每帧可能绘制3-5个瓦片,即进行3-5次FBO切换。实测发现FBO切换开销远大于数据上传OpenGL的开销。
5)一些非常耗性能操作:
通过glReadPixels获取帧缓存区内容,导致GPU中断,效率非常低。网上有一种PBO异步方式获取帧缓存的做法效率不错,适合PC。
通过glCopyTexImage2D将帧缓区内容拷内到纹理,会导致渲染中断,如下图十分耗时。替代做法:将纹理与FBO绑定,直接渲染到纹理,RTT。
大纹理切换开销也十分大,手机端一般别超过1024*1024,不同手机支持纹理最大尺寸可以通过接口查询。
相关阅读:
Ubuntu 13.04 安装 OpenGL
Ubuntu下OpenGL编程基础解析
如何在Ubuntu使用eclipse for c++配置OpenGL