<?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; 图形和视觉计算</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/category/visual-computing/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Mon, 06 Feb 2012 03:24:52 +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>OpenCV轻松进阶初级篇（三）如何添加Intel IPP和TBB库</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/02/06/opencvintel-ipptbb/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/02/06/opencvintel-ipptbb/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 03:24:52 +0000</pubDate>
		<dc:creator>Yanqing Wang (Intel)</dc:creator>
				<category><![CDATA[Blog Challenge]]></category>
		<category><![CDATA[全国博客大奖赛]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[软件技术学习及认证]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/02/06/opencvintel-ipptbb/</guid>
		<description><![CDATA[&#160; Intel IPP和TBB能够给OpenCV带来性能上的很大提升，那么如何在编译OpenCV的时候讲其打开呢？ &#160; OpenCV轻松进阶初级篇（二）编译OpenCV中已经介绍了使用CMake工具来产生各种编译器的项目文件，那么是否可以通过它来Enabled这些Features呢？ &#160; 非常的运气，在CMake的配置键值对中，我们找到了IPP和TBB的身影，如图1所示。 图1 编译步骤： 1）&#160; 使用CMake打开OpenCV的文件 2）&#160; 点击Configure按钮产生所有的键值对列表 3）&#160; 选择WITH_IPP和WITH_TBB选项，如图1红色边框所示。 4）&#160; 点击Generate按钮产生相关项目文件 &#160; &#160;]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">Intel IPP</span><span style='font-family:宋体'>和</span><span lang="EN-US">TBB</span><span style='font-family:宋体'>能够给</span><span class="SpellE"><span lang="EN-US">OpenCV</span></span><span style='font-family:宋体'>带来性能上的很大提升，那么如何在编译</span><span class="SpellE"><span lang="EN-US">OpenCV</span></span><span style='font-family:宋体'>的时候讲其打开呢？</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US"><a href="http://software.intel.com/zh-cn/blogs/2011/12/01/opencvopencv-2/" title="永久链接： OpenCV轻松进阶初级篇（二）编译OpenCV">OpenCV<span lang="EN-US" style='font-family:宋体'><span lang="EN-US">轻松进阶初级篇（二）编译</span></span>OpenCV</a></span><span style='font-family:宋体'>中已经介绍了使用</span><span class="SpellE"><span lang="EN-US">CMake</span></span><span style='font-family:宋体'>工具来产生各种编译器的项目文件，那么是否可以通过它来</span><span lang="EN-US">Enabled</span><span style='font-family:宋体'>这些</span><span lang="EN-US">Features</span><span style='font-family:宋体'>呢？</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span style='font-family:宋体'>非常的运气，在</span><span class="SpellE"><span lang="EN-US">CMake</span></span><span style='font-family:宋体'>的配置键值对中，我们找到了</span><span lang="EN-US">IPP</span><span style='font-family:宋体'>和</span><span lang="EN-US">TBB</span><span style='font-family:宋体'>的身影，如图</span><span lang="EN-US">1</span><span style='font-family:宋体'>所示。</span></p>
<p class="MsoNormal"><span lang="EN-US"><!--[if gte vml 1]&gt;--></p>
<p><img border="0" width="554" height="416" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/02/CMake.png"></span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span style='font-family:宋体'>图</span><span lang="EN-US">1</span></p>
<p class="MsoNormal"><b><span style='font-family:宋体'>编译步骤：</span><span lang="EN-US"></span></b></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US"><span>1）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span></span><span style='font-family:宋体'>使用</span><span class="SpellE"><span lang="EN-US">CMake</span></span><span style='font-family:宋体'>打开</span><span class="SpellE"><span lang="EN-US">OpenCV</span></span><span style='font-family:宋体'>的文件</span></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US"><span>2）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span></span><span style='font-family:宋体'>点击</span><span lang="EN-US">Configure</span><span style='font-family:宋体'>按钮产生所有的键值对列表</span></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US"><span>3）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span></span><span style='font-family:宋体'>选择</span><span lang="EN-US">WITH_IPP</span><span style='font-family:宋体'>和</span><span lang="EN-US">WITH_TBB</span><span style='font-family:宋体'>选项，如图</span><span lang="EN-US">1</span><span style='font-family:宋体'>红色边框所示。</span></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US"><span>4）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span></span><span style='font-family:宋体'>点击</span><span lang="EN-US">Generate</span><span style='font-family:宋体'>按钮产生相关项目文件</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/02/06/opencvintel-ipptbb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>简介Intel Media SDK 2012</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/02/06/intel-media-sdk-2012-2/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/02/06/intel-media-sdk-2012-2/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 02:42:15 +0000</pubDate>
		<dc:creator>Yanqing Wang (Intel)</dc:creator>
				<category><![CDATA[Blog Challenge]]></category>
		<category><![CDATA[全国博客大奖赛]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[英特尔® 软件网络 2.0]]></category>
		<category><![CDATA[软件技术学习及认证]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/02/06/intel-media-sdk-2012-2/</guid>
		<description><![CDATA[&#160; Intel Media SDK现在使用新的名字规则了！如果按照以前版本的名字规则，那么它对应是Intel Media SDK3.0 Gold版本。网友可以从http://software.intel.com/en-us/articles/vcsource-tools-media-sdk/?cid=sw:mediadev004 下载到最新版本。 图1 下载步骤： 1）&#160; 在图1中，选择红色方框中的下拉菜单“Intel Media SDK 2012”。 2）&#160; 点击“Download“按钮 &#160; 现在的Intel Media SDK 2012实现了双跨： 1）&#160; 跨硬件平台，在无Intel GPU支持的系统中，也能实现视音频的编解码工作。 2）&#160; 跨软件平台，在windows vista和windows 7上都能够运行，并且完整支持它们的32和64bits。 &#160; Intel Media SDK 2012不仅仅实现了高性能的视音频解码，它的APIs也为视音频开发者提供了便捷。更加可贵的是，它提供了免费的SDK下载包，对于视音频开发者来说，也是福音。 &#160; &#160;]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">Intel Media SDK</span><span style='font-family:宋体'>现在使用新的名字规则了！如果按照以前版本的名字规则，那么它对应是</span><span lang="EN-US">Intel Media SDK3.0 Gold</span><span style='font-family:宋体'>版本。网友可以从</span><span lang="EN-US"><a href="http://software.intel.com/en-us/articles/vcsource-tools-media-sdk/?cid=sw:mediadev004">http://software.intel.com/en-us/articles/vcsource-tools-media-sdk/?cid=sw:mediadev004</a><br />
</span><span style='font-family:宋体'>下载到最新版本。</span></p>
<p class="MsoNormal"><span lang="EN-US"><!--[if gte vml 1]&gt;--><br />
<img border="0" width="553" height="352" src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2012/02/Intel-Media-SDK-2012.png"></span></p>
<p class="MsoNormal" align="center" style='text-align:center'><span style='font-family:宋体'>图</span><span lang="EN-US">1</span></p>
<p class="MsoNormal"><b><span style='font-family:宋体'>下载步骤：</span><span lang="EN-US"></span></b></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US"><span>1）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span></span><span style='font-family:宋体'>在图</span><span lang="EN-US">1</span><span style='font-family:宋体'>中，选择红色方框中的下拉菜单“</span><span lang="EN-US">Intel Media SDK 2012</span><span style='font-family:宋体'>”。</span></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US"><span>2）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span></span><span style='font-family:宋体'>点击“</span><span lang="EN-US">Download</span><span style='font-family:宋体'>“按钮</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><b><span style='font-family:宋体'>现在的</span><span lang="EN-US">Intel Media SDK 2012</span></b><b><span style='font-family:宋体'>实现了双跨：</span><span lang="EN-US"></span></b></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US"><span>1）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span></span><span style='font-family:宋体'>跨硬件平台，在无</span><span lang="EN-US">Intel<br />
GPU</span><span style='font-family:宋体'>支持的系统中，也能实现视音频的编解码工作。</span></p>
<p class="MsoListParagraph" style='margin-left:18.0pt;text-indent:-18.0pt'><span lang="EN-US"><span>2）<span style='font:7.0pt "Times New Roman"'>&nbsp; </span></span></span><span style='font-family:宋体'>跨软件平台，在</span><span lang="EN-US">windows<br />
vista</span><span style='font-family:宋体'>和</span><span lang="EN-US">windows 7</span><span style='font-family:宋体'>上都能够运行，并且完整支持它们的</span><span lang="EN-US">32</span><span style='font-family:宋体'>和</span><span lang="EN-US">64bits</span><span style='font-family:宋体'>。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">Intel Media SDK 2012</span><span style='font-family:宋体'>不仅仅实现了高性能的视音频解码，它的</span><span lang="EN-US">APIs</span><span style='font-family:宋体'>也为视音频开发者提供了便捷。更加可贵的是，它提供了免费的</span><span lang="EN-US">SDK</span><span style='font-family:宋体'>下载包，对于视音频开发者来说，也是福音。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/02/06/intel-media-sdk-2012-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>英特尔媒体开发套件 Intel Media SDK 2012 发布了</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/02/01/intel-media-sdk-2012/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/02/01/intel-media-sdk-2012/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 07:40:19 +0000</pubDate>
		<dc:creator>王有伟 Youwei Wang (Intel)</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/02/01/intel-media-sdk-2012/</guid>
		<description><![CDATA[英特尔媒体开发套件最新版本没有延续1.0, 2.0, 3.0的称呼， 而是直接称为2012， 实际对应的就是3.0 Gold（这也可以从安装包的文件名中得到验证）。下载地址：http://software.intel.com/en-us/articles/vcsource-tools-media-sdk/ 跟之前版本相比， MediaSDK 2012中比较大的变化： （1）bin目录下预先编译的二进制库文件和可执行程序， 全部到samples\_bin下， 只保留了软件实现的库文件 （2）tools下增加了一个新的用于测试系统media SDK 能力的工具: mediaSDK system analyzer. 运行该程序会产生一个报告，包含当前系统支持的media SDK 的版本， 图形显卡的类型及驱动的版本， 系统安装的media SDK 开发包的情况等。 （3）增加了一个新的模块， igfx_s3dcontrol, 用于S3D 显示和编程， 其中包含了编程所用的头文件和库文件。 （4）sample_decode中增加了对JPEG图片和视屏墙的支持]]></description>
			<content:encoded><![CDATA[<p>      英特尔媒体开发套件最新版本没有延续1.0, 2.0, 3.0的称呼， 而是直接称为2012， 实际对应的就是3.0 Gold（这也可以从安装包的文件名中得到验证）。下载地址：http://software.intel.com/en-us/articles/vcsource-tools-media-sdk/</p>
<p>    跟之前版本相比， MediaSDK 2012中比较大的变化：<br />
（1）bin目录下预先编译的二进制库文件和可执行程序， 全部到samples\_bin下， 只保留了软件实现的库文件</p>
<p>（2）tools下增加了一个新的用于测试系统media SDK 能力的工具: mediaSDK system analyzer. 运行该程序会产生一个报告，包含当前系统支持的media SDK 的版本， 图形显卡的类型及驱动的版本， 系统安装的media SDK 开发包的情况等。</p>
<p>（3）增加了一个新的模块， igfx_s3dcontrol, 用于S3D 显示和编程， 其中包含了编程所用的头文件和库文件。</p>
<p> （4）sample_decode中增加了对JPEG图片和视屏墙的支持</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/02/01/intel-media-sdk-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>OpenCV学习笔记（五）——2.0以上版本和以下版本的数据兼容</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv20/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv20/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 07:59:30 +0000</pubDate>
		<dc:creator>yang_xian521</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/06/opencv20/</guid>
		<description><![CDATA[都知道，2.0版本对之前的OpenCV数据结构进行了大幅度的修改。但对之前版本的兼容是一个很重要的事情。这节就主要讨论这个问题 首先来看一下2.0版本对之前版本的进行了哪些修改 1.采用了新的数据结构Mat作为图像的容器，取代了之前的CvMat和lplImage，这个改动不是太复杂，只需适应一下新东西，而且可以自由转换 Mat I; IplImage pI = I; CvMat mI = I; 对于指针的操作要相对复杂一些，而且还要注意内存的释放，我这里不推荐用老版本的数据结构，例如： Mat I; IplImage* pI = &#38;I.operator IplImage(); CvMat* mI = &#38;I.operator CvMat(); 2.对library进行了重组，将原来的一个大库根据功能结构分成具体小库，这样包含头文件的时候只需要加入你需要的库，只是原来库的子集 3.使用了cv 这个namespace来防止和其他的library 结构冲突。所以在使用的时候也要预先加上cv::关键字，这也是新版本的函数，数据都省略了cv前缀的原因，一般放在include之后，格式为： using namespace cv; // The new C++ interface API is inside this namespace. Import it.]]></description>
			<content:encoded><![CDATA[<p>都知道，2.0版本对之前的OpenCV数据结构进行了大幅度的修改。但对之前版本的兼容是一个很重要的事情。这节就主要讨论这个问题<br />
首先来看一下2.0版本对之前版本的进行了哪些修改<br />
1.采用了新的数据结构Mat作为图像的容器，取代了之前的CvMat和lplImage，这个改动不是太复杂，只需适应一下新东西，而且可以自由转换<br />
<code>Mat I;<br />
IplImage pI = I;<br />
CvMat mI = I;<br />
</code><br />
对于指针的操作要相对复杂一些，而且还要注意内存的释放，我这里不推荐用老版本的数据结构，例如：<br />
<code>Mat I;<br />
IplImage* pI = &amp;I.operator IplImage();<br />
CvMat* mI = &amp;I.operator CvMat();<br />
</code><br />
2.对library进行了重组，将原来的一个大库根据功能结构分成具体小库，这样包含头文件的时候只需要加入你需要的库，只是原来库的子集<br />
3.使用了cv 这个namespace来防止和其他的library 结构冲突。所以在使用的时候也要预先加上cv::关键字，这也是新版本的函数，数据都省略了cv前缀的原因，一般放在include之后，格式为：<br />
<code>using namespace cv; // The new C++ interface API is inside this namespace. Import it.<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCV学习笔记（四）——新版本的数据结构core</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/06/opencvcore/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/06/opencvcore/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 07:59:14 +0000</pubDate>
		<dc:creator>yang_xian521</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/06/opencvcore/</guid>
		<description><![CDATA[2.0新版本对数据结构进行了大幅修改： 定义了DataType类 定义了Point_模板类，取代了之前版本的CvPoint、CvPoint2D32f 定义了Point3_模板类，取代了之前版本的CvPoint2D32f 定义了Size_模板类，取代了之前版本的CvSize和CvSize2D32f 定义了Rect_模板类，取代了之前版本的CvRect RotatedRect模板类， TermCriteria模板类，取代了之前的CvTermCriteria，这个类是作为迭代算法的终止条件的，这个类在参考手册里介绍的很简单，我查了些资料，这里介绍一下。该类变量需要3个参数，一个是类型，第二个参数为迭代的最大次数，最后一个是特定的阈值。类型有CV_TERMCRIT_ITER、CV_TERMCRIT_EPS、CV_TERMCRIT_ITER+CV_TERMCRIT_EPS，分别代表着迭代终止条件为达到最大迭代次数终止，迭代到阈值终止，或者两者都作为迭代终止条件。以上的宏对应的c++的版本分别为TermCriteria::COUNT、TermCriteria::EPS，这里的COUNT也可以写成MAX_ITER。 Matx模板类。Matx模板类是对Mat类的一个拓展，从Matx类有派生出Vec类，又Vec类又派生出Scalar_类，取代了CvScalar 定义了Range类指定了一个序列的一个连续的子序列 定义了Ptr类用来对老版本的数据结构进行指针操作，更安全有效，可以防止内存的不正常使用。 最最重要的定义了Mat类来表示矩阵，取代了之前的CvMat和lplImage。Mat结构支持的操作有： 构造析构函数Mat和~Mat 对=、MatExpr、( )、CvMat、IplImage进行了运算符重载 row、col函数 rowRange、colRange 类似matlab的运算操作diag、t、inv、mul、cross、dot、zeros、one、eye 复制转换变形clone、copyTo、convertTo、assignTo、setTo、reshape、create、addref 其中copyTo函数有个妙用，不但可以复制Mat，还可以通过mask提取出感兴趣的部分 数据的操作release、resize、reserve、push_back、pop_back、locateROI、adjustROI Mat的信息total、isContinuous、elemSize、elemSize1、type、depth、channes、step1、size、empty 定位ptr、at、begin、end 还做了几个扩展类Mat_、NAryMatlterator、SparseMat、SparseMat_取代了之前的CvSparseMat。这些类的操作运算与Mat大同小异，类声明参考core的具体头文件 当然，新版本对老版本的数据结构和函数依然支持。 新版本还在这些结构里支持dft、dct变换，我这里讲一下我的新发现PCA类、SVD类 PCA类有构造函数PCA，运算符重载()，project，backProject。SVD类有构造函数SVD，运算符重载()，compute，solveZ，backSubst 这里介绍几个我使用过的实用函数： inRange函数可以检查Matsrc的内容是否在Matlower、Matupper之间，输出结果是一个uchar型矩阵，1表示在两者之间，否则为0，值得注意的是，Matlower，Matupper也可以用Scalar的格式 bitwise_xxx函数对两个矩阵进行位运算，结果保存在第三个矩阵当中 mixChannels函数可以实现矩阵的指定通道复制到新矩阵的指定通道 总之，新版本支持更多的数学运算，还支持一些画图操作]]></description>
			<content:encoded><![CDATA[<p>2.0新版本对数据结构进行了大幅修改：</p>
<p>定义了DataType类</p>
<p>定义了Point_模板类，取代了之前版本的CvPoint、CvPoint2D32f</p>
<p>定义了Point3_模板类，取代了之前版本的CvPoint2D32f</p>
<p>定义了Size_模板类，取代了之前版本的CvSize和CvSize2D32f</p>
<p>定义了Rect_模板类，取代了之前版本的CvRect</p>
<p>RotatedRect模板类，</p>
<p>TermCriteria模板类，取代了之前的CvTermCriteria，这个类是作为迭代算法的终止条件的，这个类在参考手册里介绍的很简单，我查了些资料，这里介绍一下。该类变量需要3个参数，一个是类型，第二个参数为迭代的最大次数，最后一个是特定的阈值。类型有CV_TERMCRIT_ITER、CV_TERMCRIT_EPS、CV_TERMCRIT_ITER+CV_TERMCRIT_EPS，分别代表着迭代终止条件为达到最大迭代次数终止，迭代到阈值终止，或者两者都作为迭代终止条件。以上的宏对应的c++的版本分别为TermCriteria::COUNT、TermCriteria::EPS，这里的COUNT也可以写成MAX_ITER。</p>
<p>Matx模板类。Matx模板类是对Mat类的一个拓展，从Matx类有派生出Vec类，又Vec类又派生出Scalar_类，取代了CvScalar</p>
<p>定义了Range类指定了一个序列的一个连续的子序列</p>
<p>定义了Ptr类用来对老版本的数据结构进行指针操作，更安全有效，可以防止内存的不正常使用。</p>
<p>最最重要的定义了Mat类来表示矩阵，取代了之前的CvMat和lplImage。Mat结构支持的操作有：</p>
<p>构造析构函数Mat和~Mat</p>
<p>对=、MatExpr、( )、CvMat、IplImage进行了运算符重载</p>
<p>row、col函数</p>
<p>rowRange、colRange</p>
<p>类似matlab的运算操作diag、t、inv、mul、cross、dot、zeros、one、eye</p>
<p>复制转换变形clone、copyTo、convertTo、assignTo、setTo、reshape、create、addref</p>
<p>其中copyTo函数有个妙用，不但可以复制Mat，还可以通过mask提取出感兴趣的部分</p>
<p>数据的操作release、resize、reserve、push_back、pop_back、locateROI、adjustROI</p>
<p>Mat的信息total、isContinuous、elemSize、elemSize1、type、depth、channes、step1、size、empty</p>
<p>定位ptr、at、begin、end</p>
<p>还做了几个扩展类Mat_、NAryMatlterator、SparseMat、SparseMat_取代了之前的CvSparseMat。这些类的操作运算与Mat大同小异，类声明参考core的具体头文件</p>
<p>当然，新版本对老版本的数据结构和函数依然支持。</p>
<p>新版本还在这些结构里支持dft、dct变换，我这里讲一下我的新发现PCA类、SVD类</p>
<p>PCA类有构造函数PCA，运算符重载()，project，backProject。SVD类有构造函数SVD，运算符重载()，compute，solveZ，backSubst</p>
<p>这里介绍几个我使用过的实用函数：</p>
<p>inRange函数可以检查Matsrc的内容是否在Matlower、Matupper之间，输出结果是一个uchar型矩阵，1表示在两者之间，否则为0，值得注意的是，Matlower，Matupper也可以用Scalar的格式</p>
<p>bitwise_xxx函数对两个矩阵进行位运算，结果保存在第三个矩阵当中</p>
<p>mixChannels函数可以实现矩阵的指定通道复制到新矩阵的指定通道</p>
<p>总之，新版本支持更多的数学运算，还支持一些画图操作</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/06/opencvcore/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCV学习笔记（二）——新版本模块结构</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv-2/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv-2/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 07:58:58 +0000</pubDate>
		<dc:creator>yang_xian521</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[图形和视觉计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/06/opencv-2/</guid>
		<description><![CDATA[还是老话题，2.0版本对OpenCV可是进行了大刀阔斧的改革，用c++重新了大部分结构，而不是1.X版本中的c结构。这些模块包括： core——定义了基本数据结构，包括最重要的Mat和一些其他的模块 imgproc——该模块包括了线性和非线性的图像滤波，图像的几何变换，颜色空间转换，直方图处理等等 video——该模块包括运动估计，背景分离，对象跟踪 calib3d——基本的多视角几何算法，单个立体摄像头标定，物体姿态估计，立体相似性算法，3D信息的重建 features2d——显著特征检测，描述，特征匹配 objdetect——物体检测和预定义好的分类器实例（比如人脸，眼睛，面部，人，车辆等等） highgui——视频捕捉、图像和视频的编码解码、图形交互界面的接口 gpu——利用GPU对OpenCV模块进行加速算法 ml——机器学习模块（SVM，决策树，Boosting等等） flann——Fast Library for Approximate Nearest Neighbors（FLANN）算法库 legacy——一些已经废弃的代码库，保留下来作为向下兼容 还有一些其他的模块，比如FLANN算法库、Google测试包、Python bingdings等等。]]></description>
			<content:encoded><![CDATA[<p>还是老话题，2.0版本对OpenCV可是进行了大刀阔斧的改革，用c++重新了大部分结构，而不是1.X版本中的c结构。这些模块包括：</p>
<p>core——定义了基本数据结构，包括最重要的Mat和一些其他的模块</p>
<p>imgproc——该模块包括了线性和非线性的图像滤波，图像的几何变换，颜色空间转换，直方图处理等等</p>
<p>video——该模块包括运动估计，背景分离，对象跟踪</p>
<p>calib3d——基本的多视角几何算法，单个立体摄像头标定，物体姿态估计，立体相似性算法，3D信息的重建</p>
<p>features2d——显著特征检测，描述，特征匹配</p>
<p>objdetect——物体检测和预定义好的分类器实例（比如人脸，眼睛，面部，人，车辆等等）</p>
<p>highgui——视频捕捉、图像和视频的编码解码、图形交互界面的接口</p>
<p>gpu——利用GPU对OpenCV模块进行加速算法</p>
<p>ml——机器学习模块（SVM，决策树，Boosting等等）</p>
<p>flann——Fast Library for Approximate Nearest Neighbors（FLANN）算法库</p>
<p>legacy——一些已经废弃的代码库，保留下来作为向下兼容</p>
<p>还有一些其他的模块，比如FLANN算法库、Google测试包、Python bingdings等等。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCV学习笔记（三）——Mat，图像的新容器</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/06/opencvmat/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/06/opencvmat/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 07:58:38 +0000</pubDate>
		<dc:creator>yang_xian521</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/06/opencvmat/</guid>
		<description><![CDATA[自从版本2.0，OpenCV采用了新的数据结构，用Mat类结构取代了之前用extended C写的cvMat和lplImage，更加好用啦，最大的好处就是更加方便的进行内存管理，对写更大的程序是很好的消息。 需要注意的几点： 1. Mat的拷贝只是复制了Mat的信息头，数据的指针也指向了被拷贝的数据地址，而没有真正新建一块内存来存放新的矩阵内容。这样带来的一个问题就是对其中一个Mat的数据操作就会对其他指向同一块数据的Mat产生灾难性的影响。 2.建立多维数组的格式是这样的 int sz[3] = {2, 2, 2}; Mat L(3, sz, CV_8UC(1), Scalar::all(0)); 3.传统的lplImage格式也可直接转换为Mat格式 IplImage* img = cvLoadImage("greatwave.png", 1); Mat mtx(img); // convert IplImage* -&#62; Mat 如果想将新版本的Mat格式转换为老版本，则需要如下调用： Mat I; IplImage* pI = &#38;I.operator IplImage(); CvMat* mI = &#38;I.operator CvMat(); 不过更安全的调用格式为： Ptr piI = &#38;I.operator IplImage(); 4.Mat结构更加友好，很多操作更接近matlab的风格 5.也有Point2f，Point3f，vector等数据结构可以使用 6.RNG类可以产生随机数 7.实现颜色通道的分离使用函数split]]></description>
			<content:encoded><![CDATA[<p>自从版本2.0，OpenCV采用了新的数据结构，用Mat类结构取代了之前用extended C写的cvMat和lplImage，更加好用啦，最大的好处就是更加方便的进行内存管理，对写更大的程序是很好的消息。</p>
<p>需要注意的几点：<br />
1. Mat的拷贝只是复制了Mat的信息头，数据的指针也指向了被拷贝的数据地址，而没有真正新建一块内存来存放新的矩阵内容。这样带来的一个问题就是对其中一个Mat的数据操作就会对其他指向同一块数据的Mat产生灾难性的影响。</p>
<p>2.建立多维数组的格式是这样的<br />
<code>int sz[3] = {2, 2, 2};<br />
	Mat L(3, sz, CV_8UC(1), Scalar::all(0));<br />
</code><br />
3.传统的lplImage格式也可直接转换为Mat格式<br />
<code>IplImage* img = cvLoadImage("greatwave.png", 1);<br />
	Mat mtx(img); // convert IplImage* -&gt; Mat<br />
</code><br />
如果想将新版本的Mat格式转换为老版本，则需要如下调用：<br />
<code>Mat I;<br />
IplImage* pI = &amp;I.operator IplImage();<br />
CvMat* mI = &amp;I.operator CvMat();<br />
</code><br />
不过更安全的调用格式为：<br />
<code>Ptr piI = &amp;I.operator IplImage();<br />
</code><br />
4.Mat结构更加友好，很多操作更接近matlab的风格<br />
5.也有Point2f，Point3f，vector等数据结构可以使用<br />
6.RNG类可以产生随机数<br />
7.实现颜色通道的分离使用函数split</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/06/opencvmat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenCV学习笔记（一）——安装配置、第一个程序</title>
		<link>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 07:58:05 +0000</pubDate>
		<dc:creator>yang_xian521</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[图形和视觉计算]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2012/01/06/opencv/</guid>
		<description><![CDATA[决心开始研究OpenCV。闲言少叙，sourceforge网站最近的版本是2011年8月的OpenCV2.3.1，下载安装，我这里使用的开发环境是vs2008，网上搜了一下配置的教程，与之前的几个OpenCV版本的配置过程大体相同：（教程网上很多，知之为知之，不知百度之，我这里粗略再讲一下） 1. 配置电脑的环境变量（Path变量）（需要注销才能生效），这里需要注意网上的教程又让增加一个OPENCV变量，值为D:\Program Files\OpenCV2.3.1\build(你安装的路径中的build目录) 2. 添加包含文件和库文件，这个和前几个版本方法类似，都是去工具-&#62;选项-&#62;VC目录添加build目录下的include目录及其子目录和你电脑对应版本的lib目录（选择x86 or x64，vc9 or vc10） 下面是第一个实例： 新建一个空项目，添加源文件如下： #include #include #include using namespace cv; using namespace std; int main( int argc, char** argv ) { if( argc != 2) { cout &#60;&#60;&#34; Usage: display_image ImageToLoadAndDisplay&#34; &#60;&#60; endl; return -1; } Mat image; image = imread(argv[1], CV_LOAD_IMAGE_COLOR); // Read the file if(! [...]]]></description>
			<content:encoded><![CDATA[<p>决心开始研究OpenCV。闲言少叙，sourceforge网站最近的版本是2011年8月的OpenCV2.3.1，下载安装，我这里使用的开发环境是vs2008，网上搜了一下配置的教程，与之前的几个OpenCV版本的配置过程大体相同：（教程网上很多，知之为知之，不知百度之，我这里粗略再讲一下）</p>
<p>1. 配置电脑的环境变量（Path变量）（需要注销才能生效），这里需要注意网上的教程又让增加一个OPENCV变量，值为D:\Program Files\OpenCV2.3.1\build(你安装的路径中的build目录)</p>
<p>2. 添加包含文件和库文件，这个和前几个版本方法类似，都是去工具-&gt;选项-&gt;VC目录添加build目录下的include目录及其子目录和你电脑对应版本的lib目录（选择x86 or x64，vc9  or vc10）</p>
<p>下面是第一个实例：</p>
<p>新建一个空项目，添加源文件如下：<br />
<code>#include<br />
#include<br />
#include </p>
<p>using namespace cv;<br />
using namespace std; </p>
<p>int main( int argc, char** argv )<br />
{<br />
	if( argc != 2)<br />
	{<br />
	 cout &lt;&lt;&quot; Usage: display_image ImageToLoadAndDisplay&quot; &lt;&lt; endl;<br />
	 return -1;<br />
	}</p>
<p>	Mat image;<br />
	image = imread(argv[1], CV_LOAD_IMAGE_COLOR);	// Read the file</p>
<p>	if(! image.data )                              // Check for invalid input<br />
	{<br />
		cout &lt;&lt;  &quot;Could not open or find the image&quot; &lt;&lt; std::endl ;<br />
		return -1;<br />
	}</p>
<p>	namedWindow( &quot;Display window&quot;, CV_WINDOW_AUTOSIZE );// Create a window for display.<br />
	imshow( &quot;Display window&quot;, image );                   // Show our image inside it.</p>
<p>	waitKey(0);											 // Wait for a keystroke in the window<br />
	return 0;<br />
}</code><br />
这段程序可以在你安装目录下的samples\cpp\tutorial_code\introduction\display_image找到，编译后，将图片test.jpg放到opencvtest.exe相同的目录中去，利用cmd命令行进入的可执行文件所在的目录，<br />
运行opencvtest test.jpg</p>
<p>则会显示一个图片，第一个程序成功。如图</p>
<p>如果遇到找不到tbb_debug.dll文件的问题，参考这里<a href="http://www.opencv.org.cn/forum/viewtopic.php?p=52223">http://www.opencv.org.cn/forum/viewtopic.php?p=52223</a>，只是我的环境是vs2008，大同小异。祝你成功！</p>
<p>接下来我觉得应该好好研究一下OpenCV里的doc文件夹下的教程和使用手册，我个人觉得《学习OpenCV》这本书已经远远跟不上OpenCV发展的速度了</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2012/01/06/opencv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于Media SDK 测试码流的问题</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/12/28/media-sdk-25/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/12/28/media-sdk-25/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 06:40:09 +0000</pubDate>
		<dc:creator>王有伟 Youwei Wang (Intel)</dc:creator>
				<category><![CDATA[图形和视觉计算]]></category>
		<category><![CDATA[MediaSDK]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/12/28/media-sdk-25/</guid>
		<description><![CDATA[学习Intel media SDK最快捷的方法看它自带的范例程序， 其中sample_decode可以用于基本流（Elementary Stream，ES）的解码， 经常有人问哪里有H.264或mpeg2的基本流，因为从网上下载的很多都是MP4格式的码流。 其实用ffmpeg就 可以将这些码流中的ES基本数据流抽取处理。 例如， 对于H264压缩的MP4， 只需运行如下命令即可“ffmpeg -i xxx.mp4 -vcodec copy -an -vbsf h264_mp4toannexb xxxx.h264”。 不过需要注意的是， H.264编码工具很多， 不同的编码工具编出来的H.264都会有细微的差别， 因此上面的命令不保证对所有的H.264有效。 至于mpeg2或VC-1格式的码流， 网上的资源可能不是很丰富， 大家完全可以用sample_decode将H.264解码为YUV， 然后用sample_encode将YUV编码成mpeg2 或者VC-1。 从http://ffmpeg.zeranoe.com/builds/可以下载windows版本的ffmpeg 程序。]]></description>
			<content:encoded><![CDATA[<p>     学习Intel media SDK最快捷的方法看它自带的范例程序， 其中sample_decode可以用于基本流（Elementary Stream，ES）的解码， 经常有人问哪里有H.264或mpeg2的基本流，因为从网上下载的很多都是MP4格式的码流。 其实用ffmpeg就 可以将这些码流中的ES基本数据流抽取处理。</p>
<p>    例如， 对于H264压缩的MP4， 只需运行如下命令即可“ffmpeg -i xxx.mp4 -vcodec copy -an -vbsf h264_mp4toannexb xxxx.h264”。<br />
    不过需要注意的是， H.264编码工具很多， 不同的编码工具编出来的H.264都会有细微的差别， 因此上面的命令不保证对所有的H.264有效。</p>
<p>    至于mpeg2或VC-1格式的码流， 网上的资源可能不是很丰富， 大家完全可以用sample_decode将H.264解码为YUV， 然后用sample_encode将YUV编码成mpeg2 或者VC-1。</p>
<p>    从http://ffmpeg.zeranoe.com/builds/可以下载windows版本的ffmpeg 程序。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/12/28/media-sdk-25/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

