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+opencv实现图像灰度化
    java实现高斯平滑
    hdu 3415 单调队列
    POJ 3368 Frequent values 线段树区间合并
    UVA 11795 Mega Man's Mission 状态DP
    UVA 11552 Fewest Flops DP
    UVA 10534 Wavio Sequence DP LIS
    UVA 1424 uvalive 4256 Salesmen 简单DP
    UVA 1099 uvalive 4794 Sharing Chocolate 状态DP
    UVA 1169uvalive 3983 Robotruck 单调队列优化DP
  • 原文地址:https://www.cnblogs.com/gdxmagic/p/3340525.html
Copyright © 2011-2022 走看看