OpenGL超级宝典(第7版)之第十二章管线监控
前言
查询命令在图形管线中的执行进程
测量命令执行时间
同步应用程序与OpenGL以及同步多重OpenGL语境
一、查询
简述:查询Opengl执行状态需要创建查询对象,一个对象查一个问题,查询完一个问题必须删除一个查询对象
glGenQueries():生成查询对象
glDeleteQueries():删除查询对象
glGetError():查询上面函数执行的结果
1.遮挡查询
简述:用于对于渲染成本很高的,但可能不会在场景出现的对象
应用:
glBeginQuery(...) #开始计数
RenderSimplifiedObject(object) #渲染低保真对象
glEndQuery(...) #停止计数
glGetQueryObjectuiv(..., &result) #查询绘制结果
if(result != 0)
RenderRealObject(object) #渲染完整对象
由于渲染按管线进行,所以很多命令进行排队处理,并不是每次调用glEndQuery()时,所有像素都生成的,所以要延长查询结果的时间。
由于将渲染命令发送给GPU会有很大的开销,而有些命令要在查询对象有结果时才执行(这总方法叫谓词),所以opengl可以使用条件性渲染工具提前将命令发给GPU,glBeginConditionalRender()和glEndConditionalRender()
高级遮挡查询:提供GL_ANY_SAMPLES_PASSED和GL_ANY_SAMPLES_PASSED_CONSERVATIVE两种布尔型遮挡查询完成查询目标统计通过深度测试的精确样本数量
定时查询:可以使用glQueryCounter()查询在glBeginQuery()和glEndQuery()之间执行命令的操作时间,查询结果用纳秒表示,32位无符号计为略高于4秒的纳秒数,可以使用glGetQueryObjectui64v()查询高于4秒纳秒数的结果
查询管线状态的参数可以看P369页
二、OpenGL同步
使用glFlush()强制Opengl开始处理命令或完成目前已发布的命令
GLsync glFenceSync():创建同步对象
glGetSynciv():查询同步状态,看看是否达到管线终点
glClientWaitSync()和gkWaitSync():等待同步信号
glDeleteSync():删除同步信号
没有机制可以让同步信号重新设置为无信号状态
每个同步对象代表一个一次性事件
本文详细探讨了OpenGL中的查询与同步机制。在查询部分,介绍了如何使用查询对象来检查执行状态,特别是遮挡查询和定时查询的应用。在同步部分,讲解了glFlush()、同步对象的创建与管理,以及等待同步信号的方法。这些内容有助于优化图形管线的性能和效率。
877

被折叠的 条评论
为什么被折叠?



