zoukankan      html  css  js  c++  java
  • CPU与GPU的一点理解

    转载地址http://blog.csdn.net/heaven20062006/article/details/7489508

    CPU与GPU这两个处理器不是同步运行的,当CPU要GPU画第10个对象时,GPU可能还在画第一个对象。CPU与GPU不同步现象与是否使用Shader无关,无论是否使用Shader,CPU与GPU都不会同步运行。
    CPU 调用Direct3D和OpenGL的绘图函数来绘图时,这些指定不会被GPU马上运行,而是存放在某一块内存中,这快内存称为Command Buffer。GPU会一直从Command Buffer中取出CPU所指派的工作。当Command Buffer为空时,GPU就会闲下来。当Command Buffer被塞满时,CPU就不能再下新的命令,这个时候若CPU继续下命令,CPU就会被暂停,知道GPU处理并清除掉一些Command Buffer中的命令后,CPU才能继续运行。
    如果CPU和GPU是同步运行的,那就代表有很多时候需要把CPU暂停,等GPU画完才能恢复CPU的运行。例如,如果CPU调用DrawPrimitive画一万个三角形,DrawPrimitive函数需要等GPU把这一万个三角形全部画完才会return。这样CPU在DrawPrimitive运行结束前只是被暂停,没做任何事,浪费了硬件资源,有效率的做法是CPU调用  DrawPrimitive时,DrawPrimitive函数只是把画一万个三角形的指令放在Command Buffer中,指令放好后立即return,让CPU做其他的事情。只要Command Buffer够大、CPU新增指令和GPU绘图的速度配合好,CPU和GPU就可以同时完成各自的工作。
    CPU和GPU的不同步现象对Shader的编写事实上没有太大影响,不过要了解这个问题。C++代码在试图改变显示内存中的贴图和顶点数据时,有可能这些数据正被GPU使用。这个时候强制更新的话,会得到错误的绘图结果。如果要CPU暂停等到GPU更新完后更新数据,会拖慢程序的运行速度。有时我们会使用double buffer的方法,让CPU和GPU不同时存取一块内存。CPU更新buffer1的时候让GPU读取buffer2,下一个画面是CPU更新 buffer2,GPU读取buffer1。虽然这样会让画面显示的数据慢一步,但是在视觉上没有太大的影响。通常游戏的帧数是30到60,画面反映慢一步,等于只是慢了1/30  - 1/60秒,几乎不会感觉到。
    ----摘自《3D绘图程序设计

  • 相关阅读:
    Java关键字——instanceof
    C#基础知识整理 IList接口——非泛型
    .Net 中HashTable,HashMap 和 Dictionary<key,value> 和List<T>和DataTable的比较
    JS 判断是否为null
    java数组与字符串相互转换、整型与字符串相互转换
    数组元素的反转
    IOS系统中点击失效
    vue中计算属性和方法的区别,演示代码
    VUE中使用的插件有哪些?为什么,不能自动补全,script,methods和export default?
    【VueJS】实例中data属性的三种写法及区别
  • 原文地址:https://www.cnblogs.com/gdxmagic/p/3340525.html
Copyright © 2011-2022 走看看