<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; Cage Lu (Intel)</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/cage-lu/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 28 May 2012 13:40:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>案例研究:使用英特尔GPA优化《兵王》游戏的性能</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/06/gpa-3/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/06/gpa-3/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 07:59:46 +0000</pubDate>
		<dc:creator>Cage Lu (Intel)</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[GPA]]></category>
		<category><![CDATA[性能优化]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/06/gpa-3/</guid>
		<description><![CDATA[作者：英特尔：卢卷彬, Kiefer Kuah 巨人：余娜娜 下载PDF版本：使用英特尔GPA优化《兵王》游戏的性能 1. 介绍 《兵王》是由巨人网络公司旗下，上海巨贤公司耗时两年自主研发的一款未来战争MMORGP。《兵王》使用了优秀的3D引擎技术，在声光特效方面有极其优秀的表现。为了使《兵王》能够流畅的运行在更多玩家的机器上，我们在英特尔 集成显卡上对游戏进行了优化。英特尔集成显卡的出货量非常大，超过了60%（Q3’2011, Jon Peddie Research统计），其性能和特性也日益增强，是游戏开发者应该重点关注的对象。为了帮助游戏开发者在英特尔集成显卡上优化游戏性能，英特尔推出了一款出色的免费的性能分析工具，英特尔图形性能分析器(Graphics Performance Analyzers, 简称GPA)，不用修改游戏的代码，不用安装特殊的驱动版本就能够使用。游戏开发者可以利用这个工具清晰的了解自己的游戏在什么地方耗费了更多的时间，以进行有针对性的优化。GPA是我们在这次优化中使用的主要工具。 2. 优化准备 以下的分析和优化基于Intel HD Graphics 3000硬件平台，代号Sandybridge(简称SNB)，SNB拥有出色的图形性能，完全可以满足绝大多数网络游戏对性能的需求。我们使用的操作系统为Windows 7， 64位版本，GPA版本为4.2。 关于优化场景的选择，《兵王》支持大规模的群体作战，开发者对这种场景下的游戏性能特别关注，所以我们选择的是以下的一个群体战斗场景，其中有~100个玩家，并且有大量的武器和技能特效，游戏的性能在这个时候遇到很大的挑战，只有10fps左右，如图1所示： 图1，性能分析和优化的目标场景，有~100个玩家和坐骑，大量的技能特效，fps为10左右 3. GPA系统分析器HUD GPA HUD可以从平台的角度分析游戏的性能，它提供了超过80个关于CPU，D3D runtime和GPU的性能指标，以及Null Hardware，Disable all draw calls， 1x1 ScissorRect， 2x2 Texture，Simple Pixel Shader等覆盖模式，收集这些性能指标和覆盖模式得到的数据，可以帮助我们分析出游戏的瓶颈所在。使用GPA HUD分析游戏的这个场景后我们得到以下的结果： 游戏在该场景下，FPS只能维持在10左右，此时的Null Hardware 和Null Driver覆盖模式分别只能达到14fps和20fps左右，也就是说显卡无限快的时候，游戏也只能跑到14fps，因此游戏在CPU上的性能消耗非常大。游戏有7800多个draw calls，这个一个非常大的数字。大量的draw calls，会导致游戏程序，D3D runtime以及显卡驱动等这些CPU上的计算量增加，由此导致性能非常的低。所以，游戏在这个场景中的优化重点，应该是合并小的画图操作，减少draw calls和State Changes的数量，这样可以同时减少CPU和GPU上的负担。 4. GPA帧分析器 GPA可以抓取游戏的一帧数据，然后使用帧分析器进行离线的详细分析。帧分析器打开一帧的过程，就相当于是重新发送指令让GPU渲染出这一帧。帧分析器界面主要包含上部分的柱状图(A)，它们代表的是游戏中按照调用顺序排列的Clear， Draw Primitive，StretchRect等，我们统称为ergs，可以通过设置X轴和Y轴来快速的定位最耗时的调用，比如X轴设为GPU [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-family: Times New Roman;font-size: small">作者：</span>英特尔：卢卷彬<span style="font-family: Calibri">, Kiefer Kuah </span>巨人：余娜娜<strong> </strong></p>
<p><span style="font-family: Times New Roman;font-size: small">下载PDF版本：<strong><a title="下载" href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/TheKingofSoldier-game-optimize-case-study.pdf">使用英特尔GPA优化《兵王》游戏的性能</a></strong></span></p>
<p><strong><span style="font-family: Calibri;font-size: small"> </span></strong></p>
<h1><strong><span style="font-family: Calibri;font-size: small">1.</span> </strong><span style="font-size: small"><strong>介绍</strong><strong> </strong></span></h1>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">《兵王》是由巨人网络公司旗下，上海巨贤公司耗时两年自主研发的一款未来战争<span style="font-family: Calibri">MMORGP</span>。《兵王》使用了优秀的<span style="font-family: Calibri">3D</span>引擎技术，在声光特效方面有极其优秀的表现。为了使《兵王》能够流畅的运行在更多玩家的机器上，我们在英特尔<span style="font-family: Calibri"> </span>集成显卡上对游戏进行了优化。英特尔集成显卡的出货量非常大，超过了<span style="font-family: Calibri">60%</span>（<span style="font-family: Calibri">Q3’2011, Jon Peddie Research</span>统计），其性能和特性也日益增强，是游戏开发者应该重点关注的对象。为了帮助游戏开发者在英特尔集成显卡上优化游戏性能，英特尔推出了一款出色的免费的性能分析工具，英特尔图形性能分析器<span style="font-family: Calibri">(Graphics Performance Analyzers, </span>简称<span style="font-family: Calibri">GPA)</span>，不用修改游戏的代码，不用安装特殊的驱动版本就能够使用。游戏开发者可以利用这个工具清晰的了解自己的游戏在什么地方耗费了更多的时间，以进行有针对性的优化。<span style="font-family: Calibri">GPA</span>是我们在这次优化中使用的主要工具。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h1><strong><span style="font-family: Calibri;font-size: small">2.</span> </strong><span style="font-size: small"><strong>优化准备</strong><strong> </strong></span></h1>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">以下的分析和优化基于<span style="font-family: Calibri">Intel HD Graphics 3000</span>硬件平台，代号<span style="font-family: Calibri">Sandybridge(</span>简称<span style="font-family: Calibri">SNB)</span>，<span style="font-family: Calibri">SNB</span>拥有出色的图形性能，完全可以满足绝大多数网络游戏对性能的需求。我们使用的操作系统为<span style="font-family: Calibri">Windows 7</span>，<span style="font-family: Calibri"> 64</span>位版本，<span style="font-family: Calibri">GPA</span>版本为<span style="font-family: Calibri">4.2</span>。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">关于优化场景的选择，《兵王》支持大规模的群体作战，开发者对这种场景下的游戏性能特别关注，所以我们选择的是以下的一个群体战斗场景，其中有<span style="font-family: Calibri">~100</span>个玩家，并且有大量的武器和技能特效，游戏的性能在这个时候遇到很大的挑战，只有<span style="font-family: Calibri">10fps</span>左右，如图<span style="font-family: Calibri">1</span>所示：</span></p>
<p><span style="font-size: small"><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw1.png"><img class="alignnone size-full wp-image-400009644" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw1.png" alt="" width="561" height="351" /></a></span><strong><span style="font-size: small"><span style="font-family: Calibri"> </span></span></strong></p>
<h6><strong>图1，性能分析和优化的目标场景，有</strong><strong><span style="font-family: Calibri">~100</span></strong><strong>个玩家和坐骑，大量的技能特效，</strong><strong><span style="font-family: Calibri">fps</span></strong><strong>为</strong><strong><span style="font-family: Calibri">10</span></strong><strong>左右</strong><strong> </strong></h6>
<p><strong><span style="font-family: Calibri;font-size: small"><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw2.png"></a></span></strong></p>
<h1><strong><span style="font-family: Calibri;font-size: small">3.</span> </strong><span style="font-size: small"><strong><span style="font-family: Calibri">GPA</span></strong><strong>系统分析器</strong><strong><span style="font-family: Calibri">HUD</span></strong></span></h1>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri">GPA HUD</span>可以从平台的角度分析游戏的性能，它提供了超过<span style="font-family: Calibri">80</span>个关于<span style="font-family: Calibri">CPU</span>，<span style="font-family: Calibri">D3D runtime</span>和<span style="font-family: Calibri">GPU</span>的性能指标，以及<span style="font-family: Calibri">Null Hardware</span>，<span style="font-family: Calibri">Disable all draw calls</span>，<span style="font-family: Calibri"> 1x1 ScissorRect</span>，<span style="font-family: Calibri"> 2x2 Texture</span>，<span style="font-family: Calibri">Simple Pixel Shader</span>等覆盖模式，收集这些性能指标和覆盖模式得到的数据，可以帮助我们分析出游戏的瓶颈所在。使用<span style="font-family: Calibri">GPA HUD</span>分析游戏的这个场景后我们得到以下的结果：</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">游戏在该场景下，<span style="font-family: Calibri">FPS</span>只能维持在<span style="font-family: Calibri">10</span>左右，此时的<span style="font-family: Calibri">Null Hardware </span>和<span style="font-family: Calibri">Null Driver</span>覆盖模式分别只能达到<span style="font-family: Calibri">14fps</span>和<span style="font-family: Calibri">20fps</span>左右，也就是说显卡无限快的时候，游戏也只能跑到<span style="font-family: Calibri">14fps</span>，因此游戏在<span style="font-family: Calibri">CPU</span>上的性能消耗非常大。游戏有<span style="font-family: Calibri">7800</span>多个<span style="font-family: Calibri">draw calls</span>，这个一个非常大的数字。大量的<span style="font-family: Calibri">draw calls</span>，会导致游戏程序，<span style="font-family: Calibri">D3D runtime</span>以及显卡驱动等这些<span style="font-family: Calibri">CPU</span>上的计算量增加，由此导致性能非常的低。所以，游戏在这个场景中的优化重点，应该是合并小的画图操作，减少<span style="font-family: Calibri">draw calls</span>和<span style="font-family: Calibri">State Changes</span>的数量，这样可以同时减少<span style="font-family: Calibri">CPU</span>和<span style="font-family: Calibri">GPU</span>上的负担。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h1><strong><span style="font-family: Calibri;font-size: small">4.</span> </strong><span style="font-size: small"><strong><span style="font-family: Calibri">GPA</span></strong><strong>帧分析器</strong><strong> </strong></span></h1>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri">GPA</span>可以抓取游戏的一帧数据，然后使用帧分析器进行离线的详细分析。帧分析器打开一帧的过程，就相当于是重新发送指令让<span style="font-family: Calibri">GPU</span>渲染出这一帧。帧分析器界面主要包含上部分的柱状图<span style="font-family: Calibri">(A)</span>，它们代表的是游戏中按照调用顺序排列的<span style="font-family: Calibri">Clear</span>，<span style="font-family: Calibri"> Draw Primitive</span>，<span style="font-family: Calibri">StretchRect</span>等，我们统称为<span style="font-family: Calibri">ergs</span>，可以通过设置<span style="font-family: Calibri">X</span>轴和<span style="font-family: Calibri">Y</span>轴来快速的定位最耗时的调用，比如<span style="font-family: Calibri">X</span>轴设为<span style="font-family: Calibri">GPU Duration</span>，<span style="font-family: Calibri">Y</span>轴设为<span style="font-family: Calibri">GPU Breakdown</span>。界面左边中间<span style="font-family: Calibri">(B)</span>是所有<span style="font-family: Calibri">ergs</span>的列表，左边下面<span style="font-family: Calibri">(C)</span>是<span style="font-family: Calibri">Render Target</span>，右边下面<span style="font-family: Calibri">(D)</span>是一系列<span style="font-family: Calibri">Tab</span>，包括性能数据，<span style="font-family: Calibri">ergs</span>的纹理，<span style="font-family: Calibri">shader</span>，<span style="font-family: Calibri">state</span>，<span style="font-family: Calibri">API log</span>等等。我们在目标场景中抓取了一帧数据，下图<span style="font-family: Calibri">2</span>是使用帧分析器打开这帧数据的界面：</span><span style="font-size: small"><span style="font-family: Calibri"> </span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> <span style="font-family: Calibri;font-size: small"><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw2.png"><img class="alignnone size-full wp-image-400009645" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw2.png" alt="" width="672" height="376" /></a></span></span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">2</span></strong><strong>，帧分析器打开场景的界面</strong><strong> </strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-family: Calibri;font-size: small"> </span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">从图<span style="font-family: Calibri">2</span>所示的帧分析器界面我们可以看出，渲染这一帧<span style="font-family: Calibri">GPU</span>花费的时间为<span style="font-family: Calibri">71ms</span>。游戏的渲染步骤是先生成阴影贴图（<span style="font-family: Calibri">0-1198</span>），然后是正常场景的渲染，最后是后处理以及<span style="font-family: Calibri">UI</span>部分。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">阴影贴图使用了<span style="font-family: Calibri">1198</span>个<span style="font-family: Calibri">draw calls</span>，通过<span style="font-family: Calibri">GPA</span>帧分析器的纹理<span style="font-family: Calibri">tab</span>可以查看这些<span style="font-family: Calibri">draw calls</span>所使用的纹理，我们发现，游戏对某些特效也计算了阴影：</span><span style="font-size: small"><span style="font-family: Calibri"> </span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw3.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw3.png" alt="" width="634" height="150" /></a></span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">3</span></strong><strong>，生成阴影贴图的</strong><strong><span style="font-family: Calibri">draw calls</span></strong><strong>中，发现了特效的纹理，游戏对特效也计算了阴影</strong><strong> </strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">如图<span style="font-family: Calibri">3</span>所示，选中的那个纹理，以及相邻的纹理，都是特效相关的，而游戏设计之初并没有要求计算它们的阴影，可以移除掉。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">另外，游戏花费了<span style="font-family: Calibri">5526</span>个<span style="font-family: Calibri">draw calls</span>来渲染场景中的所有物体，占了整个一帧的<span style="font-family: Calibri">72.6%</span>的时间。这<span style="font-family: Calibri">5526</span>个<span style="font-family: Calibri">draw calls</span>中，有超过<span style="font-family: Calibri">4000</span>个是渲染特效部分，它们占用了整个一帧<span style="font-family: Calibri">44.9%</span>的时间，这是优化的重点目标，如图<span style="font-family: Calibri">4</span>所示，在界面的<span style="font-family: Calibri">render target</span>那里可以看到所有的特效：</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw4.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw4.png" alt="" width="672" height="378" /></a></span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">4</span></strong><strong>，渲染特效的</strong><strong><span style="font-family: Calibri">draw calls</span></strong><strong>有</strong><strong><span style="font-family: Calibri">4079</span></strong><strong>个，占用一帧</strong><strong><span style="font-family: Calibri">44.9%</span></strong><strong>的时间</strong><strong> </strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">通过查看和分析这些特效，我们发现每一个特效的<span style="font-family: Calibri">draw call</span>所渲染的东西都是非常小的，而且它们所使用纹理，多数都是小纹理，如下所示：</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw4.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw5.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw5.png" alt="" width="672" height="378" /></a></span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">5</span></strong><strong>，特效的</strong><strong><span style="font-family: Calibri">draw call</span></strong><strong>都很小，</strong><strong><span style="font-family: Calibri">10</span></strong><strong>个</strong><strong><span style="font-family: Calibri">draw calls</span></strong><strong>只渲染了一小部分特效</strong><strong> </strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">上图<span style="font-family: Calibri">5</span>中，选中的这<span style="font-family: Calibri">10</span>个相邻的<span style="font-family: Calibri">draw calls</span>使用的都是这个<span style="font-family: Calibri">128*128</span>的蓝色纹理，所渲染的东西也是相邻的，我们可以考虑合并这几个<span style="font-family: Calibri">draw calls</span>。同时，考虑到纹理比较小，我们还可以合并相邻的特效纹理，这样可以减少<span style="font-family: Calibri">SETTEXTURE</span>的次数，也减少了<span style="font-family: Calibri">CPU</span>端的消耗。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">坐骑和人物部分的渲染，也划分得很细，头发，脸孔，衣服，武器等都是由单独的<span style="font-family: Calibri">draw call</span>完成。这些也可以进行适当的合并，从而减少<span style="font-family: Calibri">draw calls</span>和<span style="font-family: Calibri">state changes</span>的数量。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h1><span style="font-family: Calibri;font-size: small"> <strong>5. </strong><strong>优化策略和结果</strong></span></h1>
<h2><span style="font-size: small"><strong><span style="font-family: Calibri">5.1 </span></strong><strong>移除特效的阴影计算</strong><strong> </strong></span></h2>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">如前面的图<span style="font-family: Calibri">3</span>所示，游戏中对特效也计算了实时阴影，一般来说，特效是不需要计算阴影的。移除掉这些<span style="font-family: Calibri">draw calls</span>后，生成阴影贴图<span style="font-family: Calibri"> </span>的<span style="font-family: Calibri">draw calls</span>从<span style="font-family: Calibri">1198</span>个减少到了<span style="font-family: Calibri">860</span>个，<span style="font-family: Calibri"> </span>这部分的<span style="font-family: Calibri">GPU</span>时间消耗从<span style="font-family: Calibri">6.5ms</span>减少到了<span style="font-family: Calibri">4.86ms</span>。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h2><span style="font-size: small"><strong><span style="font-family: Calibri">5.2 </span></strong><strong>合并特效</strong><strong><span style="font-family: Calibri">draw calls</span></strong><strong>和纹理</strong><strong> </strong></span></h2>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">由前面的分析我们知道，要优化游戏在该场景下的性能，最重要的就是减少<span style="font-family: Calibri">CPU</span>端的消耗，也就是要减少游戏的<span style="font-family: Calibri">draw calls</span>和<span style="font-family: Calibri">State Changes</span>的数量。场景中特效的<span style="font-family: Calibri">draw calls</span>数量是最多的，而且特效的<span style="font-family: Calibri">draw calls</span>都是非常小的，所以我们首先来合并特效的<span style="font-family: Calibri">draw calls</span>。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"> </span></span><span style="font-size: small"><span style="font-family: Calibri"> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw4.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw5.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw6.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw6.png" alt="" width="618" height="240" /></a></span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">6</span></strong><strong>，优化前，使用了</strong><strong><span style="font-family: Calibri">37</span></strong><strong>个</strong><strong><span style="font-family: Calibri">draw calls</span></strong><strong>来完成右边的特效</strong><strong> </strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"> </span></span><span style="font-size: small"><span style="font-family: Calibri"> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw4.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw5.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw6.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw7.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw7.png" alt="" width="618" height="240" /></a></span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">7</span></strong><strong>，优化后，对特效的顶点和纹理都进行了合并，使用一个</strong><strong><span style="font-family: Calibri">draw call</span></strong><strong>就完成了类似的特效</strong><strong> </strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">从以上图<span style="font-family: Calibri">6</span>和图<span style="font-family: Calibri">7</span>的对比我们看到，合并优化后，渲染相同的特效，我们减少了<span style="font-family: Calibri">draw calls</span>的数量，从<span style="font-family: Calibri">37</span>减少到<span style="font-family: Calibri">1</span>，纹理也从<span style="font-family: Calibri">4</span>个合并到<span style="font-family: Calibri">1</span>个。整个一帧，特效的<span style="font-family: Calibri">draw calls</span>数量从<span style="font-family: Calibri">4000</span>多次减少到了<span style="font-family: Calibri">700</span>多次，<span style="font-family: Calibri">set texture</span>的次数从<span style="font-family: Calibri">3764</span>减少到<span style="font-family: Calibri">2029</span>次。整个特效部分的<span style="font-family: Calibri">GPU</span>时间从<span style="font-family: Calibri">45ms</span>减少到了<span style="font-family: Calibri">21ms</span>，提升非常明显！下图<span style="font-family: Calibri">8</span>为优化后的结果：</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw4.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw5.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw6.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw7.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw8.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw9.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw10.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw11.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw12.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw8.png"><img class="alignnone size-full wp-image-400009651" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw8.png" alt="" width="520" height="315" /></a></span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">8</span></strong><strong>，优化后整个特效部分的</strong><strong><span style="font-family: Calibri">draw call</span></strong><strong>数量减少到了</strong><strong><span style="font-family: Calibri">706</span></strong><strong>个左右，特效的</strong><strong><span style="font-family: Calibri">GPU</span></strong><strong>时间从</strong><strong><span style="font-family: Calibri">45ms</span></strong><strong>减少到了</strong><strong><span style="font-family: Calibri">21ms</span></strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><strong><span style="font-family: Calibri;font-size: small"> </span></strong></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h2><span style="font-size: small"><strong><span style="font-family: Calibri">5.3 </span></strong><strong>合并人物和坐骑的渲染</strong><strong> </strong></span></h2>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">游戏对人物的渲染区分很细，帽子，头发，衣服，裤子，鞋子，武器等都由独立的<span style="font-family: Calibri">draw calls</span>来完成，对坐骑也是由<span style="font-family: Calibri">3</span>个<span style="font-family: Calibri">draw calls</span>来完成的，虽然他们使用的是同样的纹理。以下以坐骑为例，将优化前需要<span style="font-family: Calibri">3</span>个<span style="font-family: Calibri">draw calls</span>完成的渲染，合并为一个<span style="font-family: Calibri">draw call</span>来完成。</span><span style="font-size: small"><span style="font-family: Calibri"> </span></span><span style="font-size: small"><span style="font-family: Calibri"> </span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw8.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw9.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw9.png" alt="" width="644" height="296" /></a></span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">9</span></strong><strong>，优化前，使用了</strong><strong><span style="font-family: Calibri">3</span></strong><strong>个</strong><strong><span style="font-family: Calibri">draw calls</span></strong><strong>来完成一个坐骑的渲染</strong><strong> </strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"> </span></span><span style="font-size: small"><span style="font-family: Calibri"> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw8.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw9.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw10.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw10.png" alt="" width="644" height="300" /></a></span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">10</span></strong><strong>，优化后，合并了坐骑的</strong><strong><span style="font-family: Calibri">IB</span></strong><strong>和</strong><strong><span style="font-family: Calibri">VB</span></strong><strong>，使用一个</strong><strong><span style="font-family: Calibri">draw call</span></strong><strong>就能完成坐骑的渲染</strong><strong> </strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">如上图<span style="font-family: Calibri">9</span>和图<span style="font-family: Calibri">10</span>所示，优化前需要用<span style="font-family: Calibri">3</span>个<span style="font-family: Calibri">draw calls</span>来完成一个坐骑的渲染，我们合并了坐骑的<span style="font-family: Calibri">IB</span>和<span style="font-family: Calibri">VB</span>，优化后只需要一个<span style="font-family: Calibri">draw call</span>就完成了这个坐骑的渲染。整个一帧有<span style="font-family: Calibri">~100</span>个坐骑，合并优化后，节省了<span style="font-family: Calibri">~200</span>个<span style="font-family: Calibri">draw calls</span>。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">我们针对人物也进行了类似的合并优化，也节省了<span style="font-family: Calibri">200</span>个左右的<span style="font-family: Calibri">draw calls</span>。<strong> </strong></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h2><span style="font-size: small"><strong><span style="font-family: Calibri">5.4 </span></strong><strong>移除重复的</strong><strong><span style="font-family: Calibri">SETTEXTURE</span></strong></span></h2>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">为了减少<span style="font-family: Calibri">CPU</span>端的消耗，我们还应该尽量减少<span style="font-family: Calibri">state changes</span>的数量，在帧分析器对另外一个场景的分析中，我们发现，每个<span style="font-family: Calibri">draw call</span>都会设置自己所需要的所有纹理，而不管是否和上一个<span style="font-family: Calibri">draw call</span>使用了相同的纹理。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw8.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw9.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw10.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw11.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw11.png" alt="" width="576" height="324" /></a></span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">11</span></strong><strong>，</strong><strong><span style="font-family: Calibri"> </span></strong><strong>相邻的</strong><strong><span style="font-family: Calibri">2</span></strong><strong>个</strong><strong><span style="font-family: Calibri">draw calls</span></strong><strong>，使用一样的纹理，但是他们都重新设置了一次</strong><strong> </strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">如图<span style="font-family: Calibri">11</span>所示，柱状图中选中的临近的<span style="font-family: Calibri">2</span>个<span style="font-family: Calibri">draw call</span>，是在画地形部分，即使它们使用的是完全相同的纹理，它们也都重新调用了<span style="font-family: Calibri">5</span>次完整的的<span style="font-family: Calibri">SETTEXTURE API</span>。该场景中整个一帧总共有<span style="font-family: Calibri">1837</span>个<span style="font-family: Calibri">SETTEXTURE API </span>调用。这不是有效率的做法，如果相邻的<span style="font-family: Calibri">draw call</span>使用的是同样的纹理，可以不用调用<span style="font-family: Calibri">SETTEXTURE</span>再次设置，这样可以减少<span style="font-family: Calibri">state changes</span>的数量，提高游戏性能。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">以下是优化后的截图，移除掉了重复的不必要的<span style="font-family: Calibri">SETTEXTURE API</span>调用，如图<span style="font-family: Calibri">12</span>所示，第二个地形<span style="font-family: Calibri">draw call</span>本身已经没有调用<span style="font-family: Calibri">set texture</span>了。经过优化后，整个一帧所调用的<span style="font-family: Calibri">SETTEXTURE API</span>次数从<span style="font-family: Calibri">1837</span>次减少到了<span style="font-family: Calibri">554</span>次。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw8.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw9.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw10.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw11.png"></a><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw12.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/01/bw12.png" alt="" width="605" height="340" /></a></span></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<h6><strong>图</strong><strong><span style="font-family: Calibri">12</span></strong><strong>，优化后，如果纹理没有变化，则不重复设置了</strong><strong> </strong></h6>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small">经过以上几种优化，我们把《兵王》在这个场景下的<span style="font-family: Calibri">draw calls</span>数量从<span style="font-family: Calibri">7839</span>次减少到了<span style="font-family: Calibri">3812</span>次，<span style="font-family: Calibri">SETTEXTURE API</span>调用次数从<span style="font-family: Calibri">3764</span>次减少到了<span style="font-family: Calibri">2029</span>次。游戏帧率从<span style="font-family: Calibri">10fps</span>提升到了<span style="font-family: Calibri">20fps</span>左右，基本能够流畅的运行，达到了游戏开发者的期望。<strong> </strong></span></p>
<h1><span style="font-family: Times New Roman;font-size: small"> </span></h1>
<h1><span style="font-family: Times New Roman;font-size: small">6<strong>. 总结</strong><strong> </strong></span></h1>
<p><span style="font-size: small"> </span></p>
<p><span style="font-size: small">本文介绍了使用<span style="font-family: Calibri">GPA</span>对《兵王》进行性能分析和优化的过程，从中我们可以看出，游戏客户端的性能优化并不难，我们所使用的优化方法也都很常见，但重要的是如何很快的找到这些游戏热点和瓶颈。在《兵王》的性能分析和优化过程中，<span style="font-family: Calibri">GPA</span>发挥了非常重要的作用，通过它我们很容易就发现了游戏的瓶颈，进行针对性的优化，游戏的性能得到了很大的提升。我们将继续使用<span style="font-family: Calibri">GPA</span>进一步优化游戏。<strong> </strong></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><strong> </strong></span></p>
<h2><span style="font-size: small"><strong>作者简介</strong><strong> </strong></span></h2>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><strong>卢卷彬</strong><strong><span style="font-family: Calibri"> </span></strong>英特尔公司的应用工程师，他和国内几家大的游戏公司有着多年的合作，帮助他们在英特尔平台上优化游戏客户端的性能。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><strong>余娜娜</strong><span style="font-family: Calibri"><strong> </strong> </span>巨人前传技术部经理，参与开发过3DRPG《仙剑奇侠传三-问情篇》，3DMMORPG《巨人》、《兵王》。主要致力于3D引擎的研制开发，与Intel的几年合作中，极大提升了自主研发的3D引擎的特性，在效果提升的基础上，同屏人数也大大提升。</span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
<p><span style="font-size: small"><span style="font-family: Calibri"><strong>Kiefer Kuah</strong> </span>英特尔的软件工程师，他主要负责游戏在英特尔平台上的优化工作。<strong> </strong></span></p>
<p><span style="font-family: Times New Roman;font-size: small"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/06/gpa-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用英特尔GPA优化《轩辕传奇》游戏的性能</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/12/26/gpa-2/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/12/26/gpa-2/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 03:57:56 +0000</pubDate>
		<dc:creator>Cage Lu (Intel)</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[GPA]]></category>
		<category><![CDATA[性能优化]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/12/26/gpa-2/</guid>
		<description><![CDATA[ 文章作者：英特尔：卢卷彬 Kiefer Kuah    腾讯：丛越    下载PDF版本：使用英特尔GPA优化《轩辕传奇》游戏的性能    介绍  随着集成显卡功能和性能的日益增强以及移动平台的不断普及，集成显卡已经成了游戏开发者不可忽视的重要对象。    本文介绍了使用GPA在英特尔集成显卡上分析和优化《轩辕传奇》网络游戏的案例。 《轩辕传奇》是由腾讯研发团队打造的一款MMORPG网游，是腾讯的首款史诗战争网游。该游戏在引擎技术、美术、服务器等诸多方面都力求精益求精，达到了国内顶级网游水准。为了满足更多玩家的机器配置，我们特别针对集成显卡进行了测试和优化。    性能分析开始 本文档的分析和优化基于Intel HD Graphics 3000平台，代号SandyBridge(简称SNB)。 SNB是Intel在2011年推出的一款性能非常出色的处理器集成显卡。它的性能可以媲美一些独立显卡。作为一款网络游戏，《轩辕传奇》的开发者希望能够在更多的平台上面流畅运行游戏，所以尽管游戏在SNB上的性能已经很流畅了，我们还是要尽量的对游戏性能进行优化。 以下是我们这次性能分析和优化所选择的目标场景：        图1. 《轩辕传奇》性能分析和优化的目标场景    系统分析   GPA HUD能够实时的显示游戏运行的时候CPU，DX runtime，以及GPU上的性能数据。同时支持多种D3D流水线上的override模式，帮助游戏开发者进一步定位游戏的瓶颈所在。   通过GPA HUD的分析，我们发现：   1. 游戏的大多数计算都是在主线程中完成，多核心利用率比较低。那么在玩家角色多的时候，因为动画计算比较多，CPU将会成为瓶颈。可以考虑使用多线程来消除这种场景下的瓶颈。   2. 游戏中每帧的State Changes数量不算很多，大概每帧6000个，平均每个DP call 7.5次。能够做一些优化减少State Changes数量的话，对性能是很有好处的。   3. 通过Override模式测试，Null Driver, Null Hardware 都可以使游戏的fps达到100左右，100fps是游戏的限帧。所以在该场景下游戏的瓶颈是在GPU上。我们还在玩家角色比较多的场景进行了类似测试，发现Null Hardware对fps提升不大，此时瓶颈在CPU上。     帧分析   [...]]]></description>
			<content:encoded><![CDATA[<div><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan1.png"></a></div>
<div><span style="font-family: Times New Roman; font-size: small;"> 文章作者：英特尔：卢卷彬 Kiefer Kuah    腾讯：丛越</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span>下载PDF版本：<strong><a title="下载" href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/GPA_XuanYuan_Optimization_case-study.pdf">使用英特尔GPA优化《轩辕传奇》游戏的性能</a></strong><strong> </strong></div>
<h2><strong> </strong></h2>
<h2><strong>介绍</strong><strong> </strong></h2>
<div><span style="font-size: small;"><span style="font-family: Calibri;"> </span>随着集成显卡功能和性能的日益增强以及移动平台的不断普及，集成显卡已经成了游戏开发者不可忽视的重要对象。</span></div>
<div><span style="font-size: small;"><span style="font-family: Calibri;"> </span></span></div>
<div><span style="font-size: small;"><span style="font-family: Calibri;"> </span>本文介绍了使用<span style="font-family: Calibri;">GPA</span>在英特尔集成显卡上分析和优化《轩辕传奇》网络游戏的案例。<span style="font-family: Calibri;"> </span>《轩辕传奇》是由腾讯研发团队打造的一款<span style="font-family: Calibri;">MMORPG</span>网游，是腾讯的首款史诗战争网游。该游戏在引擎技术、美术、服务器等诸多方面都力求精益求精，达到了国内顶级网游水准。为了满足更多玩家的机器配置，我们特别针对集成显卡进行了测试和优化。</span></div>
<div><strong> </strong></div>
<h2><strong> </strong><strong>性能分析开始</strong><strong> </strong></h2>
<div><span style="font-size: small;">本文档的分析和优化基于<span style="font-family: Calibri;">Intel HD Graphics 3000</span>平台，代号<span style="font-family: Calibri;">SandyBridge(</span>简称<span style="font-family: Calibri;">SNB)</span>。<span style="font-family: Calibri;"> SNB</span>是<span style="font-family: Calibri;">Intel</span>在<span style="font-family: Calibri;">2011</span>年推出的一款性能非常出色的处理器集成显卡。它的性能可以媲美一些独立显卡。作为一款网络游戏，《轩辕传奇》的开发者希望能够在更多的平台上面流畅运行游戏，所以尽管游戏在<span style="font-family: Calibri;">SNB</span>上的性能已经很流畅了，我们还是要尽量的对游戏性能进行优化。</span></div>
<div><span style="font-size: small;">以下是我们这次性能分析和优化所选择的目标场景：</span><span style="font-family: Calibri; font-size: small;"> </span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-size: small;"><span style="font-family: Calibri;"> </span></span><span style="font-size: small;"><span style="font-family: Calibri;"> </span></span></div>
<div><strong><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan1.png"><img class="size-large wp-image-400009552 aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan1-1024x640.png" alt="" width="717" height="448" /></a></strong></div>
<div><strong> </strong></div>
<div style="text-align: center;"><strong>图1. 《轩辕传奇》性能分析和优化的目标场景</strong></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<h2><strong> </strong><strong>系统分析</strong></h2>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><span style="font-family: Calibri;">GPA HUD</span>能够实时的显示游戏运行的时候<span style="font-family: Calibri;">CPU</span>，<span style="font-family: Calibri;">DX runtime</span>，以及<span style="font-family: Calibri;">GPU</span>上的性能数据。同时支持多种<span style="font-family: Calibri;">D3D</span>流水线上的<span style="font-family: Calibri;">override</span>模式，帮助游戏开发者进一步定位游戏的瓶颈所在。</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;">通过<span style="font-family: Calibri;">GPA HUD</span>的分析，我们发现：</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><span style="font-family: Calibri;">1. </span>游戏的大多数计算都是在主线程中完成，多核心利用率比较低。那么在玩家角色多的时候，因为动画计算比较多，<span style="font-family: Calibri;">CPU</span>将会成为瓶颈。可以考虑使用多线程来消除这种场景下的瓶颈。</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><span style="font-family: Calibri;">2. </span>游戏中每帧的<span style="font-family: Calibri;">State Changes</span>数量不算很多，大概每帧<span style="font-family: Calibri;">6000</span>个，平均每个<span style="font-family: Calibri;">DP call 7.5</span>次。能够做一些优化减少<span style="font-family: Calibri;">State Changes</span>数量的话，对性能是很有好处的。</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><span style="font-family: Calibri;">3. </span>通过<span style="font-family: Calibri;">Override</span>模式测试，<span style="font-family: Calibri;">Null Driver, Null Hardware </span>都可以使游戏的<span style="font-family: Calibri;">fps</span>达到<span style="font-family: Calibri;">100</span>左右，<span style="font-family: Calibri;">100fps</span>是游戏的限帧。所以在该场景下游戏的瓶颈是在<span style="font-family: Calibri;">GPU</span>上。我们还在玩家角色比较多的场景进行了类似测试，发现<span style="font-family: Calibri;">Null Hardware</span>对<span style="font-family: Calibri;">fps</span>提升不大，此时瓶颈在<span style="font-family: Calibri;">CPU</span>上。</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-family: Calibri; font-size: small;"> </span></div>
<h2><strong>帧分析</strong></h2>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><span style="font-family: Calibri;">GPA</span>帧分析器能够详细的分析游戏的一帧的所有<span style="font-family: Calibri;">draw call</span>的性能数据以及它们所使用的纹理，<span style="font-family: Calibri;">d3d</span>状态，<span style="font-family: Calibri;">shader</span>等等。图<span style="font-family: Calibri;">2</span>显示了我们使用<span style="font-family: Calibri;">GPA</span>帧分析器打开我们在目标场景抓取的一帧数据。</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><span style="font-family: Calibri;"> </span></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong><img class="size-large wp-image-400009553 aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan2-1024x429.png" alt="" width="614" height="257" /></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong> </strong></span><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">2. </span></strong><strong>使用<span style="font-family: Calibri;">GPA</span></strong><strong>帧分析器打开抓取的一帧数据</strong></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-family: Calibri; font-size: small;"> </span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-size: small;">通过帧分析器分析，我们得到整个一帧的时间分布为：</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<ol>
<li><span style="font-size: small;">生成阴影贴图：<span style="font-family: Calibri;">~170 </span>个<span style="font-family: Calibri;"> DP Calls, 15.9% frame time</span>。场景中所有的物体都计算了实时阴影。我们可以使用静态阴影来替代其中的一部分，比如某些距离远的，固定的物体。</span></li>
<li><span style="font-size: small;">天空盒<span style="font-family: Calibri;">: 3</span>个<span style="font-family: Calibri;"> DP Calls</span>，<span style="font-family: Calibri;">4.7% frame time</span>。实际上在该场景中看不到天空，我们可以在渲染天空盒之前进行可见性检测。如果不可见，则不渲染。</span></li>
<li><span style="font-size: small;"><span style="font-family: Calibri;">Terrain</span>：<span style="font-family: Calibri;">50</span>个<span style="font-family: Calibri;"> DP Calls</span>，<span style="font-family: Calibri;">34.9% frame time</span>。和大多数网络游戏一样，地形总是最耗时的部分，是优化的重点。</span></li>
<li><span style="font-size: small;">人物和其他地上物件：<span style="font-family: Calibri;">~240</span>个<span style="font-family: Calibri;">DP Calls</span>，<span style="font-family: Calibri;">22.4% frame time</span>。没有发现明显的可以优化的地方。</span></li>
<li><span style="font-size: small;">后处理：<span style="font-family: Calibri;">8</span>个<span style="font-family: Calibri;">DP Calls</span>，<span style="font-family: Calibri;">8.4% frame time</span>。没有发现明显的可以优化的地方。</span></li>
<li><span style="font-size: small;"><span style="font-family: Calibri;">UI</span>：<span style="font-family: Calibri;">55 DP Calls</span>，<span style="font-family: Calibri;">7.4% frame time</span>。有许多<span style="font-family: Calibri;">UI</span>元素过小，可以合并一下再渲染。<span style="font-family: Calibri;">UI</span>并不是每帧都变化的，可以重复利用上一帧的结果。</span></li>
</ol>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<h2><strong>优化策略和结果</strong><span style="font-size: small;">：</span></h2>
<p><span style="font-size: small;"> </span></p>
<h3><span style="font-family: Times New Roman; font-size: small;"> </span><strong><span style="font-family: Calibri;">1. </span></strong><strong>阴影贴图生成</strong><strong> </strong></h3>
<div><span style="font-size: small;">游戏花费了花费了<span style="font-family: Calibri;">~170</span>个<span style="font-family: Calibri;">draw calls</span>来生成所有物体的阴影贴图，但实际上，场景中某些固定的物体或者远处的物体，是没有必要使用实时计算的阴影的，使用提前生成的静态阴影即可。这可以节省<span style="font-family: Calibri;">draw calls</span>的数量，提高性能。图<span style="font-family: Calibri;">3</span>是优化前后的对比，右边是优化后的阴影贴图生成，减少了使用实时阴影的物体数量，可以看到<span style="font-family: Calibri;">draw calls</span>数量减少到了<span style="font-family: Calibri;">45</span>个，整个阴影地图生成花费的时间从<span style="font-family: Calibri;">2.97ms</span>减少到了<span style="font-family: Calibri;">1.03ms</span>。</span><span style="font-size: small;"><span style="font-family: Calibri;"> </span></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong><img class="aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan3.png" alt="" width="594" height="397" /></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">3. </span></strong><strong>优化前和优化后的阴影贴图计算</strong></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-family: Calibri; font-size: small;"> </span><span style="font-family: Times New Roman; font-size: small;"> </span><strong><span style="font-family: Calibri;">2. </span></strong><strong>天空盒</strong><strong> </strong></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;">天空盒在这个场景中是不可见的，但是帧分析器显示游戏依然渲染了它。我们可以在渲染之前检测天空盒的可见性，如果不可见，则不渲染。这可以节省<span style="font-family: Calibri;">0.88ms</span>。而且，天空盒最好是放到场景中不透明物体渲染完之后再渲染，因为天空盒的大部分都是被遮挡的。</span><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div><span style="font-size: small;"><strong><img class="aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan4.png" alt="" width="525" height="412" /></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">4. </span></strong><strong>游戏渲染了不可见的天空盒</strong></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><strong><span style="font-family: Calibri; font-size: small;"> </span></strong><strong><span style="font-family: Calibri;">3. </span></strong><strong>地形</strong><strong> </strong></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-size: small;"> </span></div>
<div><span style="font-size: small;">地形部分的渲染占用了最多的时间，网络游戏一般都是这样。</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-size: small;">其中一部分主要的地形，占用了<span style="font-family: Calibri;">6.5ms</span>中的<span style="font-family: Calibri;">5.1ms</span>，它们使用的同一段<span style="font-family: Calibri;">Pixel Shader</span>，以下是这部分地形的截屏：</span><span style="font-size: small;"><span style="font-family: Calibri;"> </span></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong><img class="size-large wp-image-400009556 aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan5-1024x507.png" alt="" width="717" height="355" /></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">5. </span></strong><strong>部分地形使用同样的<span style="font-family: Calibri;">Shader</span></strong><strong>，包含<span style="font-family: Calibri;">89</span></strong><strong>个指令，其中<span style="font-family: Calibri;">13</span></strong><strong>个纹理<span style="font-family: Calibri;">load</span></strong><strong>，<span style="font-family: Calibri;">76</span></strong><strong>个算术指令</strong></span></div>
<div style="text-align: left;"><span style="font-size: small;">过帧分析器我们可以看到，这部分地形的渲染，<span style="font-family: Calibri;">PS duration</span>占用了<span style="font-family: Calibri;">90%</span>的时间，在帧分析器中我们可以在<span style="font-family: Calibri;">Shader Tab</span>查看这些渲染所使用的<span style="font-family: Calibri;">shader code</span>，如图<span style="font-family: Calibri;">5</span>所示，这部分地形的<span style="font-family: Calibri;">shader </span>包含了<span style="font-family: Calibri;">89</span>条指令，其中<span style="font-family: Calibri;">13</span>个纹理<span style="font-family: Calibri;">load</span>，<span style="font-family: Calibri;">76</span>个数学计算，比较复杂。</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;">我们把<span style="font-family: Calibri;">shader</span>做了一定的简化，去掉了高光，<span style="font-family: Calibri;">normal map</span>，<span style="font-family: Calibri;">AO map</span>等。图<span style="font-family: Calibri;">6</span>是修改了<span style="font-family: Calibri;">pixel shader</span>后的截图，修改后<span style="font-family: Calibri;">pixel shader</span>包含<span style="font-family: Calibri;">31</span>条指令，其中<span style="font-family: Calibri;">8</span>个纹理<span style="font-family: Calibri;">load</span>，<span style="font-family: Calibri;">23</span>个算术指令。<span style="font-family: Calibri;"> </span>这部分地形渲染的时间从<span style="font-family: Calibri;">5.1ms</span>减少到了<span style="font-family: Calibri;">3.4ms</span>。</span><span style="font-size: small;"><span style="font-family: Calibri;"> </span></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong><img class="aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan6.png" alt="" width="780" height="386" /></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">6. </span></strong><strong>优化<span style="font-family: Calibri;">shader</span></strong><strong>代码后，这部分地形所花费的时间减少到了<span style="font-family: Calibri;">3.4ms</span></strong></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-family: Calibri; font-size: small;"> </span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-size: small;">我们还为特别低端的平台准备了更加简单的，只需要<span style="font-family: Calibri;">2</span>个纹理的<span style="font-family: Calibri;">shader</span>版本，时间进一步减少到了<span style="font-family: Calibri;">0.93ms</span>，见图<span style="font-family: Calibri;">7</span>所示：</span><span style="font-size: small;"><span style="font-family: Calibri;"> </span></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong><span style="font-size: small;"><strong><img class="aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan7.png" alt="" width="773" height="348" /></strong></span></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">7. </span></strong><strong>在更低端平台上进一步简化地形的<span style="font-family: Calibri;">pixel shader</span></strong></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><strong><span style="font-family: Calibri; font-size: small;"> </span></strong><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-size: small;">当然，使用<span style="font-family: Calibri;">2</span>个纹理后，地形画面质量肯定有所下降。在<span style="font-family: Calibri;">GPA</span>帧分析器我们能够实时的看到修改<span style="font-family: Calibri;">shader code</span>后对画面的影响。</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<h3><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-family: Calibri;"><strong>4. </strong><strong>UI</strong></span></h3>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-size: small;"><span style="font-family: Calibri;">UI</span>部分共占用<span style="font-family: Calibri;">7.4%</span>的时间，图<span style="font-family: Calibri;">8</span>是游戏中左上角的人物<span style="font-family: Calibri;">UI</span>截屏。<span style="font-size: small;"><strong><span style="font-size: small;"><strong> </strong></span></strong></span></span><span style="font-size: small;"><span style="font-family: Calibri;"> </span></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong><span style="font-size: small;"><strong><span style="font-size: small;"><strong><img class="size-full wp-image-400009559 aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan8.png" alt="" width="644" height="276" /></strong></span></strong></span></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">8. </span></strong><strong>游戏中左上角的角色<span style="font-family: Calibri;">UI</span></strong></span><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><strong><span style="font-family: Calibri; font-size: small;"> </span></strong></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-size: small;">通过帧分析器，我们发现为了画游戏左上角的人物头像以及血槽等部分，游戏使用了<span style="font-family: Calibri;">9</span>个<span style="font-family: Calibri;">draw calls</span>来完成（图<span style="font-family: Calibri;">9</span>），而且是每一帧都会花费<span style="font-family: Calibri;">9</span>个<span style="font-family: Calibri;">draw calls</span>来做这件事情。但是对网络游戏来说，<span style="font-family: Calibri;">99%</span>的时间，这部分是不会变化的，那么每帧都使用<span style="font-family: Calibri;">9</span>个<span style="font-family: Calibri;">draw call</span>来画这部分，是没有必要的。我们可以把这个头像部分先渲染到一个<span style="font-family: Calibri;">image buffer</span>，然后使用一个<span style="font-family: Calibri;">draw call</span>把这个<span style="font-family: Calibri;">image</span>画到屏幕上，如果下一帧这个头像部分没有更新，则继续使用上次的这个<span style="font-family: Calibri;">image buffer</span>。这样一来，只有在头像部分需要更新的时候，才去重新做这<span style="font-family: Calibri;">9</span>次<span style="font-family: Calibri;">draw calls</span>，其他时候，只需要一个<span style="font-family: Calibri;">draw call</span>就完成了。<strong> </strong></span><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div><span style="font-size: small;"><strong><strong><strong><img class="aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan9.png" alt="" width="720" height="371" /></strong></strong></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">9. </span></strong><strong>游戏使用了<span style="font-family: Calibri;">9</span></strong><strong>个<span style="font-family: Calibri;">draw calls</span></strong><strong>来完成这部分<span style="font-family: Calibri;">UI</span></strong><strong>的渲染</strong></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-family: Calibri; font-size: small;"> </span><span style="font-size: small;">图<span style="font-family: Calibri;">10</span>显示了优化后的截图，这一帧重利用了<span style="font-family: Calibri;">image buffer</span>，只使用了一个<span style="font-family: Calibri;">draw calls</span>就完成了这部分<span style="font-family: Calibri;">UI</span>的渲染。我们对其它的<span style="font-family: Calibri;">UI</span>也进行了类似的优化。优化后，渲染<span style="font-family: Calibri;">UI</span>所花费的时间从<span style="font-family: Calibri;">1.38ms</span>减少到了<span style="font-family: Calibri;">1.17ms</span>。</span><span style="font-size: small;"><span style="font-family: Calibri;"> </span></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong><strong><strong><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan10.png"><img class="aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan10.png" alt="" width="706" height="367" /></a></strong></strong></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">10. </span></strong><strong>使用<span style="font-family: Calibri;">image buffer</span></strong><strong>来存储这部分<span style="font-family: Calibri;">UI</span></strong><strong>以便重复使用</strong></span><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<h3><span style="font-family: Calibri; font-size: small;"> </span><strong><span style="font-family: Calibri;">5. </span></strong><strong>减少</strong><strong><span style="font-family: Calibri;">State Changes</span></strong><strong>数量</strong><strong> </strong></h3>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-size: small;"><span style="font-family: Calibri;">State Changes</span>过多会导致游戏程序，<span style="font-family: Calibri;">d3d runtime, </span>显卡驱动和显卡硬件的负载增加。减少<span style="font-family: Calibri;">State Changes</span>的数量能够提高游戏性能。通过帧分析器对这一帧的详细分析，我们发现有很多的<span style="font-family: Calibri;">draw calls</span>，都会使用很小的纹理，<span style="font-family: Calibri;">16*16</span>，<span style="font-family: Calibri;">32*32</span>或者<span style="font-family: Calibri;">64*64</span>大小，大量的使用小纹理，不是一种有效率的做法。图<span style="font-family: Calibri;">11</span>显示了两个相邻的<span style="font-family: Calibri;">draw calls</span>使用了非常小的纹理：</span></div>
<div><span style="font-family: Times New Roman; font-size: small;"><strong><strong> </strong></strong></span></div>
<div><span style="font-size: small;"><strong><img class="aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan11.png" alt="" width="575" height="431" /></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">11. </span></strong><strong>两个相邻的<span style="font-family: Calibri;">draw calls</span></strong><strong>，都使用了非常小的贴图</strong></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><strong><span style="font-family: Calibri; font-size: small;"> </span></strong><span style="font-size: small;">从上面图<span style="font-family: Calibri;">11</span>中我们看到，临近的的<span style="font-family: Calibri;">2</span>个<span style="font-family: Calibri;">draw calls,</span>分别调用了<span style="font-family: Calibri;">3</span>个<span style="font-family: Calibri;">SETTEXTURE API</span>，其中第二和第三个<span style="font-family: Calibri;">texture</span>，都是很小的纹理（见图<span style="font-family: Calibri;">12</span>）。我们可以合并这些小的纹理，然后只需要设置一次合并后的纹理，接下来的几个<span style="font-family: Calibri;">draw calls</span>就可以直接使用，而不用再设置了。这可以减少<span style="font-family: Calibri;">State Changes</span>的数量。当然，使用合并纹理的时候要注意设置正确的<span style="font-family: Calibri;">UV</span>值。</span><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong><img class="aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan12.png" alt="" width="575" height="430" /></strong></span></div>
<div><span style="font-size: small;"><strong><strong><strong> </strong></strong></strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong> </strong></span><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">12. </span></strong><strong>这些<span style="font-family: Calibri;">draw calls</span></strong><strong>所使用的小尺寸纹理</strong></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-family: Calibri; font-size: small;"> </span><span style="font-size: small;">图<span style="font-family: Calibri;">13</span>和<span style="font-family: Calibri;">14</span>是优化后的截屏，我们合并了<span style="font-family: Calibri;">3</span>个<span style="font-family: Calibri;">draw calls</span>所使用的小纹理，<span style="font-family: Calibri;">SETTEXTURE API</span>调用的次数从<span style="font-family: Calibri;">9</span>次减少到了<span style="font-family: Calibri;">4</span>次。整个一帧，我们减少了<span style="font-family: Calibri;">~500</span>次<span style="font-family: Calibri;">State Changes</span>。</span><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong><img class="aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan13.png" alt="" width="575" height="431" /></strong></span></div>
<div><span style="font-size: small;"><strong><strong><strong><strong> </strong></strong></strong></strong></span><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">13. </span></strong><strong>合并纹理后，<span style="font-family: Calibri;">3</span></strong><strong>个<span style="font-family: Calibri;">draw calls</span></strong><strong>所调用的<span style="font-family: Calibri;">SETTEXTURE API</span></strong><strong>从<span style="font-family: Calibri;">9</span></strong><strong>次减少到了<span style="font-family: Calibri;">4</span></strong><strong>次</strong></span><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;"><strong><strong><strong><strong><strong><img class="aligncenter" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/xuanyuan14.png" alt="" width="575" height="430" /></strong></strong></strong></strong></strong></span></div>
<div><span style="font-size: small;"><strong> </strong></span></div>
<div style="text-align: center;"><span style="font-size: small;"><strong>图<span style="font-family: Calibri;">14. </span></strong><strong>将小纹理合并后得到的大纹理</strong></span></div>
<div><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-family: Calibri; font-size: small;"> </span><span style="font-family: Times New Roman; font-size: small;"> </span><strong> </strong></div>
<h2><strong>优化总结：</strong><strong> </strong></h2>
<div><span style="font-family: Times New Roman; font-size: small;"> </span></div>
<div><span style="font-size: small;">我们介绍了在英特尔集成显卡平台上通过<span style="font-family: Calibri;">GPA</span>对游戏性能进行分析和优化的成功案例。<span style="font-family: Calibri;">GPA</span>工具帮助我们找到了游戏的瓶颈所在。我们使用它对一帧进行了深入的分析，对<span style="font-family: Calibri;">shader</span>进行了实时修改，并找到了减少<span style="font-family: Calibri;">State changes</span>数量的办法。经过优化，游戏性能得到了很大提升，能让更多玩家流畅体验轩辕传奇这款游戏。其实我们还使用<span style="font-family: Calibri;">GPA</span>对其他不同场景，不同状态（聊天，骑乘，战斗，换装，技能特效等），不同平台（各个厂商的独立显卡，集成显卡以及不同型号的<span style="font-family: Calibri;">CPU</span>），不同系统进行了各种测试，限于篇幅这里只挑出了一个有代表性的例子。</span></div>
<p><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-family: Times New Roman; font-size: small;"> </span><span style="font-family: Times New Roman; font-size: small;"> </span></p>
<div><strong>作者简介</strong><span style="font-size: small;">：</span></div>
<div><span style="font-size: small;"><strong>卢卷彬</strong><strong><span style="font-family: Calibri;"> </span></strong>是英特尔公司的应用工程师，他和国内几家大的游戏公司有着多年的合作，帮助他们在英特尔平台上优化游戏客户端的性能。</span></div>
<div><span style="font-size: small;"><strong>丛越</strong><strong><span style="font-family: Calibri;"> </span></strong>有<span style="font-family: Calibri;">8</span>年以上的游戏开发经验，他参加了中国最早期的<span style="font-family: Calibri;">3D MMORPG</span>的开发，有着非常丰富的经验。丛越现在就职于腾讯，主要负责游戏和引擎的开发。<span style="font-family: Calibri;"> </span></span></div>
<div><span style="font-size: small;"><span style="font-family: Calibri;"><strong>Kiefer Kuah</strong> </span>是英特尔的软件工程师，他主要负责游戏在英特尔平台上的优化工作。</span></div>
<div> </div>
<p> Appendix A:</p>
<p>Platform Configuration:CPU:  Intel Core i7-2720QM @ 2.20GHz, with HD 3000 graphics</p>
<div>Memory: 8GB DDR3 1333Mhz</div>
<div>HD: Intel 160G SSD</div>
<div>OS: Windows 7 Professional, 64bit</div>
<div>Graphics Driver: 8.15.10.2509</div>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/12/26/gpa-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2008春季IDF的Smoke Demo</title>
		<link>http://software.intel.com/zh-cn/blogs/2008/04/29/2008idfsmoke-demo/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2008/04/29/2008idfsmoke-demo/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 01:30:12 +0000</pubDate>
		<dc:creator>Cage Lu (Intel)</dc:creator>
				<category><![CDATA[并行计算]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2008/04/29/2008idfsmoke-demo/</guid>
		<description><![CDATA[今年4月2日和3日，我有幸参加了英特尔2008年度IDF。在这次展会中，我和一位美国的同事负责一个展台（因为他不会说中文）。展台的内容是一个名为“烟雾” 的demo，运行在英特尔下一代Nehalem架构的CPU平台上，该平台有4个CPU核心，支持8个线程同时运行。该demo的主要目的就是向游戏开发者展示如何将一个游戏的多个模块进行多线程化。这个叫“Smoke”的demo，几乎可以将所有的CPU都利用上，从游戏截图我们可以看到，8个逻辑CPU的利用率几乎都达到了60%~70%。在这个demo运行时我们也可以指定游戏以4个线程或者2个线程来运行，游戏的帧率也随之下降。   多核心处理器是越来越普遍了,最低端的双核CPU价格在400块人民币左右，新买机器的人，已经不会考虑单核CPU了，尤其是台式机。一些中高端的玩家甚至已经开始使用4核心了。然而现在市场上的游戏，绝大多数都没有做很多的多线程工作，我们玩游戏的时候，多余的1个或者3个CPU核心都白白的空闲着。如果利用多线程变成来充分使用空闲的CPU计算资源，是游戏开发者需要思考的一个问题。 基本上多线程有2个好处，一个是提高游戏的帧率。如果我的游戏单线程的时候只能在20fps以下，无法流畅的运行。那么我尝试将游戏中的一些计算模块，比如动画，AI，物理，粒子等分离出来，用单独的线程来计算，在需要这些模块计算结果的时候同步等待一下，那么就可以利用空闲的CPU计算资源，从而提高游戏的帧率。另外一个好处就是可以增加游戏的特性。我们的游戏策划者都有很好的点子，给游戏增加一些吸引人的特性，但是这些特性需要额外的计算，如果按照单线程来开发，势必是影响游戏的性能，这就限制了我们的想法。但如果我们的游戏是多线程过的，那么就有更多的空间来允许我们增加额外的计算，发挥我们的创意。 英特尔通过自己开发游戏demo（比如以前的“城堡破坏游戏”和这个“烟雾”）供游戏开发者参考，或直接与游戏开发者合作，来帮助他们将自己的游戏多线程化。这些demo都是免费提供源代码的。当然，每个游戏架构都不一样，这些demo只能给你一个参考，也许你会从它们的多线程方法中得到一些启示。   据说，恩，据说，需要Smoke demo代码的，可以发送邮件到smokecode@intel.com索取，当前该demo还在开发当中，还无法提供代码，以后可以提供的时候，估计会发邮件通知。 另外再加2句，不要抱怨这些demo的画面和效果，也许有人会说我用单线程可以做出比这好许多和快许多的场景。请记住这只是demo，不是要上市的产品，主要是介绍多线程游戏的方法，利用这些方法，或许可以帮助游戏开发者做出更好的游戏。]]></description>
			<content:encoded><![CDATA[<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2008/05/p1130522s.jpg" title="p1130522s.jpg" class="broken_link"></a></p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2008/05/p1130523ss.jpg" title="p1130523ss.jpg"></a>今年<font face="Times New Roman">4</font>月<font face="Times New Roman">2</font>日和<font face="Times New Roman">3</font>日，我有幸参加了英特尔<font face="Times New Roman">2008</font>年度<font face="Times New Roman">IDF</font>。在这次展会中，我和一位美国的同事负责一个展台（因为他不会说中文）。展台的内容是一个名为“烟雾”<font face="Times New Roman"> </font>的<font face="Times New Roman">demo</font>，运行在英特尔下一代<font face="Times New Roman">Nehalem</font>架构的<font face="Times New Roman">CPU</font>平台上，该平台有<font face="Times New Roman">4</font>个<font face="Times New Roman">CPU</font>核心，支持<font face="Times New Roman">8</font>个线程同时运行。该<font face="Times New Roman">demo</font>的主要目的就是向游戏开发者展示如何将一个游戏的多个模块进行多线程化。这个叫“<font face="Times New Roman">Smoke</font>”的<font face="Times New Roman">demo</font>，几乎可以将所有的<font face="Times New Roman">CPU</font>都利用上，从游戏截图我们可以看到，<font face="Times New Roman">8</font>个逻辑<font face="Times New Roman">CPU</font>的利用率几乎都达到了<font face="Times New Roman">60%~70%</font>。在这个<font face="Times New Roman">demo</font>运行时我们也可以指定游戏以<font face="Times New Roman">4</font>个线程或者<font face="Times New Roman">2</font>个线程来运行，游戏的帧率也随之下降。</p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2008/05/p1130522s.jpg" title="p1130522s.jpg" class="broken_link"></a></p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2008/05/p1130522s.jpg" title="p1130522s.jpg" class="broken_link"></a></p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2008/05/p1130522s.jpg" title="p1130522s.jpg" class="broken_link"></a></p>
<p> <a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2008/05/p1130522ss.jpg" title="p1130522ss.jpg"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2008/05/p1130522ss.jpg" alt="p1130522ss.jpg" /></a></p>
<p>多核心处理器是越来越普遍了<font face="Times New Roman">,</font>最低端的双核<font face="Times New Roman">CPU</font>价格在<font face="Times New Roman">400</font>块人民币左右，新买机器的人，已经不会考虑单核<font face="Times New Roman">CPU</font>了，尤其是台式机。一些中高端的玩家甚至已经开始使用<font face="Times New Roman">4</font>核心了。然而现在市场上的游戏，绝大多数都没有做很多的多线程工作，我们玩游戏的时候，多余的<font face="Times New Roman">1</font>个或者<font face="Times New Roman">3</font>个<font face="Times New Roman">CPU</font>核心都白白的空闲着。如果利用多线程变成来充分使用空闲的<font face="Times New Roman">CPU</font>计算资源，是游戏开发者需要思考的一个问题。</p>
<p>基本上多线程有<font face="Times New Roman">2</font>个好处，一个是提高游戏的帧率。如果我的游戏单线程的时候只能在<font face="Times New Roman">20fps</font>以下，无法流畅的运行。那么我尝试将游戏中的一些计算模块，比如动画，<font face="Times New Roman">AI</font>，物理，粒子等分离出来，用单独的线程来计算，在需要这些模块计算结果的时候同步等待一下，那么就可以利用空闲的<font face="Times New Roman">CPU</font>计算资源，从而提高游戏的帧率。另外一个好处就是可以增加游戏的特性。我们的游戏策划者都有很好的点子，给游戏增加一些吸引人的特性，但是这些特性需要额外的计算，如果按照单线程来开发，势必是影响游戏的性能，这就限制了我们的想法。但如果我们的游戏是多线程过的，那么就有更多的空间来允许我们增加额外的计算，发挥我们的创意。</p>
<p>英特尔通过自己开发游戏<font face="Times New Roman">demo</font>（比如以前的“城堡破坏游戏”和这个“烟雾”）供游戏开发者参考，或直接与游戏开发者合作，来帮助他们将自己的游戏多线程化。这些<font face="Times New Roman">demo</font>都是免费提供源代码的。当然，每个游戏架构都不一样，这些<font face="Times New Roman">demo</font>只能给你一个参考，也许你会从它们的多线程方法中得到一些启示。</p>
<p><a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2008/05/p1130523ss.jpg" title="p1130523ss.jpg"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2008/05/p1130523ss.jpg" alt="p1130523ss.jpg" /></a> </p>
<p>据说，恩，据说，需要<font face="Times New Roman">Smoke demo</font>代码的，可以发送邮件到<font face="Times New Roman">smokecode@intel.com</font>索取，当前该<font face="Times New Roman">demo</font>还在开发当中，还无法提供代码，以后可以提供的时候，估计会发邮件通知。</p>
<p>另外再加<font face="Times New Roman">2</font>句，不要抱怨这些<font face="Times New Roman">demo</font>的画面和效果，也许有人会说我用单线程可以做出比这好许多和快许多的场景。请记住这只是<font face="Times New Roman">demo</font>，不是要上市的产品，主要是介绍多线程游戏的方法，利用这些方法，或许可以帮助游戏开发者做出更好的游戏。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2008/04/29/2008idfsmoke-demo/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

