XNA GPU性能(2)——盒子里的精灵

译自Shawn Hargreaves Blog(http://blogs.msdn.com/b/shawnhar/


很多人像下面这样想像计算机工作的方式:

一台电脑就像一个小纸盒。纸盒的里面住着一个精灵。精灵遵照我的程序按顺序执行其中的指令。而其中一些指令告诉精灵在屏幕上画出图形。

从功能上说,这样描述是没问题的。假如电脑真的就是这样工作的,那它们也会和现在的电脑表现得完全一样,并且可以执行同样的程序。


然而,想要理解图形性能,靠这样的描述是不够的。它过于简化了有关于「闲置(uselessness)」的部分。下面是一个更贴切的模型:

一台电脑就像一个小纸盒。纸盒里面住着一对精灵,查尔斯(Charles Pitchwife Underhill)和一个比他年轻的兄弟乔治(George Pekkala Underhill)。


查尔斯很聪明,接受过良好的教育,而且可以流利的使用好几种语言(例如C,C++,C#和Python)。


然而乔治是一个内向的书呆子。他发现自己很难跟查尔斯哥哥以外的任何人交流,他喜欢提前把自己一天要做的事情计划好,如果不事先警告就让他改变预定的话,他就会变得手忙脚乱起来。他计算浮点数乘法能力惊人,而且特别喜欢涉及到向量和矩阵的计算。


当你在这台电脑上执行一段程序时,查尔斯将它读取进来,并按照上面所写的去做。一旦他遇到一个绘制图形的指令时,他就在一张纸上把它抄录下来。在之后的某个时候(纸写满了或者他看到了一个呈现(Present)指令)他会把整张纸上的内容从原来的语言翻译成一种只有他和乔治理解的神秘代码,然后把这些翻译过的指令交给他的弟弟——他负责执行它们。


第二种假想解释了之前的模型中那些看起来十分古怪的性能特点。例如,我们用一个CPU性能查看器(Profiler)去观察查尔斯所做的事的话,就会发现绘制一个1,000,000个三角形的物体模型时,CPU几乎不会花时间调用绘制(Draw)函数。这怎么可能?难道绘制一百万个三角形开销如此低廉吗?


之所以如此是因为查尔斯在得到绘图指令后并没有做什么实际工作,仅仅是誊写到「给乔治的命令列表」上。你写一条命令叫做「画一百万个三角形」和写一条命令「画三个三角形」是一样快的,尽管执行它们对乔治来说是截然不同的。


了解这种CPU和GPU之间天然的并发特性对理解他们的工作方式十分重要。在一个完美平衡的游戏里,两个处理器都应该满负荷执行有用的工作,类似下图这样(时间沿纵轴向下递增):


注意到图中GPU直到CPU整个计算好第一帧后才开始处理绘图指令,而在GPU还在绘制上一帧时CPU会继续忙着计算第二帧。


在实际当中,很难保证CPU和GPU的工作负荷是刚好一样的。如果CPU比GPU有更多的工作要做,时间轴会像下图这样:


注意到图中GPU有时会闲置,这种情况将在GPU处理完成上一帧但还没有收到任何进一步的绘图指令时发生。


这种形式被成为「计算密集型(CPU bound)」。有趣的是在这种情况下如果我们优化代码以减轻GPU的负担,对游戏不会产生任何一点影响。GPU会用更少的时间来绘制图形,但将有更多的时间在闲置,可CPU还在满负荷工作,所以最终的帧率将保持不变。更令人感兴趣的是,如果我们想办法在不额外增加CPU负担的情况下让GPU做更多的事情,就可以完全「免费」地增加更多图形效果!


另一方面我们看看如果GPU比CPU有更多的工作要做会怎样:


在这种情形下CPU完成了第二帧的指令计算,接着准备把它们交给GPU处理,但GPU此时却说:「嘿,等等!我还没准备好;我还在忙着画第一帧。」所以CPU就必须什么都不做直到GPU准备好接受新的指令。


这种情况被称作「图形密集型(GPU bound)」。在这种情形下,优化CPU代码不会对性能产生影响,因为GPU是最终帧率的限制因素。我们可以「免费」地给CPU增加更多工作来把那段闲置时间换成更有用的游戏计算。


为了有效地优化性能,你必须了解你的游戏是计算密集型的还是图形密集型的。如果你不知道,很可能把时间浪费在优化错误的处理器上。但是一旦你知道这点,你就可以为当前空闲的处理器添加更多的特效来改善你的游戏。


所以我们究竟如何分辨是哪种情况?


人们有时会过于简单地把事情想成「图形相关的调用由GPU执行,而物理和游戏逻辑则由CPU执行」,甚至是「Update方法由CPU执行,而Draw方法由GPU执行」。


没这么简单!别忘了查尔斯必须把你的绘图指令翻译成乔治可以理解的形式。如果有太多的指令需要执行,查尔斯就要花很长的时间来翻译他们。


如果你用为数不多的指令绘制了大量的内容,查尔斯便可以很快地进行翻译,而乔治就将画的更慢些。但你如果让很多指令每一个都只画很少的内容(例如画一百万次,每次只画一个三角形,或者频繁修改诸如呈现状态(renderstates)或者特效参数之类的设置),这可能导致查尔斯花更多的时间来翻译。


即使你的程序除了绘图指令之外不含有任何更新(Update)代码,CPU计算也仍然可能消耗比GPU更多的时间,这取决于有多少翻译和定位工作需要完成。


要搞清我们到底是计算密集型的还是图形密集型的,我们须请到夏洛克·福尔摩斯来帮忙。对此,还请保持淡定……


—————————————————

Chobi-Q欢迎转载,转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值