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

一、glFinish()函数

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

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

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

二、glFlush()

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

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

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

三、glFinish和glFlush的区别

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

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

glFinish会造成性能下降

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

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

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

SharpGL中Finish和Flush的区别相关推荐

  1. Activity中finish()和onDestroy()的区别

    finish()方法用于结束一个Activity的生命周期,而onDestory()方法则是Activity的一个生命周期方法,其作用是在一个Activity对象被销毁之前,Android系统会调用该 ...

  2. fileoutputstream路径 android,Android编程中FileOutputStream与openFileOutput()的区别分析

    本文实例分析了Android编程中FileOutputStream与openFileOutput()的区别.分享给大家供大家参考,具体如下: openFileOutput() 首先给大家介绍使用文件如 ...

  3. 页面静态化2 --- 使用PHP缓存机制来完成页面静态化(上)(ob_flush和flush函数区别用法)...

    我们可以使用PHP自带的缓存机制来完成页面静态化,但在这里,需要说明一点,仅靠PHP缓存机制并不能完美的解决页面静态化,往往需要和其他页面静态技术(通常是伪静态技术)结合使用 例子: 当访问一个页面时 ...

  4. Linux中exit与_exit的区别

    在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时 ...

  5. linux中exit和fatal区别,关于Linux系统命令中exit与exit的区别

    关于Linux系统命令中exit与exit的区别 注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和 ...

  6. MySQL 5.7中sync_binlog参数和半同步中after_commit和after_sync的区别

     导 读 作者:高鹏(重庆八怪) 原文地址:https://www.jianshu.com/p/59c6ecb46fe5 本文为我的一些零散记录供以后参考,但里面的部分问题经常会有朋友问到,翻以往的记 ...

  7. python中break和continue的区别

    python中break和continue的区别 break 结束for 或者while 循环  后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...

  8. java中separator_java - File.separator和路径中的斜杠之间的区别

    java - File.separator和路径中的斜杠之间的区别 在Java Path-String中使用/和普通的File.separator有什么区别? 与双反斜杠相比,/平台独立似乎不是原因, ...

  9. PHP中self和static的区别,php中self与static的区别

    原文链接,猛击这里. php中self与static的区别 通过一些示例,我们可以很容易看出self和static的区别.假定我们有class Car – 它有两个方法,model和getModel. ...

最新文章

  1. UITableView数据的添加、删除、移动
  2. 某大厂女程序员哀叹:还不到三十岁,父母竟让自己和一个离异有娃的男人相亲!
  3. 窗口缩放导致页面排版错乱的解决方法
  4. hdu 4358(莫队算法+dfs序列)
  5. central maven_一键发布到Maven Central的方法
  6. (笔记)学习C语言经典书籍推荐
  7. 苹果流媒体电视业务姗姗来迟 Netflix和亚马逊丝毫不虚...
  8. 如何形象地理解 Python 中的 int 类型是任意精度这一概念?
  9. Java如何连接Mysql数据库
  10. linux 命令:chmod详解
  11. matlab axis函数_又是被Matlab整疯的一天!来学点简单操作!
  12. 计算机界面没磁盘驱动器,驱动器中没有磁盘的原因和解决办法
  13. 梦幻西游手游海外服务器维护,梦幻西游手游维护 新神器任务轩辕丘之祸开启...
  14. c# 操作ppt 设置背景色、字体颜色、PPT转图片
  15. spring-boot文件上传限制
  16. linux内核漫游实验目的,Linux内核源代码漫游——
  17. github上很好的iOS资源集锦
  18. YOLOv3 ubuntu 配置及训练自己的VOC格式数据集
  19. 光纤熔接操作步骤——详细图文光纤熔接教程
  20. dy是怎么算收益的?武汉新时标文化传媒

热门文章

  1. 图的绝对中心(bzoj 2180: 最小直径生成树)
  2. 2017 Multi-University Training Contest - Team 7:1010. Just do it(组合数?)
  3. 超级卡特兰数(bzoj 4706: B君的多边形)
  4. pytorch之各类图像库的图片读写方式
  5. OPNET网络仿真分析-目 录
  6. Unity3D笔记 愤怒的小鸟四 实现Selelction界面
  7. 【zabbix解决value too small or too large】
  8. 洛谷 P1164:小A点菜(DP/DFS)
  9. Java基础笔记(2) 程序入口 关键字 标识符 常量 变量
  10. Python之输入输出