通常情况下,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. Android开发--事件的处理/按键按下,弹起,触摸事件等
  2. Service 和 doGet 和 doPost 方法的区别
  3. [云炬创业基础笔记]第六章商业模式测试9
  4. scanf最好与fflush(stdin)配合使用
  5. redis获取byte数组_《Redis深度历险》读书笔记
  6. Linux下的用户、组和权限的详细解释
  7. C语言课后习题(28)
  8. 2020 OPPO开发者大会:融合共创 打造多终端、跨场景的智能化生活
  9. Python温度转换器
  10. 私有化 Serverless Application 的探索与思考
  11. POJ 1065 Wooden Sticks(LIS,最少链划分)
  12. 我不是九爷 带你了解 ansible
  13. HDOJ-1002 A + B Problem II C语言
  14. cocoapods安装速度慢,CDN: trunk Repo update failed等问题
  15. 漏洞修复:Insecure Transport: HSTS not Set
  16. 想要定制个性化语音?来试试这几个配音软件
  17. 戴尔DELLR740服务器修改bios启动项,安装redhat7.4
  18. 全球及中国邮件营销服务行业发展趋势及投资策略分析报告2022-2028年
  19. 蛇形填数(蛇形矩阵)c++
  20. 【181221】VC 编写的网址收藏夹程序(Access)源代码

热门文章

  1. Codeforces Round #456 (Div. 2): E. Prime Gift(折半枚举)
  2. bzoj 4247: 挂饰(DP)
  3. [高光谱] 在开源项目Hyperspectral-Classification Pytorch中加入自己的网络
  4. jenkins+postman+newman环境搭建自动化测试
  5. Hive 架构知识体系及语法详解
  6. 使用 Xilinx Documentation Navigator 查看官方文档
  7. springcloud(八):配置中心服务化和高可用
  8. Linux 文件内容替换命令
  9. [转载] python将图片进行base64编码, 解码
  10. python 全栈开发,Day81(博客系统个人主页,文章详情页)