﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-&lt;font size=5&gt;俊的blog&lt;/font&gt;-随笔分类-3D引擎开发</title><link>http://www.cppblog.com/mybios/category/3310.html</link><description>游戏开发 C++ DirectX 数学 计算机图形学 SQL Server
&lt;BR&gt;
&lt;BR&gt;
&lt;a href="http://www.cppblog.com/mybios" style="font-size:14px;color:#FFFFFF"&gt;返回我的Blog首页&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 18:21:38 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 18:21:38 GMT</pubDate><ttl>60</ttl><item><title>刚完成了一个基于Ogre渲染的世界编辑器，发图留念</title><link>http://www.cppblog.com/mybios/archive/2008/03/09/44046.html</link><dc:creator>李锦俊</dc:creator><author>李锦俊</author><pubDate>Sun, 09 Mar 2008 14:55:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2008/03/09/44046.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/44046.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2008/03/09/44046.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/44046.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/44046.html</trackback:ping><description><![CDATA[<p>这个世界编辑器，从一开始设计的时候就考虑使用即见即所得的形式来实现，地图载入、保存等等操作是独立封装在一个叫DisplaySystem的Dll中，而世界编辑器使用插件的形式来实现各种功能，如：地形编辑插件、网格插件、物件编辑插件、环境编辑插件等等。用插件的形式实现的好处很多，以后要增加新功能的时候世界编辑器本身的代码就不需要修改了。而且对于团队开发也很有利，一个人负责一个插件的开发就可以。<br>发几个图：<br><br>以下是没有启用插件的模式：<br><img src="http://www.cppblog.com/images/cppblog_com/mybios/WorldEditor.jpg" border=0><br><br>以下是启用了地形编辑器插件的模式：<br><img src="http://www.cppblog.com/images/cppblog_com/mybios/TerrainEditor.jpg" border=0><br><br>以下是启用了物件编辑器插件的模式：<br><img height=768 src="http://www.cppblog.com/images/cppblog_com/mybios/NoPlugins.jpg" width=1257 border=0><br></p>
<img src ="http://www.cppblog.com/mybios/aggbug/44046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊</a> 2008-03-09 22:55 <a href="http://www.cppblog.com/mybios/archive/2008/03/09/44046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ogre 的渲染到纹理的关键的3个步骤</title><link>http://www.cppblog.com/mybios/archive/2007/12/27/39764.html</link><dc:creator>李锦俊</dc:creator><author>李锦俊</author><pubDate>Thu, 27 Dec 2007 13:06:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2007/12/27/39764.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/39764.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2007/12/27/39764.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/39764.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/39764.html</trackback:ping><description><![CDATA[<p>好久没写技术的东西了。现在辗转间又回到了深圳工作，还是做我喜欢的游戏开发。奉献点东西给大家。</p>
<p><br>1、创建渲染目标纹理，关键要指定TU_RENDERTARGET参数，在创建这个渲染目标纹理的过程中，Ogre会自动调用&nbsp; Root::getSingleton().getRenderSystem()-&gt;attachRenderTarget把这个纹理添加到Root的渲染目标中，也就是说每帧都会渲染到这个纹理。<br>TexturePtr texture = TextureManager::getSingleton().createManual( "RttTex", <br>&nbsp;ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, <br>&nbsp;512, 512, 0, PF_R8G8B8, TU_RENDERTARGET );</p>
<p>2、获得渲染目标，有了渲染目标，才能给目标指定视口和摄像机<br>RenderTarget *rttTex = texture-&gt;getBuffer()-&gt;getRenderTarget();</p>
<p>3、给这个渲染目标指定摄像机，做了这步骤之后，每帧更新时就会把这个摄像机看到的东西渲染到texture中<br>Viewport *v = rttTex-&gt;addViewport( mReflectCam );</p>
<p>4、OK！</p>
<img src ="http://www.cppblog.com/mybios/aggbug/39764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊</a> 2007-12-27 21:06 <a href="http://www.cppblog.com/mybios/archive/2007/12/27/39764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>魔兽3贴图方法</title><link>http://www.cppblog.com/mybios/archive/2007/08/28/31043.html</link><dc:creator>李锦俊</dc:creator><author>李锦俊</author><pubDate>Tue, 28 Aug 2007 10:57:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2007/08/28/31043.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/31043.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2007/08/28/31043.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/31043.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/31043.html</trackback:ping><description><![CDATA[关键在于他的贴图的索引方式。如下所示。明眼人就能看出规律来。<br>只能说这么多了。公司有保密制度。请见谅！<br><br><img height=256 alt="" src="http://www.cppblog.com/images/cppblog_com/mybios/Lords_Grass.tga.jpg" width=512 border=0>
<img src ="http://www.cppblog.com/mybios/aggbug/31043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊</a> 2007-08-28 18:57 <a href="http://www.cppblog.com/mybios/archive/2007/08/28/31043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于实现了魔兽3贴图算法，发图留念</title><link>http://www.cppblog.com/mybios/archive/2007/08/28/31021.html</link><dc:creator>李锦俊</dc:creator><author>李锦俊</author><pubDate>Tue, 28 Aug 2007 07:00:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2007/08/28/31021.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/31021.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2007/08/28/31021.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/31021.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/31021.html</trackback:ping><description><![CDATA[魔兽3的地形贴图算法非常的巧妙。不过，认真观看他的地图编辑器和用工具导出他的地形贴图看看，还是可以摸出规律来的。<br><br><img height=627 alt="" src="http://www.cppblog.com/images/cppblog_com/mybios/WC3.JPG" width=808 border=0>
<img src ="http://www.cppblog.com/mybios/aggbug/31021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊</a> 2007-08-28 15:00 <a href="http://www.cppblog.com/mybios/archive/2007/08/28/31021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于GOOF的新版本</title><link>http://www.cppblog.com/mybios/archive/2007/07/18/28250.html</link><dc:creator>李锦俊</dc:creator><author>李锦俊</author><pubDate>Wed, 18 Jul 2007 01:21:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2007/07/18/28250.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/28250.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2007/07/18/28250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/28250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/28250.html</trackback:ping><description><![CDATA[我们现在用的是比较老的版本了，昨天特意到官网上问那个作者，终于得到了明确答复，说是8月中旬就会发布新版本。贴一些作者说的话：<br><br><span class=postbody><font size=2>Yeah, I'm currently hard at work on the core engine, as the editor is nearly complete. The major feature I need to add for the editor is the ability to add new object definitions without needing to go through text files, but I'm a bit burned out on the editor part so I'm taking a break and working on one of the biggest engine features that needs some work: handling meshes. <br><br>Basically I'm reworking the MeshGameObject class completely so it's more viable for large worlds. <br><br>As far as features go before I release alpha, the list is still sorta large. <br><br>1. Finish the physics system so that it can be used for character movement. <br>2. An attachment system to be able to specify attachment locations on an object and attach any other object to it. <br>3. Mesh animation, animation blending, animation sharing between objects. <br>4. Character class which plays animations based on current state (movement direction, velocity, jumping, strafing, etc.) <br>5. Redo the mesh system (in progress). This is a biggy and involves a lot crazy stuff that is too complex to explain in bullet point. Basically, will be using all of Ogre's advanced features for mesh lods, material lods, etc. but also tie into background resource loading, load only the lods that are necessary, track which lods are currently loaded, etc. <br>6. Ability to add, update and delete meta objects from the editor using property dialog functionality. Once a meta object is updated, call a function on all objects that use that meta data so they can update themselves with newest data. <br>7. Managed material system <br>8. Create plugins of all dlls and dynamically load. <br>9. Create a viewer application that is separate from the editor and can load any world file. <br>10. Update the lighting system, particle system, to use new fading code based on updated mesh code <br><br>Those are my major todos, once finished and tested I release alpha. I will likely update CVS after I get the meta objects finished though. I may also fit in the vegetation system before I release alpha. How long will the above list take? Based on my current speed of development, 3 months. <br><br>I have a core list of features that I think are necessary for an engine, and they include: <br><br>1. Physics simulation, character movement, vehicles, damage, explosions, breakable objects <br>2. Lighting - ambient occlusion, realtime lighting and shadows. Lighting manager is required to control ambient, shadows when moving from interior to exterior <br>3. Trees and vegetation <br>4. Dynamic environment. Sky transitioning, clouds, fog, global ambient, sun position and direction, sun glare, dynamic shadows <br>5. Networking using ReplicaNet. Run GOOF engine in server mode where it doesn't initialize any rendering systems. Update all objects to know whether they're being created on standalone server or not. <br>6. Sound management, 2d sounds, 3d sounds, sound line, background music. <br>7. Doors, triggers, elevators <br>8. In-game cutscenes <br>9. Background loading, resource garbage collection, forced loading <br>10. AI framework <br>11. Character inventory, equipping with 3 clothing types: shared skeleton, individual skeleton, attached to bone <br>12. Terrain with splatting <br><br>The above will take me years unless I have help </font><img alt=Smile src="http://www.ogre3d.org/phpBB2addons/images/smiles/icon_smile.gif" border=0><br><br><span class=postbody><font size=2>Oh yeah, the editor is very nice now, in my opinion. <br><br>Not only did I port to wxWidgets, I fixed and added a lot of general features to the GOOF Engine Editor Tool (the tool for creating scenes for the GOOF engine). <br><br>1. Multi select objects from the selection dialog <br>2. Ctrl drag to box select objects in the viewport, or Alt drag to box unselect, with selection lines to show what you're selecting. <br>3. Option to orient objects to the normal of the collided object when in drag mode. Means you can basically drag things up walls now if you're in a room and the object, such as a painting, will orient to the wall you drag it along. <br>4. Redid the movement axis manipulator so it now moves to exactly where you want it to move to instead of sliding along crazily. <br>5. Added a line that shows what you're linking to when you are in link mode. <br>6. Tree view for the select dialog, with scene hierarchy <br>7. Ability to click and edit partition properties from the same select dialog, and shows objects under their partition with the active partition listed at the top. <br>8. Obviously, all the wxWidgets stuff such as window snapping, toolbar, menu, automatic viewport resizing, view menu which lists windows, redid all the open/save functionality to support a standard file dialog, etc. <br><br>Fixed tons of bugs. Undo system works now. Linking and unlinking objects fixed. Deleting multiple objects fixed when there are parent/child relationships between objects. The movement axis manipulator fixed. Fixed dragging over other objects - the object used to jump around crazily. <br><br>Probably tons more as well, but this is what I remember off the top of my head. </font><br><br><img src="http://www.larabie.net/ogre/GOOFEditorSep29-06.JPG" border=0></span></span>
<img src ="http://www.cppblog.com/mybios/aggbug/28250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊</a> 2007-07-18 09:21 <a href="http://www.cppblog.com/mybios/archive/2007/07/18/28250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于GOOF的bug问题</title><link>http://www.cppblog.com/mybios/archive/2007/07/16/28157.html</link><dc:creator>李锦俊</dc:creator><author>李锦俊</author><pubDate>Mon, 16 Jul 2007 14:53:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2007/07/16/28157.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/28157.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2007/07/16/28157.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/28157.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/28157.html</trackback:ping><description><![CDATA[<p>使用了几天GOOF，发现他存在很多bug啊，什么缓存溢出，数组越界之类的。。很明显这个框架没有真正用在一个项目上的。我列举几个大问题吧。好让大家别到处碰壁。<br>首先，最严重的bug莫过于这个<br>vector&lt;CoreGameObject*&gt;::iterator itr = mObjects.begin();<br>for(; itr != mObjects.end(); ++itr)<br>所有这种写法都是错误的！要改成for(vector&lt;CoreGameObject*&gt;::iterator itr = mObjects.begin();<br>&nbsp;itr != mObjects.end(); ++itr)<br><br>其次，bool EnvironmentGameSystem::save(DataElementPtr element)这个函数没有实现，所以无法保存环境信息。<br><br>还有<br>&nbsp;void GridPartition::enumerateConnectedPartitions(vector&lt;CorePartition*&gt;&amp; connected)<br>&nbsp;{<br>&nbsp;&nbsp;//get surrounding grid cells within a certain radius<br>&nbsp;&nbsp;float loadRadius = mGridPartitionMgr-&gt;getGridCellLoadRadius();</p>
<p>&nbsp;&nbsp;//enumerate partitions<br>&nbsp;&nbsp;vector&lt;CorePartition*&gt; partitions;<br>&nbsp;&nbsp;mGridPartitionMgr-&gt;enumeratePartitions(partitions);</p>
<p>&nbsp;&nbsp;//iterate through and check distance<br>&nbsp;&nbsp;for(vector&lt;CorePartition*&gt;::iterator itr = partitions.begin(); itr != partitions.end(); ++itr)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;float distance = Vector3(getWorldPosition() - (*itr)-&gt;getWorldPosition()).length();<br>&nbsp;&nbsp;&nbsp;// add by 李锦俊 2007-7-16<br>&nbsp;&nbsp;&nbsp;// 不要返回自己作为邻居，会产生bug<br>&nbsp;&nbsp;&nbsp;if(distance &lt; loadRadius &amp;&amp; *itr != this)<br>&nbsp;&nbsp;&nbsp;&nbsp;connected.push_back(*itr);<br>&nbsp;&nbsp;}<br>&nbsp;}<br><br>再给出一个比较严重的bug<br>GOOFTranslationManipulator.h中的<br>&nbsp;&nbsp;// add by 李锦俊 2007-7-12<br>&nbsp;&nbsp;// 不要用魔术数，搞到缓存溢出<br>&nbsp;&nbsp;SceneNode* mNode[AT_LAST];<br>&nbsp;&nbsp;Entity* mEnt[AT_LAST];<br>&nbsp;&nbsp;Entity* mConeEnt[AT_LAST];<br>&nbsp;&nbsp;CollisionShapePtr mCol[AT_LAST];<br>&nbsp;&nbsp;AxisManipulatorHandle* mHandle[AT_LAST];<br><br>另外，CorePartition中的setSkyboxMaterial、setGlobalAmbient之类的代码貌似没用。准备弃之。<br></p>
<br>&nbsp;&nbsp;&nbsp;&nbsp;// add by 李锦俊 2007-7-16<br>&nbsp;&nbsp;&nbsp;&nbsp;// 这个算法暂时有问题，先屏蔽，以后再慢慢解决<br>&nbsp;&nbsp;&nbsp;&nbsp;//disable static geometry until it is fixed<br>&nbsp;&nbsp;&nbsp;&nbsp;if(false)// getStaticGeometryRule() == SGR_ALWAYS || (getStaticGeometryRule() == SGR_WHEN_NOT_PROX_IMMEDIATE &amp;&amp; getPartition()-&gt;getProximity() != CorePartition::PROX_IMMEDIATE)) <br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;willConvertToStaticGeometry = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getPartition()-&gt;addObjectToConvertToStaticGeometry(this);<br>&nbsp;&nbsp;&nbsp;&nbsp;}
<img src ="http://www.cppblog.com/mybios/aggbug/28157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊</a> 2007-07-16 22:53 <a href="http://www.cppblog.com/mybios/archive/2007/07/16/28157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一年一度的农历新年快到了，拜个早年，顺便贴我的简历，希望找到好工作</title><link>http://www.cppblog.com/mybios/archive/2007/02/12/18687.html</link><dc:creator>李锦俊</dc:creator><author>李锦俊</author><pubDate>Mon, 12 Feb 2007 07:27:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2007/02/12/18687.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/18687.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2007/02/12/18687.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/18687.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/18687.html</trackback:ping><description><![CDATA[
		<div align="center">
				<table class="MsoNormalTable" cellspacing="0" cellpadding="0" width="650" border="0">
						<tbody>
								<tr>
										<td>
												<br />
												<b>个人基本简历</b>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<br />  
<div align="center"><table class="MsoNormalTable" cellspacing="1" cellpadding="0" width="657" border="0"><tbody><tr><td width="105"><br />姓　　名：</td><td width="188"><br />李锦俊 先生</td><td width="105"><br />国　　籍：</td><td><br />中国</td></tr><tr><td width="105"><br />目前住地：</td><td><br />广东江门</td><td><br />民　　族：</td><td><br />汉族</td></tr><tr><td width="105"><br />户 籍 地：</td><td><br />广东江门</td><td><br />身高体重：</td><td><br />170 cm 55 kg</td></tr><tr><td width="105"><br />婚姻状况：</td><td><br />未婚</td><td><br />年　　龄：</td><td><br />25 岁</td></tr></tbody></table></div><br />  
<div align="center"><table class="MsoNormalTable" cellspacing="0" cellpadding="0" width="650" border="0"><tbody><tr><td><br /><b>求职意向及工作经历</b></td></tr></tbody></table></div><br />  
<div align="center"><table class="MsoNormalTable" cellspacing="1" cellpadding="0" width="648" border="0"><tbody><tr><td width="103"><br />应聘职位：</td><td colspan="3"><br />2D/3D游戏开发（技术总监、主程序员、VC++高级程序员）</td></tr><tr><td width="103"><br />工作年限：</td><td width="185"><br />5年</td><td width="103"><br />职　　称：</td><td width="253"><br />高级</td></tr><tr><td width="103"><br />求职类型：</td><td width="185"><br />全职</td><td width="103"><br />可到职日期：</td><td><br />2007年春节之后</td></tr><tr><td width="103"><br />月薪要求：</td><td width="185"><br />8000以上</td><td width="103"><br />希望工作地区：</td><td nowrap=""><br />广州、江门、深圳</td></tr><tr><td width="103"><br />工作经历：</td><td colspan="3"><br />2002.5月～2004.4月 江门高正电脑 VC开发与B/S程序开发 主程序员 <br />2004.4月～2007.2月 长沙新冠数码科技公司 VC开发VOD视频点播系统 技术总监</td></tr></tbody></table></div><br />  
<div align="center"><table class="MsoNormalTable" cellspacing="0" cellpadding="0" width="650" border="0"><tbody><tr><td><br /><b>教育背景</b></td></tr></tbody></table></div><br />  
<div align="center"><table class="MsoNormalTable" cellspacing="1" cellpadding="0" width="648" border="0"><tbody><tr><td><br />毕业院校：</td><td colspan="3"><br />江门杜阮华侨中学 现就读长沙电大</td></tr><tr><td width="100"><br />最高学历：</td><td width="180"><br />高中</td><td width="100"><br />毕业日期：</td><td width="246"><br />2002 年</td></tr><tr><td><br />所学专业：</td><td width="180"><br />软件开发</td><td width="100"><br /> </td><td><br /> </td></tr><tr><td><br />培训经历：</td><td colspan="3"><br />经历了十几年的学校经历 还有很多经验 很早就能接触计算机 <br />1996年开始自学DOS及Windows3.1 <br />1997年开始自学Basic编程语言 <br />1999年开始自学DOS下的C语言编程 <br />2000年开始自学ASP、VB <br />2002年～2004年用VC/ASP/VB，做了十几个项目 <br />2003年开始自学C#.Net，做了两三个项目 <br />2004年至今一直使用VC，独立开发整套点歌系统 <br />2005年至今一直在自学2D/3D相关的技术（高数、图形学、Direct3D、DirectDraw、DirectShow）</td></tr></tbody></table></div><br />  
<div align="center"><table class="MsoNormalTable" cellspacing="0" cellpadding="0" width="650" border="0"><tbody><tr><td><br /><b>语言能力</b></td></tr></tbody></table></div><br />  
<div align="center"><table class="MsoNormalTable" cellspacing="1" cellpadding="0" width="648" border="0"><tbody><tr><td width="100"><br />外　　语：</td><td width="180"><br />英语　一般（能读懂各种英文参考资料）</td><td width="100"><br /> </td><td width="246"><br /> </td></tr><tr><td><br />国语水平：</td><td><br />非常流利</td><td width="100"><br />粤语水平：</td><td><br />非常流利</td></tr></tbody></table></div><br />  
<div align="center"><table class="MsoNormalTable" cellspacing="0" cellpadding="0" width="650" border="0"><tbody><tr><td><br /><b>工作能力及其他专长</b></td></tr></tbody></table></div><br />  
<div align="center"><table class="MsoNormalTable" cellspacing="1" cellpadding="0" width="648" border="0"><tbody><tr><td width="100"><br /> </td><td><br />精通C++语言、能熟练使用常用的设计模式；精通WIN32SDK，MFC开发平台。 <br />自学高等数学、线性代数、计算机图形学等等跟2D/3D有关的数学知识 <br />精通Direct3D、DirectDraw、DirectShow，熟悉其他的DirectX SDK开发。 <br />熟悉开源3D引擎OGRE，曾经自己改中文支持（用FreeType2），用来开发3D 点歌系统 <br />熟悉嵌入式脚本引擎，用以驱动3D点歌系统和计费系统的灵活设置 <br />熟悉Windows网络编程，熟悉TCP/IP协议及Winsock编程技术，用来开发多用户的点歌系统以及酒水传送模块； <br />熟悉windows多线程编程； <br />熟练进行Windows 各种界面开发； <br />熟常用的数据结构和算法，熟悉COM开发； <br />有良好规范的编程习惯； <br />能熟练阅读大量英文文档； <br />有良好的沟通与团队协作能力，能适应较大的工作压力。 <br />能独立策划中型开发项目,通过4年的VC工作开发经验,积累了很多知识,能独立开发VC项目,曾独立开发VOD视频点播系统,包括视频点播前台/计费系统/进销存/超市系统,与硬件衔接的导唱/语音识别/视频切换等等模块的独立开发.开发基于实时3D渲染的全新点歌系统<br />能独立开发B/S模式的应用程序，曾独立开发无线餐饮系统，进销存系统，CRM客户关系管理，OA都能独立开发。 <br />精通VC/ASP/SQL Server/HTML/Java Script等等技术（都是应用到工作中去的技术），曾用ASP.net独立完成一些政府机关的项目，对于ASP.Net和VB都比较熟悉，略懂Java。 <br />另外本人的电脑知识无论软件、硬件都比较熟悉，做出来的软件能跟硬件很好的衔接。精通Word/Excel/Photoshop等等办公应用软件的使用。 <br />因为本人在用友软件的代理商工作过2年时间。所以，对用友/金碟/速达等财务软件有比较系统的理解，并能在上面做二次开发。 <br />自学能力强，性格开朗，工作认真，一丝不苟，工作勤快。。。。</td></tr></tbody></table></div><br />  <br />  <br />  
<div align="center"><table class="MsoNormalTable" cellspacing="0" cellpadding="0" width="650" border="0"><tbody><tr><td><br /><b>个人联系方式</b>　</td></tr></tbody></table></div><br />  
<div align="center"><table class="MsoNormalTable" cellspacing="1" cellpadding="0" width="650" border="0"><tbody><tr><td><br />手　　机：</td><td><br /> 13664915121</td><td><br />ＱＱ号码：</td><td><br />30743734 </td></tr><tr><td><br />电子邮件：</td><td><br />mybios@21cn.com </td><td><br />个人主页：</td><td><br /><a href="/mybios">http://www.cppblog.com/mybios</a></td></tr><tr><td colspan="6"><br /><b>DEMO</b><b>演示</b>　(面试时再带上源码来看)</td></tr><tr height="0"><td width="3"></td><td width="121"></td><td width="189"></td><td width="121"></td><td width="212"></td><td width="3"></td></tr></tbody></table></div><br />  
<div align="center"><table class="MsoNormalTable" cellspacing="1" cellpadding="0" width="635" border="0"><tbody><tr><td width="99"><br />连连看</td><td width="533"><br />基于D3D9的2D游戏，部分用XML＋Lua驱动，核心算法写在C++中，只实现了单机版</td></tr><tr><td width="99"><br />锄大地</td><td width="533"><br />基于D3D9的2D游戏，部分用XML＋Lua驱动，核心算法写在C++中，只实现了单机版自己打自己（没什么意义）</td></tr><tr><td width="99"><br />GUI </td><td width="533"><br />参考了Ogre、irrLicht等等开源引擎做的一个游戏引擎，平台无关、渲染器无关，高度优化的GUI渲染引擎，速度比CEGUI快至少1/3，内存占用比CEGUI少2/3以上。使用了部分设计模式。</td></tr></tbody></table></div><br /> <img src ="http://www.cppblog.com/mybios/aggbug/18687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊</a> 2007-02-12 15:27 <a href="http://www.cppblog.com/mybios/archive/2007/02/12/18687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D 引擎中的 GUI 渲染优化补完</title><link>http://www.cppblog.com/mybios/archive/2006/12/24/16795.html</link><dc:creator>李锦俊</dc:creator><author>李锦俊</author><pubDate>Sun, 24 Dec 2006 06:14:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/12/24/16795.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/16795.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/12/24/16795.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/16795.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/16795.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 昨天提到的我想到了个优化渲染的新方法。。今天花了一个早上终于实现了。5555其实不需要这么久，偏偏是一个小小的BUG花了我两个小时。马上进入正题吧。原来的GUI渲染系统是每个Window都继承于RenderCache，每个RenderCache中保存着需要渲染的矩形信息，然后每帧渲染的时候一个个矩形添加到渲染器中再动态修改顶点坐标（一个矩形对应6个顶点）。慢就慢在动态修改顶点！今天实现的新方法，就...&nbsp;&nbsp;<a href='http://www.cppblog.com/mybios/archive/2006/12/24/16795.html'>阅读全文</a><img src ="http://www.cppblog.com/mybios/aggbug/16795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊</a> 2006-12-24 14:14 <a href="http://www.cppblog.com/mybios/archive/2006/12/24/16795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D 引擎中 GUI 渲染的优化</title><link>http://www.cppblog.com/mybios/archive/2006/12/23/16778.html</link><dc:creator>李锦俊</dc:creator><author>李锦俊</author><pubDate>Sat, 23 Dec 2006 14:32:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/12/23/16778.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/16778.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/12/23/16778.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/16778.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/16778.html</trackback:ping><description><![CDATA[前几天的BLOG中说了一些我的3D引擎GUI的渲染部分原理，这几天做到ListCtrl控件的时候，当我添加很多Item进去的时候（几乎满屏的12Px汉字，一个汉字两个三角形，相当于上万个三角形了），FPS降得吓人，Debug版只有18FPS，Release版也只有60FPS。。优化、优化、还是优化！优化之后，FPS终于达到了令人满意的500FPS左右了。且听我慢慢说来。<br /><br />首先是用我的引擎内部剖析分析了代码的瓶颈（Profile这东西真的有用啊，让我很容易就找到了慢的原因，参见GPG3 1.17《实时的层次化性能评测》），发现处理时间主要被Cache算法和渲染两部份占了，于是，我在想，渲染慢是正常的（当时的想法比较弱智，后文有术），所以，我打算从Cache算法着手。首先是优化了ListCtrl的Cache算法，把那些在屏幕外的Item的Visible属性设置成false（我的算法中Visible为false，Cache部分算法就直接跳过），于是速度一下子就上来了，Release版本达到了130FPS。但是，还是慢啊。怎么办？剖析之后，发现大部分的处理时间都集中在渲染部分，我之前的想法是渲染慢是正常的，所以暂时无法解决。。。<br /><br />下班的时候，出去遛了一圈，路上突然想到了我渲染算法中另外一个跟渲染速度有关的东西，动态修改顶点数据！难道是这里的原因？回来后马上测试，把动态修改的代码屏蔽，直接每帧渲染10000三角形，妈呀，1000＋的FPS！完全否定了我之前的想法（渲染慢是正常的），唉，想想也是，每秒千万、上亿个三角形生成速度的显卡，对于区区一万个三角形怎么会慢呢...既然找到原因，就要优化啊，现在找到原因是因为动态修改顶点导致，想到了以前看过一篇文章说顶点数据存储的位置（即CreateVertexBuffer的D3DPool参数），说到做到，把原来的D3DPOOL_MANAGED改成D3DPOOL_SYSMEMORY，哇，速度一下子提升到360FPS左右！想起来原因也是简单的，既然要每帧Lock这么多数据，那么顶点数据需要从显存-&gt;CPU处理，然后CPU提交回显存，总线交换也太频繁了，如果改成SYSMEMORY的话，就只需要从CPU-&gt;显存就可以了。<br /><br />然后我又想，有没有更好的优化方法？答案是有的。。最快的修改内存数据的方法是什么？当然是直接读写内存啊！那么我想到了DrawPrimitiveUP！把顶点数据直接new出来，然后DrawPrimitiveUP提交！改成这样后，速度再度提升！达到惊人的500FPS！<br /><br />最后，我把DrawPrimitiveUP改成DrawIndexedPrimitiveUP，那么顶点数量也减少了。但是奇怪的是速度缺没有更快，反而慢了一点点（慢了5～10FPS左右），但是，我用了DrawIndexedPrimitiveUP，我之后还有更好的优化算法准备实现。通过DrawIndexedPrimitiveUP，但是还没做好。。所以先卖个关子了。明天搞好的话再写Blog。<br /><br />唉，回头看了下自己写的东西，乱七八糟。都不知道有没有人看得懂啊。不管了。知之为知之，不知为不知吧。呵呵，看不懂的请评论一下。<br /><br />写代码去了～～<img src ="http://www.cppblog.com/mybios/aggbug/16778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊</a> 2006-12-23 22:32 <a href="http://www.cppblog.com/mybios/archive/2006/12/23/16778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>这段时间开发3D引擎啊，正在做GUI部分</title><link>http://www.cppblog.com/mybios/archive/2006/12/19/16630.html</link><dc:creator>李锦俊</dc:creator><author>李锦俊</author><pubDate>Tue, 19 Dec 2006 13:30:00 GMT</pubDate><guid>http://www.cppblog.com/mybios/archive/2006/12/19/16630.html</guid><wfw:comment>http://www.cppblog.com/mybios/comments/16630.html</wfw:comment><comments>http://www.cppblog.com/mybios/archive/2006/12/19/16630.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/mybios/comments/commentRss/16630.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mybios/services/trackbacks/16630.html</trackback:ping><description><![CDATA[前段时间看了很多很多的3D相关的基础书，感觉上学到了很多东西，但是不知道做什么好。后来，用DXUT做了两个小游戏，连连看和纸牌，虽然都是2D的，但是感觉上还是觉得自己进步了。<br /><br />接下来的一段日子里，是时候继续学3D的东西了，于是萌生了个做游戏引擎的想法。我是个想做就做的人，虽然我也知道自己是不自量力，但是，只要我肯去做，即使做不好，也起码能学到东西啊，把学过的东西拿来用一番，就能有感觉了。<br /><br />说说引擎部分的构建，引擎部分的FrameWork主要参考了GPG3的1.2那个框架模式，采用Unicode编译，感觉上那个模式比较好用，但是太复杂了点，于是我简化了他，基本上只保留了任务系统。使用平台无关的插件方式把Win32和Direct3D9的模块做了出来（当然只封装了一小部分函数），把Ogre的基础库全部拿来主义（哈哈，主要就是数学库、工具库等等）。而声音引擎也留了接口，很好扩展了。<br /><br />然后，现在正在做GUI部分，主要还是说说GUI的渲染部分吧。GUI其中有两个我认为比较关键的地方，其一是渲染文字部分，其二是渲染窗口部分。下面说说我的做法<br />文字渲染部分：<br />我的做法是使用FreeType2读取TTF文件，然后当要渲染文字的时候，看哪个用到的文字就load哪个文字，先获得这个文字的大小，然后在贴图中找到一个空闲的区域（我的贴图大小是512×512，也可以设置），然后blt到贴图中，真正渲染的时候就把这个贴图纹理坐标贴到两个三角形上就完成了一个文字的渲染了。<br />在贴图中找空闲区域我有个比较特别的做法，就是每个需要渲染的文字维护一个RefCount引用计数，例如一个屏幕里10个“我”字，那么“我”的引用计数就是10，当“我”字不需要再渲染的时候（引用计数为0），此文字的贴图区域就可以被其他文字所覆盖。<br />窗口渲染部分：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> GAMECORE_EXPORT GUIRenderCache<br /><img id="Codehighlighter1_38_831_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_831_Open_Text.style.display='none'; Codehighlighter1_38_831_Closed_Image.style.display='inline'; Codehighlighter1_38_831_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_38_831_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_38_831_Closed_Text.style.display='none'; Codehighlighter1_38_831_Open_Image.style.display='inline'; Codehighlighter1_38_831_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_38_831_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_38_831_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 不允许显式创建，只可以继承</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    GUIRenderCache(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">GUIRenderCache(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 添加到渲染队列</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> AddCache(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> GUIRenderQuad</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000"> quad)<br /><img id="Codehighlighter1_188_262_Open_Image" onclick="this.style.display='none'; Codehighlighter1_188_262_Open_Text.style.display='none'; Codehighlighter1_188_262_Closed_Image.style.display='inline'; Codehighlighter1_188_262_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_188_262_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_188_262_Closed_Text.style.display='none'; Codehighlighter1_188_262_Open_Image.style.display='inline'; Codehighlighter1_188_262_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_188_262_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_188_262_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        m_vtGUIRenderQuad.insert(GUIRenderQuadPtr(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> GUIRenderQuad(quad)));<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 渲染需要Cache队列</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> RenderCache(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_307_612_Open_Image" onclick="this.style.display='none'; Codehighlighter1_307_612_Open_Text.style.display='none'; Codehighlighter1_307_612_Closed_Image.style.display='inline'; Codehighlighter1_307_612_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_307_612_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_307_612_Closed_Text.style.display='none'; Codehighlighter1_307_612_Open_Image.style.display='inline'; Codehighlighter1_307_612_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_307_612_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_307_612_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 从新Cache队列</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_bDirty)<br /><img id="Codehighlighter1_341_401_Open_Image" onclick="this.style.display='none'; Codehighlighter1_341_401_Open_Text.style.display='none'; Codehighlighter1_341_401_Closed_Image.style.display='inline'; Codehighlighter1_341_401_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_341_401_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_341_401_Closed_Text.style.display='none'; Codehighlighter1_341_401_Open_Image.style.display='inline'; Codehighlighter1_341_401_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_341_401_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_341_401_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            ClearCacheList();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            DoCache();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            m_bDirty </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 添加到渲染器</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(VectorGUIRenderQuad::const_iterator iter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> m_vtGUIRenderQuad.begin() ; iter </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> m_vtGUIRenderQuad.end() ; iter </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_537_609_Open_Image" onclick="this.style.display='none'; Codehighlighter1_537_609_Open_Text.style.display='none'; Codehighlighter1_537_609_Closed_Image.style.display='inline'; Codehighlighter1_537_609_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_537_609_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_537_609_Closed_Text.style.display='none'; Codehighlighter1_537_609_Open_Image.style.display='inline'; Codehighlighter1_537_609_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span id="Codehighlighter1_537_609_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_537_609_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            Systems::GetSingleton().GetGUIRendererSystem()</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">AddCache(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">iter);<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 清空cache队列</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> ClearCacheList(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br /><img id="Codehighlighter1_656_688_Open_Image" onclick="this.style.display='none'; Codehighlighter1_656_688_Open_Text.style.display='none'; Codehighlighter1_656_688_Closed_Image.style.display='inline'; Codehighlighter1_656_688_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_656_688_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_656_688_Closed_Text.style.display='none'; Codehighlighter1_656_688_Open_Image.style.display='inline'; Codehighlighter1_656_688_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_656_688_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_656_688_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        m_vtGUIRenderQuad.clear();<br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> Cache需要渲染的项目</span><span style="COLOR: #008000"><br /><img id="Codehighlighter1_742_743_Open_Image" onclick="this.style.display='none'; Codehighlighter1_742_743_Open_Text.style.display='none'; Codehighlighter1_742_743_Closed_Image.style.display='inline'; Codehighlighter1_742_743_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_742_743_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_742_743_Closed_Text.style.display='none'; Codehighlighter1_742_743_Open_Image.style.display='inline'; Codehighlighter1_742_743_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> DoCache()</span><span id="Codehighlighter1_742_743_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_742_743_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    VectorGUIRenderQuad m_vtGUIRenderQuad;    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 渲染队列</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000"> m_bDirty; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 需要重新Cache需要渲染的项目</span><span style="COLOR: #008000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br /><br /><br />每个Window（一个Window是一个抽象类，Static/Button/Dialog等等所有窗口都是继承于Window）都继承于GUIRenderCache对象，当窗口的某个属性（如WindowText）改变时，就会把m_bDirty标记设置成true。每帧渲染的时候调用RenderCache。那么如果窗口的属性没有改变，就只需要把m_vtGUIRenderQuad的东西渲染出来；如果属性改变了（即m_bDirty为true），则调用DoCache，由继承类（如Static/Button等）改写这个函数，计算贴图坐标、三角形坐标等等东西都放在这个函数里。总的来说，Cache之后速度会比Cache之前快起码一半以上。<br /><br />好了，睡觉去了。<img src ="http://www.cppblog.com/mybios/aggbug/16630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mybios/" target="_blank">李锦俊</a> 2006-12-19 21:30 <a href="http://www.cppblog.com/mybios/archive/2006/12/19/16630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>