转载  http://blog.csdn.net/xiajun07061225/article/details/7756187

通常情况下,OpenGL指令不是立即执行的。它们首先被送到指令缓冲区,然后才被送到硬件执行。glFinish和glFlush都是强制将命令缓冲区的内容提交给硬件执行。

一、glFinish()函数


OenGL手册上关于glFinish:

Name
glFinish — block until all GL execution is complete

C Specification
void glFinish(void);

Description

glFinish does not return until the effects of all previously called GL commands are complete. Such effects include all changes to GL state, all changes to connection state, and all changes to the frame buffer contents.

Notes
glFinish requires a round trip to the server.

Errors
GL_INVALID_OPERATION is generated if glFinish is executed between the execution of glBegin and the corresponding execution of glEnd.

glFinish()将缓冲区的指令立即送往硬件执行,但是要一直等到硬件执行完这些指令之后才返回。

如果直接绘制到前缓冲,那么在你想保存屏幕截图之前,就需要调用这个函数,确保绘制完毕。

如果使用双缓冲,则这个函数不会有太大作用。

二、glFlush()


Name
glFlush — force execution of GL commands in finite time

C Specification
void glFlush();

Description

Different GL implementations buffer commands in several different locations, including network buffers and the graphics accelerator itself. glFlush empties all of these buffers, causing all issued commands to be executed as quickly as they are accepted by the actual rendering engine. Though this execution may not be completed in any particular time period, it does complete in finite time.

Because any GL program might be executed over a network, or on an accelerator that buffers commands, all programs should call glFlush whenever they count on having all of their previously issued commands completed. For example, call glFlush before waiting for user input that depends on the generated image.

Notes
glFlush can return at any time. It does not wait until the execution of all previously issued GL commands is complete.

Errors
GL_INVALID_OPERATION is generated if glFlush is executed between the execution of glBegin and the corresponding execution of glEnd.

glFlush()清空缓冲区,将指令送往缓硬件立即执行,但是它是将命令传送完毕之后立即返回,不会等待指令执行完毕。这些指令会在有限时间内执行完毕。

如果直接绘制到前缓冲,那么OpenGL的绘制将不会有任何延迟。设想有一个复杂的场景,有很多物体需要绘制。当调用glFlush时,物体会一个一个地出现在屏幕上。但是,如果使用双缓冲,这个函数将不会有什么影响,因为直到交换缓冲区的时候变化才显现出来。

如果你使用的是双缓冲,那么可能这两个函数都不需要用到。缓冲区交换操作会隐式将命令送去执行。

三、glFinish和glFlush的区别


看起来这两个函数很相似,但是仍然是有区别的。

一般,使用glFlush的目的是确保在调用之后,CPU没有OpenGL相关的事情需要做-命令会送到硬件执行。调用glFinish的目的是确保当返回之后,没有相关工作留下需要继续做。

glFinish会造成性能下降

如果调用glFinish,通常会带来性能上的损失。因为它会是的GPU和CPU之间的并行性丧失。

一般,我们提交给驱动的任务被分组,然后被送到硬件上(在缓冲区交换的时候)。如果调用glFinish,就强制驱动将命令送到GPU。然后CPU等待直到被传送的命令全部执行完毕。这样在GPU工作的整个期间内,CPU没有工作(至少在这个线程上)。而在CPU工作时(通常是在对命令分组),GPU没有工作。因此造成性能上的下降。

因此,应该尽量减少使用此函数。此函数的一个应用是:调试bug。如果我传输到硬件的某条命令造成了GPU的崩溃,找出使得GPU崩溃的那条指令的简单方法是在每个绘制操作之后调用这个函数。这样就可以准确找出造成崩溃的命令。

另外,Direct3D不支持Finish概念。

【OpenGL】glFinish()和glFlush()函数详解相关推荐

  1. OpenGL的glOrtho平行投影函数详解[转]

    glortho函数可以将当前的可视空间设置为正投影空间.基参数的意义如图,如果绘制的图空间本身就是二维的,可以使gluOrtho2D.他的使用类似于glOrtho 原型是: void glOrtho( ...

  2. OpenGL的glRotatef旋转变换函数详解

    OpenGL的glRotatef旋转变换函数详解 先看一下函数定义: void glRotatef(GLfloat angle,  GLfloat x,     GLfloat y,     GLfl ...

  3. glTexImage2D 函数详解

    glTexImage2D 函数详解 参考 https://blog.csdn.net/jeffasd/article/details/78135588 版权 jeffasd glTexImage2D ...

  4. android平台下OpenGL ES 3.0实例详解顶点属性、顶点数组

    OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘 ...

  5. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  6. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  7. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

  8. 【FFmpeg】函数详解(一)

    FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...

  9. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  10. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

最新文章

  1. 【python数据挖掘课程】十.Pandas、Matplotlib、PCA绘图实用代码补充
  2. HYSBZ/BZOJ 1038 [ZJOI2008] 瞭望塔 - 计算几何
  3. 不需要SFU实现WebRTC联播实践
  4. 高效开发iOS系列 -- 那些不为人知的KVC
  5. java runtime类 heap_Java 进阶(一) JVM运行时内存模型
  6. 一个简单的Eclipse调试Debug流程(四)
  7. 计算机硬件配置和软件有哪些,BIM软件对电脑硬件配置有什么要求?
  8. 2021考研初试成绩多少分过线?
  9. 计算机网络rip工作原理,12. 小型网络 RIP 协议工作原理
  10. 【JAVA笔记——器】Spring MVC + HATEOAS RestFul快速搭建
  11. 计算机毕业设计Java校园一卡通管理系统(源码+系统+mysql数据库+Lw文档)
  12. java4android 教程_《Java4Android视频教程》学习笔记(三)
  13. 宿命论,三年前的演讲稿!,怀念那些力不从心的光景。。
  14. 杂记——贝叶斯可信区间与频率置信区间的区别
  15. matlab 求股票斜率,「matlab 求股票斜率」同花顺斜率抓强势股指标公式
  16. tiktok也会像Facebook一样封号吗?哪些行为会封号?
  17. svn: E155019: Can't upgrade as it is not a pre-1.7 work解决办法
  18. python 匹配段落_段落匹配Python
  19. Ping32最新版支持钉邮监控
  20. 超图结构到底比图结构好在哪里?????

热门文章

  1. 【OUTLINE】使用Oracle Outline技术暂时锁定SQL的执行计划
  2. java基础--ObjectInputStream和ObjectInputStream类
  3. 2012-12-17 → 2013-01-20 周总结:五周没写周总结了,今天来总结下
  4. Google 浏览器(2011)书签同步
  5. Castle IOC容器构建配置详解(二)
  6. 3月9日 英语笔记-英标
  7. Mysql优化(出自官方文档) - 第九篇(优化数据库结构篇)
  8. 新手学JavaScript都要学什么?
  9. 用原生js做单页应用
  10. python_类装饰器