OpenGL错误和性能Tips(2)

// 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

OpenGL三维球体数据生成与绘制【附源码】

Ubuntu下OpenGL编程基础解析

如何在Ubuntu使用eclipse for c++配置OpenGL

《OpenGL超级宝典》学习笔记

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/191be0487aac2426b9b94a7051ee594c.html