glFlush,glFinish和SwapBuffers用法

转载 2015年07月09日 14:18:54

OpenGL 绘图的机制是:先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的绘图上下文 Device Context (简记为 DC)。要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。

      glFlush:将GL命令队列中的命令发送给显卡并清空命令队列,发送完立即返回;glFlush()就是强制刷新,OpenGL是使用一条渲染管线线性处理命令的,一般情况下,我们提交给OpenGL的指令并不是马上送到驱动程序里执行的,而是放到一个缓冲区里面,等这个缓冲区满了再一次过发到驱动程序里执行;很多时候只有几条指令是填充不满那个缓冲区的,就是说这些指令根本没有被发送到驱动里,所以我们要调glFlush来强制把这些指令送到驱动里进行处理。

      glFinish:将GL命令队列中的命令发送给显卡并清空命令队列,显卡完成这些命令(也就是画完了)后返回。

      因此,在绘图命令比较冗长的情况下,可以分段调用 glFlush 以清空命令队列并让显卡开始先执行这些命令,最后调用glFinish来同步。举个例子:我的渲染器一共有9种shader,渲染时从shader0一直渲染到shader8,以前是在所有shader渲染完成后才调用glFinish(注意:这里如果把glFinish换成glFlush,那么调用wglSwapBuffer的时候在不同的平台上会产生不同的结果,具体结果我也不清楚,个人感觉好像没什么问题,但是游戏的时钟系统会被扰乱——最明显的就是帧速算错),那么CPU就要等GPU绘图,浪费了大把大把的时间;现在改成每个shader完成后调用一次glFlush,强制GPU开始执行命令队列中的GL命令,最后调用glFinish等待GPU完成当前帧渲染,然后调用wglSwapBuffer调换前后缓存。

      这里就会发现这样一件事情:无论如何,都要等glFinish返回了,如果GPU绘制需要比较多的时间,那么CPU在这里等待的时间就比较可观了,如何提高CPU效率呢?个人认为有两个办法:

      1、使用多线程。将更新和渲染作为线程A,辅助性计算如AI策略、地图生成作为线程B。那么当线程A因为glFinish阻塞时,线程B便可以利用CPU进行计算。

      2、使用CPU时间预算方法。即先给出一帧所需要的时间预算,在调用glFinish之前判断是否还有多的时间预算,若有多,则先作辅助计算,完成或超过预算时间后才调用glFinish(若此时GPU已经完成命令,就不需要等待了)。

     对于SwapBuffers,SwapBuffer命令只是把前台和后台的缓冲区指针交换一下而已也就是把前台的内容变成后台缓冲的内容,把后台的缓冲内容换到了前台这个函数它本身并不对换过来的成为了后台的buffer做清理工作,所以每帧都glClear一次,然后再绘制,而后再SwapBuffers。

glFinish和glFlush的区别帧率

通常情况下,OpenGL指令不是立即执行的。它们首先被送到指令缓冲区,然后才被送到硬件执行。glFinish和glFlush都是强制将命令缓冲区的内容提交给硬件执行。 一、glFin...
  • coloriy
  • coloriy
  • 2017年12月01日 10:37
  • 39

opengl SwapBuffers的等待,虚伪的FPS

转自:http://www.zwqxin.com/archives/opengl/swapbuffers-fps-vsync.html   FPS在实时渲染中扮演着一个重要的角色,也许你会去笑一个不懂...
  • smilestone322
  • smilestone322
  • 2016年05月04日 18:48
  • 2242

OpenGL仿作橡皮筋技术

算是精仿吧,毕竟不一样,少了第二次点鼠标左键确认绘图,这个可以加上的: #include #include #include using namespace std ; #pragma c...
  • z8110
  • z8110
  • 2016年12月26日 10:43
  • 541

Mali GPU OpenGL ES 应用性能优化--基本方法

1. 常用优化工具 2. 常用优化点      OpenGL ES优化的主要工作是在图形管道中找到影响性能的bottleneck,其bottleneck一般表现在以下几方面:      • 在...
  • MyArrow
  • MyArrow
  • 2013年12月26日 15:21
  • 11531

OpenG利用glreadPixel实现截屏功能

实现代码如下: #include #include #include #include #include #include using namespace std; #define B...
  • ganpengjin1
  • ganpengjin1
  • 2014年09月18日 23:33
  • 3166

OpenGL 绘制二维图形

OpenGL 绘制二维图形 注:本文程序建立在OpenGL MFC单文档环境配置 在讲解绘制图形之前,先分享一下我在绘制图形的过程中,遇到的一个问题...
  • MissXy_
  • MissXy_
  • 2017年07月23日 19:53
  • 541

java this 3种常见用法 详解

this 关键字 1.区分成员变量和局部变量 2.代表当前对象 3.构造器之间调用
  • u012176204
  • u012176204
  • 2017年01月17日 09:41
  • 3045

关键字enum的用法

关键字enum的用法小结
  • A09211008
  • A09211008
  • 2014年06月16日 09:15
  • 1224

C/C++中*和&的用法

在C++中*与&的用法的简单总结。
  • caozixuan98724
  • caozixuan98724
  • 2017年06月17日 23:27
  • 4457

QT显示框架嵌入Vs控制台工程

一、一些准备工作:           1.安装Qt for VS 的插件;         安装Qt for VS 的插件         安装Qt 4.8.06  2.进行一些设置:    ...
  • wishchin
  • wishchin
  • 2015年12月03日 16:46
  • 1335
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:glFlush,glFinish和SwapBuffers用法
举报原因:
原因补充:

(最多只允许输入30个字)