﻿<?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>博客园-oiramario</title><link>http://www.cnblogs.com/oiramario/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 05:23:11 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 05:23:11 GMT</pubDate><ttl>60</ttl><item><title>The DirectX SDK (February 2010) release is now live on Microsoft downloads.</title><link>http://www.cnblogs.com/oiramario/archive/2010/02/08/1665748.html</link><dc:creator>千里马肝</dc:creator><author>千里马肝</author><pubDate>Mon, 08 Feb 2010 03:04:00 GMT</pubDate><guid>http://www.cnblogs.com/oiramario/archive/2010/02/08/1665748.html</guid><description><![CDATA[<p>阅读: 62 评论: 0 作者: <a href="http://www.cnblogs.com/oiramario/" target="_blank">千里马肝</a> 发表于 2010-02-08 11:04 <a href="http://www.cnblogs.com/oiramario/archive/2010/02/08/1665748.html" target="_blank">原文链接</a></p><span class="Apple-style-span" style="font-family: 宋体; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">Runtime Library:<br /><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=0CEF8180-E94A-4F56-B157-5AB8109CB4F5&amp;displaylang=en" target="_blank" style="color: #261cdc; text-decoration: underline; line-height: 20px; word-break: break-all; ">http://www.microsoft.com/downloads/details.aspx?FamilyID=0CEF8180-E94A-4F56-B157-5AB8109CB4F5&amp;displaylang=en</a><br /><br />SDK(为避免正版验证,直接给出下载链接):<br /><a href="http://download.microsoft.com/download/F/1/7/F178BCE4-FA19-428F-BB60-F3DEE1130BFA/DXSDK_Feb10.exe" target="_blank" style="color: #261cdc; text-decoration: underline; line-height: 20px; word-break: break-all; ">http://download.microsoft.com/download/F/1/7/F178BCE4-FA19-428F-BB60-F3DEE1130BFA/DXSDK_Feb10.exe</a><br /><br />这个版本的DirectX貌似不支持XP SP2了,而支持XP SP3.具体支持的系统如下:<br />Supported Operating Systems: Windows 7; Windows Server 2003; Windows Server 2008; Windows Vista; Windows XP 64-bit; Windows XP Service Pack 3<br /><br /><p>而且也声明下一版本将支持VS2010,同时取消支持VS2005.</p><p>实测Runtime&nbsp;Library仍然可以在XP&nbsp;SP2上正常安装.&nbsp;&nbsp;</p><p>这里是官方地址，可以查看具体的更新说明。<a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=2c7da5fb-ffbb-4af6-8c66-651cbd28ca15" target="_blank"></a>&nbsp;</p><p><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=2c7da5fb-ffbb-4af6-8c66-651cbd28ca15" target="_blank">http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=2c7da5fb-ffbb-4af6-8c66-651cbd28ca15</a></p><p>&nbsp;</p><p>貌似这次并没有Direct3D相关更新.&nbsp;</p></span><img src="http://www.cnblogs.com/oiramario/aggbug/1665748.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/oiramario/archive/2010/02/08/1665748.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/oiramario/archive/2010/02/08/1665748.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56831/" target="_blank">谷姐瘫痪 发公开信称已遭黑客攻击5天</a><span style="color:gray">(2010-02-10 13:21)</span><br/>· <a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><span style="color:gray">(2010-02-10 13:08)</span><br/>· <a href="http://news.cnblogs.com/n/56828/" target="_blank">暴雪介绍战网新界面</a><span style="color:gray">(2010-02-10 13:03)</span><br/>· <a href="http://news.cnblogs.com/n/56827/" target="_blank">TLS/SSL协议曝漏洞 影响所有版本Windows</a><span style="color:gray">(2010-02-10 12:56)</span><br/>· <a href="http://news.cnblogs.com/n/56826/" target="_blank">YouTube模式遭嫌弃 Hulu模式成视频行业新宠</a><span style="color:gray">(2010-02-10 12:52)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>MovablePlane issue</title><link>http://www.cnblogs.com/oiramario/archive/2010/02/04/1663843.html</link><dc:creator>千里马肝</dc:creator><author>千里马肝</author><pubDate>Thu, 04 Feb 2010 09:33:00 GMT</pubDate><guid>http://www.cnblogs.com/oiramario/archive/2010/02/04/1663843.html</guid><description><![CDATA[<p>阅读: 82 评论: 0 作者: <a href="http://www.cnblogs.com/oiramario/" target="_blank">千里马肝</a> 发表于 2010-02-04 17:33 <a href="http://www.cnblogs.com/oiramario/archive/2010/02/04/1663843.html" target="_blank">原文链接</a></p><p>查到这个bug是因为前段时间实现vsm时，需要用到<span class="Apple-style-span" style="font-family: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; font-size: 16px; color: #333333; ">scene_depth_range 和 shadow_scene_depth_range，而我的模型查看器的地表是创建的一个plane，于是查到有些问题。</span></p><p>这两天想起来发到论坛里找sinbad验证一下，于是乎～&nbsp;</p><p>&nbsp;</p><span class="Apple-style-span" style="color: #657164; font-family: Verdana, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; "><div id="p375860" class="post bg2 online" style="margin-top: 0px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; background-color: #deeddd; background-image: url(http://www.ogre3d.org/forums/styles/proogre/imageset/en/icon_user_online.gif); background-position: 100% 0px; background-repeat: no-repeat no-repeat; "><div class="inner" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><div class="postbody" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.48em; color: #333333; width: 1218px; float: left; clear: both; "><div class="content" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; min-height: 3em; overflow-x: hidden; overflow-y: hidden; line-height: 1.4em; font-family: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; font-size: 1.3em; color: #333333; ">This issue is about member function&nbsp;<span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: bold; ">getBoundingRadius</span>&nbsp;of MovablePlane.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><dl class="codebox" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; background-color: #ffffff; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #d0d3ce; border-right-color: #d0d3ce; border-bottom-color: #d0d3ce; border-left-color: #d0d3ce; font-size: 1em; "><dt style="margin-top: 0px; margin-right: 0px; margin-bottom: 3px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-transform: uppercase; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #cccccc; font-size: 0.8em; font-weight: bold; display: block; ">CODE:&nbsp;<a href="http://www.ogre3d.org/forums/viewtopic.php?f=4&amp;t=55372&amp;sid=80769999cd809954c060b40f41940694#" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #445d3c; text-decoration: none; " target="_blank">SELECT ALL</a></dt><dd style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><code style="margin-top: 2px; margin-right: 0px; margin-bottom: 2px; margin-left: 0px; padding-top: 5px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; overflow-x: auto; overflow-y: auto; display: block; height: auto; max-height: 200px; white-space: normal; font: normal normal normal 0.9em/normal Monaco, 'Andale Mono', 'Courier New', Courier, mono; line-height: 1.3em; color: black; ">MovablePlane.h<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp; &nbsp; &nbsp; // Overridden from MovableObject<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp; &nbsp; &nbsp; const AxisAlignedBox&amp; getBoundingBox(void) const { return mNullBB; }<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp; &nbsp; &nbsp; /// Overridden from MovableObject<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp; &nbsp; &nbsp; Real getBoundingRadius(void) const { return Math::POS_INFINITY; }<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></code></dd></dl><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />I'm sad with bounding box is null box but bounding radius is infinity.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />on this case, when create a moveable plane in an app, scene_depth_range and shadow_scene_depth_range will be corrupted.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><dl class="codebox" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; background-color: #ffffff; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #d0d3ce; border-right-color: #d0d3ce; border-bottom-color: #d0d3ce; border-left-color: #d0d3ce; font-size: 1em; "><dt style="margin-top: 0px; margin-right: 0px; margin-bottom: 3px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-transform: uppercase; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #cccccc; font-size: 0.8em; font-weight: bold; display: block; ">CODE:&nbsp;<a href="http://www.ogre3d.org/forums/viewtopic.php?f=4&amp;t=55372&amp;sid=80769999cd809954c060b40f41940694#" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #445d3c; text-decoration: none; " target="_blank">SELECT ALL</a></dt><dd style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><code style="margin-top: 2px; margin-right: 0px; margin-bottom: 2px; margin-left: 0px; padding-top: 5px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; overflow-x: auto; overflow-y: auto; display: block; height: auto; max-height: 200px; white-space: normal; font: normal normal normal 0.9em/normal Monaco, 'Andale Mono', 'Courier New', Courier, mono; line-height: 1.3em; color: black; ">OgreSceneManager.cpp<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />void SceneManager::_renderScene(Camera* camera, Viewport* vp, bool includeOverlays)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />......<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;if (mFindVisibleObjects)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;OgreProfileGroup("_findVisibleObjects", OGREPROF_CULLING);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// Assemble an AAB on the fly which contains the scene elements visible<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// by the camera.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;CamVisibleObjectsMap::iterator camVisObjIt = mCamVisibleObjectsMap.find( camera );<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;assert (camVisObjIt != mCamVisibleObjectsMap.end() &amp;&amp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;"Should never fail to find a visible object bound for a camera, "<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;"did you override SceneManager::createCamera or something?");<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// reset the bounds<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;camVisObjIt-&gt;second.reset();<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// Parse the scene and tag visibles<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;firePreFindVisibleObjects(vp);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;_findVisibleObjects(camera, &amp;(camVisObjIt-&gt;second),<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;mIlluminationStage == IRS_RENDER_TO_TEXTURE? true : false);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;firePostFindVisibleObjects(vp);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;mAutoParamDataSource-&gt;setMainCamBoundsInfo(&amp;(camVisObjIt-&gt;second));<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp;&nbsp; &nbsp;}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></code></dd></dl><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: bold; ">_findVisibleObjects(camera, &amp;(camVisObjIt-&gt;second),<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />mIlluminationStage == IRS_RENDER_TO_TEXTURE? true : false);</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: bold; ">mAutoParamDataSource-&gt;setMainCamBoundsInfo(&amp;(camVisObjIt-&gt;second));</span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />See bold text above, that moveable plane corrupted auto param.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />My solution is here:<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><dl class="codebox" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; background-color: #ffffff; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #d0d3ce; border-right-color: #d0d3ce; border-bottom-color: #d0d3ce; border-left-color: #d0d3ce; font-size: 1em; "><dt style="margin-top: 0px; margin-right: 0px; margin-bottom: 3px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-transform: uppercase; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #cccccc; font-size: 0.8em; font-weight: bold; display: block; ">CODE:&nbsp;<a href="http://www.ogre3d.org/forums/viewtopic.php?f=4&amp;t=55372&amp;sid=80769999cd809954c060b40f41940694#" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #445d3c; text-decoration: none; " target="_blank">SELECT ALL</a></dt><dd style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><code style="margin-top: 2px; margin-right: 0px; margin-bottom: 2px; margin-left: 0px; padding-top: 5px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; overflow-x: auto; overflow-y: auto; display: block; height: auto; max-height: 200px; white-space: normal; font: normal normal normal 0.9em/normal Monaco, 'Andale Mono', 'Courier New', Courier, mono; line-height: 1.3em; color: black; ">MovablePlane.h<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp; &nbsp; &nbsp; // Overridden from MovableObject<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp; &nbsp; &nbsp; const AxisAlignedBox&amp; getBoundingBox(void) const { return mNullBB; }<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp; &nbsp; &nbsp; /// Overridden from MovableObject<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; &nbsp; &nbsp; &nbsp; Real getBoundingRadius(void) const { return 0.0f /*Math::POS_INFINITY*/; }<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></code></dd></dl><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />thanks for any reply.&nbsp;<img src="http://www.ogre3d.org/forums/images/smilies/icon_smile.gif" alt=":)" title="Smile" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; " /></div></div><dl class="postprofile" id="profile375860" style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; min-height: 80px; color: #444444; border-left-width: 1px; border-left-style: solid; border-left-color: #ffffff; width: 352px; float: right; display: inline; "><dt style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 8px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.2em; "><a href="http://www.ogre3d.org/forums/memberlist.php?mode=viewprofile&amp;u=27387" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #445d3c; text-decoration: none; font-weight: bold; " target="_blank">oiram</a></dt><dd style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 8px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.2em; ">Newcomer</dd><dd style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 8px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.2em; ">&nbsp;</dd><dd style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 8px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.2em; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: normal; color: #000000; ">Posts:</strong>&nbsp;14</dd><dd style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 8px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.2em; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: normal; color: #000000; ">Joined:</strong>&nbsp;Sun Dec 13, 2009 4:06 am</dd><dd style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 8px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.2em; "><ul class="profile-icons" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; "><li class="pm-icon" style="margin-top: 0px; margin-right: 6px; margin-bottom: 3px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; background-image: url(http://www.ogre3d.org/forums/styles/proogre/imageset/en/icon_contact_pm.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; float: left; width: 28px; height: 20px; background-position: 0px 100%; background-repeat: no-repeat no-repeat; "><a href="http://www.ogre3d.org/forums/ucp.php?i=pm&amp;mode=compose&amp;action=quotepost&amp;p=375860" title="Private message" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #445d3c; text-decoration: none; background-image: url(http://www.ogre3d.org/forums/styles/proogre/imageset/en/icon_contact_pm.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; display: block; width: 28px; height: 20px; font-weight: bold; background-position: 0px 0px; background-repeat: no-repeat no-repeat; " target="_blank"></a></li></ul></dd></dl><div class="back2top" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; clear: both; height: 11px; text-align: right; "><a href="http://www.ogre3d.org/forums/viewtopic.php?f=4&amp;t=55372&amp;sid=80769999cd809954c060b40f41940694#wrap" class="top" title="Top" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #445d3c; text-decoration: none; background-image: url(http://www.ogre3d.org/forums/styles/proogre/imageset/icon_back_top.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; width: 11px; height: 11px; display: block; float: right; overflow-x: hidden; overflow-y: hidden; letter-spacing: 1000px; text-indent: 11px; background-position: 0% 0%; background-repeat: no-repeat no-repeat; " target="_blank">Top</a></div><span class="corners-bottom" style="margin-top: 0px; margin-right: -10px; margin-bottom: 0px; margin-left: -10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1px; line-height: 1px; display: block; height: 5px; background-image: url(http://www.ogre3d.org/forums/styles/proogre/theme/images/corners_left.png); clear: both; background-position: 0px 100%; background-repeat: no-repeat no-repeat; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1px; line-height: 1px; display: block; height: 5px; background-image: url(http://www.ogre3d.org/forums/styles/proogre/theme/images/corners_right.png); background-position: 100% 100%; background-repeat: no-repeat no-repeat; "></span></span></div></div><div id="p375935" class="post bg1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; background-color: #eef7ed; background-position: 100% 0px; background-repeat: no-repeat no-repeat; "><div class="inner" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span class="corners-top" style="margin-top: 0px; margin-right: -10px; margin-bottom: 0px; margin-left: -10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1px; line-height: 1px; display: block; height: 5px; background-image: url(http://www.ogre3d.org/forums/styles/proogre/theme/images/corners_left.png); background-position: 0px 0px; background-repeat: no-repeat no-repeat; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 1px; line-height: 1px; display: block; height: 5px; background-image: url(http://www.ogre3d.org/forums/styles/proogre/theme/images/corners_right.png); background-position: 100% 0px; background-repeat: no-repeat no-repeat; "></span></span><div class="postbody" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.48em; color: #333333; width: 1218px; float: left; clear: both; "><ul class="profile-icons" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; float: right; width: auto; "><li class="report-icon" style="margin-top: 0px; margin-right: 3px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; background-image: url(http://www.ogre3d.org/forums/styles/proogre/imageset/icon_post_report.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; float: left; width: 20px; height: 20px; background-position: 0px 100%; background-repeat: no-repeat no-repeat; "><a href="http://www.ogre3d.org/forums/report.php?f=4&amp;p=375935" title="Report this post" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #445d3c; text-decoration: none; background-image: url(http://www.ogre3d.org/forums/styles/proogre/imageset/icon_post_report.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; display: block; width: 20px; height: 20px; background-position: 0px 0px; background-repeat: no-repeat no-repeat; " target="_blank"></a></li><li class="quote-icon" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; background-image: url(http://www.ogre3d.org/forums/styles/proogre/imageset/en/icon_post_quote.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; float: left; width: 54px; height: 20px; background-position: 0px 100%; background-repeat: no-repeat no-repeat; "><a href="http://www.ogre3d.org/forums/posting.php?mode=quote&amp;f=4&amp;p=375935" title="Reply with quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #445d3c; text-decoration: none; background-image: url(http://www.ogre3d.org/forums/styles/proogre/imageset/en/icon_post_quote.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; display: block; width: 54px; height: 20px; background-position: 0px 0px; background-repeat: no-repeat no-repeat; " target="_blank"></a></li></ul><h3 style="margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0.3em !important; margin-left: 0px !important; padding-top: 2px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; font-weight: bold; text-transform: none; border-bottom-width: 1px; border-bottom-style: none; border-bottom-color: #cccccc; font-size: 1.5em; color: #486742; border-top-style: none; border-right-style: none; border-left-style: none; border-width: initial; border-color: initial; line-height: 18px; "><a href="http://www.ogre3d.org/forums/viewtopic.php?f=4&amp;t=55372&amp;sid=80769999cd809954c060b40f41940694#p375935" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #445d3c; text-decoration: none; " target="_blank">Re: MovablePlane issue</a></h3><p class="author" style="margin-top: 0px; margin-right: 15em; margin-bottom: 0.6em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; line-height: 1.2em; font-size: 1em; font-family: Verdana, Helvetica, Arial, sans-serif; "><a href="http://www.ogre3d.org/forums/viewtopic.php?p=375935#p375935" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #445d3c; text-decoration: none; " target="_blank"><img src="http://www.ogre3d.org/forums/styles/proogre/imageset/icon_post_target.gif" width="11" height="9" alt="Post" title="Post" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; " /></a>by&nbsp;<strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><a href="http://www.ogre3d.org/forums/memberlist.php?mode=viewprofile&amp;u=2" class="username-coloured" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 0px !important; font-weight: bold; display: inline !important; color: #aa0000; text-decoration: none; " target="_blank">sinbad</a></strong>&nbsp;&#187; Wed Feb 03, 2010 4:27 pm</p></div></div></div></span><p>&nbsp;</p><p>&nbsp;</p><p><span class="Apple-style-span" style="font-family: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; font-size: 16px; color: #333333; ">Yes, you're right - in future, you can just submit these kinds of things as a patch, but I've changed this. Thanks for the thorough report!</span></p><img src="http://www.cnblogs.com/oiramario/aggbug/1663843.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/oiramario/archive/2010/02/04/1663843.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/oiramario/archive/2010/02/04/1663843.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56831/" target="_blank">谷姐瘫痪 发公开信称已遭黑客攻击5天</a><span style="color:gray">(2010-02-10 13:21)</span><br/>· <a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><span style="color:gray">(2010-02-10 13:08)</span><br/>· <a href="http://news.cnblogs.com/n/56828/" target="_blank">暴雪介绍战网新界面</a><span style="color:gray">(2010-02-10 13:03)</span><br/>· <a href="http://news.cnblogs.com/n/56827/" target="_blank">TLS/SSL协议曝漏洞 影响所有版本Windows</a><span style="color:gray">(2010-02-10 12:56)</span><br/>· <a href="http://news.cnblogs.com/n/56826/" target="_blank">YouTube模式遭嫌弃 Hulu模式成视频行业新宠</a><span style="color:gray">(2010-02-10 12:52)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>实时动态云 perlin noise + 光照 + 太阳光遮挡</title><link>http://www.cnblogs.com/oiramario/archive/2010/02/02/1662178.html</link><dc:creator>千里马肝</dc:creator><author>千里马肝</author><pubDate>Tue, 02 Feb 2010 11:06:00 GMT</pubDate><guid>http://www.cnblogs.com/oiramario/archive/2010/02/02/1662178.html</guid><description><![CDATA[<p>阅读: 762 评论: 2 作者: <a href="http://www.cnblogs.com/oiramario/" target="_blank">千里马肝</a> 发表于 2010-02-02 19:06 <a href="http://www.cnblogs.com/oiramario/archive/2010/02/02/1662178.html" target="_blank">原文链接</a></p><span class="Apple-style-span" style="color: #333333; font-family: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; font-size: 13px; line-height: 18px; ">. The sun is very bright and it is making you squint !<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />2. The clouds near the sun are glowing much brighter than clouds far from the sun.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />3. Luckly the clouds are moving across the sky, and occasionally block out the sun, making it easier to see, so you don't have to squint as much.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />4. The clouds are also changing shape as they move across the sky.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />5. Not all the sky contains cloud. Some areas of sky are completely cloud free.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />6. The clouds do not continue into the distance forever. The furthest clouds are often obscured by haze.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />7. All of this used 29 pixel shader instructions to implement.<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />8. All of this are real-time on GPU that used only 1 noise 3d lookup texture even the sun is procedural.<br /><p>9. I coded the cloud in 2 days with rendermonkey and integration to ogre.&nbsp;</p><p>&nbsp;</p></span><p>[hjp2=400,300,true]http://player.youku.com/player.php/sid/XMTQ5ODE4MTcy/v.swf[/hjp2]</p><p><br /></p><p><img src="http://images.cnblogs.com/cnblogs_com/oiramario/rm.PNG" width="1024" height="609" alt="" /><br /></p><span class="Apple-style-span" style="font-family: arial, verdana, tahoma, simsun, sans-serif; line-height: 20px; font-size: 12px; "><p>&nbsp;</p><p><img src="http://images.cnblogs.com/cnblogs_com/oiramario/omv.PNG" width="977" height="697" alt="" />&nbsp;</p><p>实时动态云 perlin noise + 光照 + 太阳光遮挡</p></span><span class="Apple-style-span" style="font-family: arial, verdana, tahoma, simsun, sans-serif; line-height: 20px; font-size: 12px; ">全gpu计算 29个ps指令</span><span class="Apple-style-span" style="font-family: arial, verdana, tahoma, simsun, sans-serif; line-height: 20px; font-size: 12px; "><br /></span><span class="Apple-style-span" style="font-family: arial, verdana, tahoma, simsun, sans-serif; line-height: 20px; font-size: 12px; ">整个视频只使用到一张noise贴图<br /></span><p><span class="Apple-style-span" style="font-family: arial, verdana, tahoma, simsun, sans-serif; line-height: 20px; font-size: 12px; ">动态调整参数时录制视频有点卡</span>&nbsp;</p><p><span class="Apple-style-span" style="font-family: arial, verdana, tahoma, simsun, sans-serif; line-height: 20px; font-size: 12px; ">从查资料到用rendermonkey写shader，最后整合进ogre<br /><span class="Apple-style-span" style="font-family: verdana, 'courier new'; line-height: 21px; font-size: 14px; "><span class="Apple-style-span" style="font-family: arial, verdana, tahoma, simsun, sans-serif; line-height: 20px; font-size: 12px; ">一共花了2天时间</span>&nbsp;</span></span></p><p>&nbsp;</p><span class="Apple-style-span" style="color: #333333; font-family: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; font-size: 13px; line-height: 18px; ">reference:<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></span><p><span class="Apple-style-span" style="font-family: 'Lucida Grande', 'Trebuchet MS', Verdana, Helvetica, Arial, sans-serif; line-height: 18px; font-size: 13px; color: #333333; "><a href="http://freespace.virgin.net/hugo.elias/models/m_clouds.htm" class="postlink" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #869a80; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #666666; " target="_blank">http://freespace.virgin.net/hugo.elias/models/m_clouds.htm</a></span>&nbsp;</p><p>&nbsp;</p><img src="http://www.cnblogs.com/oiramario/aggbug/1662178.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/oiramario/archive/2010/02/02/1662178.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/oiramario/archive/2010/02/02/1662178.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56831/" target="_blank">谷姐瘫痪 发公开信称已遭黑客攻击5天</a><span style="color:gray">(2010-02-10 13:21)</span><br/>· <a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><span style="color:gray">(2010-02-10 13:08)</span><br/>· <a href="http://news.cnblogs.com/n/56828/" target="_blank">暴雪介绍战网新界面</a><span style="color:gray">(2010-02-10 13:03)</span><br/>· <a href="http://news.cnblogs.com/n/56827/" target="_blank">TLS/SSL协议曝漏洞 影响所有版本Windows</a><span style="color:gray">(2010-02-10 12:56)</span><br/>· <a href="http://news.cnblogs.com/n/56826/" target="_blank">YouTube模式遭嫌弃 Hulu模式成视频行业新宠</a><span style="color:gray">(2010-02-10 12:52)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>ogre - Fix bug in HLSL with 3&amp;#215;4 matrix arrays</title><link>http://www.cnblogs.com/oiramario/archive/2009/12/29/1635435.html</link><dc:creator>千里马肝</dc:creator><author>千里马肝</author><pubDate>Tue, 29 Dec 2009 12:48:00 GMT</pubDate><guid>http://www.cnblogs.com/oiramario/archive/2009/12/29/1635435.html</guid><description><![CDATA[<p>阅读: 190 评论: 0 作者: <a href="http://www.cnblogs.com/oiramario/" target="_blank">千里马肝</a> 发表于 2009-12-29 20:48 <a href="http://www.cnblogs.com/oiramario/archive/2009/12/29/1635435.html" target="_blank">原文链接</a></p><p>自从１.６.１起的问题,　我的提交也加进去了.</p>
<p><a href="http://www.ogre3d.org/2009/12/27/ogre-v1-6-5-shoggoth-released#more-737" target="_blank">http://www.ogre3d.org/2009/12/27/ogre-v1-6-5-shoggoth-released#more-737</a></p>
<p>&nbsp;</p>
<p>我在论坛里闹腾了一下,　终于引起了sinbad的注意.　下次会按照正确的方式提交bug.</p>
<p><a href="http://www.ogre3d.org/forums/viewtopic.php?f=2&amp;t=54260" target="_blank">http://www.ogre3d.org/forums/viewtopic.php?f=2&amp;t=54260</a></p><img src="http://www.cnblogs.com/oiramario/aggbug/1635435.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/oiramario/archive/2009/12/29/1635435.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/oiramario/archive/2009/12/29/1635435.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56831/" target="_blank">谷姐瘫痪 发公开信称已遭黑客攻击5天</a><span style="color:gray">(2010-02-10 13:21)</span><br/>· <a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><span style="color:gray">(2010-02-10 13:08)</span><br/>· <a href="http://news.cnblogs.com/n/56828/" target="_blank">暴雪介绍战网新界面</a><span style="color:gray">(2010-02-10 13:03)</span><br/>· <a href="http://news.cnblogs.com/n/56827/" target="_blank">TLS/SSL协议曝漏洞 影响所有版本Windows</a><span style="color:gray">(2010-02-10 12:56)</span><br/>· <a href="http://news.cnblogs.com/n/56826/" target="_blank">YouTube模式遭嫌弃 Hulu模式成视频行业新宠</a><span style="color:gray">(2010-02-10 12:52)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>ogre无法读取中文路径的解决办法</title><link>http://www.cnblogs.com/oiramario/archive/2009/12/17/1626304.html</link><dc:creator>千里马肝</dc:creator><author>千里马肝</author><pubDate>Thu, 17 Dec 2009 05:24:00 GMT</pubDate><guid>http://www.cnblogs.com/oiramario/archive/2009/12/17/1626304.html</guid><description><![CDATA[<p>阅读: 262 评论: 2 作者: <a href="http://www.cnblogs.com/oiramario/" target="_blank">千里马肝</a> 发表于 2009-12-17 13:24 <a href="http://www.cnblogs.com/oiramario/archive/2009/12/17/1626304.html" target="_blank">原文链接</a></p><p>下面是一段ogre中的文件操作相关的源码</p><div class="cnblogs_code" onclick="cnblogs_code_show('4b8f718a-bf33-4318-8cf8-097b8a7e566a')"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_4b8f718a-bf33-4318-8cf8-097b8a7e566a" style="display:none"  alt="" /><img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_4b8f718a-bf33-4318-8cf8-097b8a7e566a" onclick="cnblogs_code_hide('4b8f718a-bf33-4318-8cf8-097b8a7e566a',event)"><span class="cnblogs_code_collapse">代码</span><div id="cnblogs_code_open_4b8f718a-bf33-4318-8cf8-097b8a7e566a"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;DataStreamPtr&nbsp;FileSystemArchive::open(</span><span style="color: #0000FF;">const</span><span style="color: #000000;">&nbsp;String</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;filename)&nbsp;</span><span style="color: #0000FF;">const</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;full_path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;concatenate_path(mName,&nbsp;filename);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Use&nbsp;filesystem&nbsp;to&nbsp;determine&nbsp;size&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;(quicker&nbsp;than&nbsp;streaming&nbsp;to&nbsp;the&nbsp;end&nbsp;and&nbsp;back)</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">struct</span><span style="color: #000000;">&nbsp;stat&nbsp;tagStat;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&nbsp;ret&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;stat(full_path.c_str(),&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">tagStat);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert(ret&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800080;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Problem&nbsp;getting&nbsp;file&nbsp;size</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Always&nbsp;open&nbsp;in&nbsp;binary&nbsp;mode</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::ifstream&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">origStream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;OGRE_NEW_T(std::ifstream,&nbsp;MEMCATEGORY_GENERAL)();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;origStream</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">open(full_path.c_str(),&nbsp;std::ios::</span><span style="color: #0000FF;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;std::ios::binary);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Should&nbsp;check&nbsp;ensure&nbsp;open&nbsp;succeeded,&nbsp;in&nbsp;case&nbsp;fail&nbsp;for&nbsp;some&nbsp;reason.</span><span style="color: #008000;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">if</span><span style="color: #000000;">&nbsp;(origStream</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">fail())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OGRE_DELETE_T(origStream,&nbsp;basic_ifstream,&nbsp;MEMCATEGORY_GENERAL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">Cannot&nbsp;open&nbsp;file:&nbsp;</span><span style="color: #800000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;filename,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">FileSystemArchive::open</span><span style="color: #800000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;Construct&nbsp;return&nbsp;stream,&nbsp;tell&nbsp;it&nbsp;to&nbsp;delete&nbsp;on&nbsp;destroy</span><span style="color: #808080;"><br /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileStreamDataStream</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;stream&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;OGRE_NEW&nbsp;FileStreamDataStream(filename,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;origStream,&nbsp;tagStat.st_size,&nbsp;</span><span style="color: #0000FF;">true</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF;">return</span><span style="color: #000000;">&nbsp;DataStreamPtr(stream);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></div></div></div><p>&nbsp;</p><p>&nbsp;</p><p>主要的代码是</p><p><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000;">origStream</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">open(full_path.c_str(),&nbsp;std::ios::</span><span style="color: #0000FF;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;std::ios::binary);</span></div></div><p>&nbsp;</p></p><p>&nbsp;</p><p>通过在文件流打开文件之前，我们设置一下语言环境</p><p><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000;">std::locale::</span><span style="color: #0000FF;">global</span><span style="color: #000000;">(std::locale(</span><span style="color: #800000;">""</span><span style="color: #000000;">));</span></div></div><p>&nbsp;</p></p><p>&nbsp;</p><p>接下来我们发现，中文路径的问题解决了，但是<span class="Apple-style-span" style="font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 26px; ">向文件中写入整型或浮点型数据时会有问题，比如&#8220;1000&#8221;，输出之后就成了&#8220;1，000&#8221;</span></p><p>这正是因为我们改变了语言环境的原因，为了将修改减少到最小，我们应该在文件打开完毕后，恢复之前的设置</p><p><div class="cnblogs_code"><div><!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--><span style="color: #000000;">std::locale&nbsp;saveLocal&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;std::locale::</span><span style="color: #0000FF;">global</span><span style="color: #000000;">(std::locale(</span><span style="color: #800000;">""</span><span style="color: #000000;">));<br />origStream</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">open(full_path.c_str(),&nbsp;std::ios::</span><span style="color: #0000FF;">in</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;std::ios::binary);<br />std::locale::</span><span style="color: #0000FF;">global</span><span style="color: #000000;">(saveLocal);<br /></span></div></div><p>&nbsp;</p></p><p>&nbsp;</p><p>everything is fine now~</p><img src="http://www.cnblogs.com/oiramario/aggbug/1626304.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/oiramario/archive/2009/12/17/1626304.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/oiramario/archive/2009/12/17/1626304.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56831/" target="_blank">谷姐瘫痪 发公开信称已遭黑客攻击5天</a><span style="color:gray">(2010-02-10 13:21)</span><br/>· <a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><span style="color:gray">(2010-02-10 13:08)</span><br/>· <a href="http://news.cnblogs.com/n/56828/" target="_blank">暴雪介绍战网新界面</a><span style="color:gray">(2010-02-10 13:03)</span><br/>· <a href="http://news.cnblogs.com/n/56827/" target="_blank">TLS/SSL协议曝漏洞 影响所有版本Windows</a><span style="color:gray">(2010-02-10 12:56)</span><br/>· <a href="http://news.cnblogs.com/n/56826/" target="_blank">YouTube模式遭嫌弃 Hulu模式成视频行业新宠</a><span style="color:gray">(2010-02-10 12:52)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>如何加强角色渲染的真实感（self shadow + subsurface scattering + rim lighting）</title><link>http://www.cnblogs.com/oiramario/archive/2009/10/30/1592983.html</link><dc:creator>千里马肝</dc:creator><author>千里马肝</author><pubDate>Fri, 30 Oct 2009 04:54:00 GMT</pubDate><guid>http://www.cnblogs.com/oiramario/archive/2009/10/30/1592983.html</guid><description><![CDATA[<p>阅读: 1607 评论: 2 作者: <a href="http://www.cnblogs.com/oiramario/" target="_blank">千里马肝</a> 发表于 2009-10-30 12:54 <a href="http://www.cnblogs.com/oiramario/archive/2009/10/30/1592983.html" target="_blank">原文链接</a></p><p style="margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; "><span style="font-size: 12pt; ">&nbsp;&nbsp; &nbsp; 最近一直在玩street fighter IV，被其夸张的角色建模、华丽的动作和漂亮的油画效果所震撼。里面的角色，在</span><span style="font-size: 12pt; ">对手跳起或蹲下时，自己的</span><span style="font-size: 12pt; ">头部会一直注视着对手；近身时，如果一方发出必杀技，另一方的面部将作出恐怖和惊吓的表情。这些许细节，将角色的个性表现得淋漓尽致。值得一提的是，头部注视对手的效果，2D格斗的年代，早在SNK的《世界英雄》里已经实现，虽然表现力以现在的眼光来看，确实有点粗糙，但足以一窥日本人在细节上的重视程度。</span></p>
<p><span style="font-size: 12pt; ">&nbsp;&nbsp; &nbsp;&nbsp;不过，真正让我惊艳的，还是bio5。日本人对于各种高端图形技术已经运用得相当成熟，整部游戏，完全的实时渲染，让人感受到一部大片的视觉享受。其对技术的熟练程度，当吾辈还在摸索shadowmap精度问题，为到底是psm还是vsm或是csm好争执的时候，他们早已可以将这些技术整合完成，并已经用于艺术表现。</span></p>
<p><span style="font-size: 12pt; ">&nbsp;&nbsp; &nbsp;&nbsp;传统的局部光照diffuse + specular，</span><span style="font-size: 12pt; ">&nbsp;效果比较单一，不受周围环境影响，给人的感受就是，单个物体看着还行，复杂的场景渲染就会觉得有点假。</span><span style="font-size: 12pt; ">真实世界中的全局光照，是不会出现LdotN的背面那么黑的情况。因为大量的光线在散射后，基本上不会出现&#8220;绝对黑&#8221;，仅仅一个ambient是无法模拟出来的，这也是为什么各种GI渲染的效果如此逼真的原因。</span></p>
<p><span style="font-size: 12pt; ">&nbsp;&nbsp; &nbsp;&nbsp;大致地总结了一下，为了表现更生动，需要重点关注的是人物头部，以及光照渲染，其他的可参照现有技术：</span></p>
<p><br />
</p>
<p><span style="font-size: 12pt; ">角色头部相关技术</span><br />
<span style="font-size: 12pt; ">-------------------------&nbsp;</span></p>
<p><span style="font-size: 12pt; ">1. 丰富的面部表情，通过morph网格变形实现，需要做一个编辑器，供美术调整面部顶点，并记录下来，供后期VS混合时使用。</span></p>
<p><span style="font-size: 12pt; ">2. 活动的头部，通过控制颈部的骨骼，限制一定的活动范围，达到&#8220;注视&#8221;目标的效果。（国外的游戏很早就开始关注的到这个细节，特别是一些恐怖和解谜的游戏，可怜我国的单机游戏，血狮做完就直接大跃进到MMO）&nbsp;</span></p>
<p><span style="font-size: 12pt; ">3.&nbsp;</span><span style="font-size: 12pt; ">活动的眼球，</span><span style="font-size: 12pt; ">&nbsp;眨动的眼皮。WOW的实现是，眼眶是固定的模型，眼睛是一个片，可以左中右三方向随机固定运动，至于眨眼，只是随机时间内短暂出现一个皮肤色的片，暂时挡住眼球部位，实现瞬间的眨眼效果。</span><span style="font-size: 12pt; ">这样的细节程度，可以满足WOW这种近境渲染不多的游戏；对于生化五这种注重人物表现的游戏，通常的实现应该是，眼眶的顶点可活动，随时时间播放&#8220;合拢&#8221;动画，达到眨眼效果，也可以实现各种&#8220;瞪眼&#8221;和&#8220;眯眼&#8221;的效果。而眼球，一个半圆的球面，通过一根骨骼控制，同头部实现。</span></p>
<p>
</p><p style="margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; "><br />
</p>
<p><span style="font-size: 12pt; ">光照相关技术</span><br />
<span style="font-size: 12pt; ">-------------------------&nbsp;</span></p>
<div><span style="font-size: 12pt; ">1.&nbsp;self shadow，众多shadow map，我选择的是vsm，它在实现self shadow的效果中表现良好，一定程度模拟出soft shadow的效果，部分精度、走样和漏光都可以解决，通过淡化阴影，效果不错。</span></div><p>&nbsp;</p>
<p><span style="font-size: 12pt; ">2. 3S(subsurface scattering)，</span><span class="Apple-style-span" style="font-family: Verdana, Arial, 宋体, sans-serif; line-height: 16px; font-size: 12pt; ">次表面散射是指光线照射到物体后，进入物体内部，经过在物体内的散射从物体表面的其他顶点/像素离开物体的现象。在透明/半透明的材质上，这种效果比较明显，比如说是皮肤，玉等等。怎么理解？请把手张开，挡住太阳，然后观察这只手。可以说这种效果是比较难以模拟的，在没有复杂的预计算前提下，很难达到接近物理真实的。这里通过在ps中拿到已经projection后的z，即可以简单的理解为散射的一个参数，通过一些非物理的计算，控制住其散射的比例，以达到柔和的效果。</span></p><p>&nbsp;</p>
<p><span style="font-size: 12pt; ">3.&nbsp;</span><span style="font-size: 12pt; ">rim lighting，皮肤边缘上的汗毛和毛孔能捕捉光线，当光源正对着摄像机时，你可以观察到这种效果。这里可以通过1 - VdotN来达到这个目的，为了得到更好的边缘，最好将oneMinusVdotN再乘以</span><span style="font-size: 12pt; ">自己一次。是的，因为是VdotN，这种边缘模拟实现只在高镶嵌的模型上效果最好，对于低模，相对效果要差一点。</span></p>
<p><br />
</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/oiramario/teapot.PNG" width="1128" height="368" alt="" /><br />
</p>
<p>&nbsp;</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/oiramario/hebe.PNG" width="384" height="549" alt="" /></p><p>&nbsp;&nbsp;</p><p>&nbsp;<img src="http://images.cnblogs.com/cnblogs_com/oiramario/drakeadon.PNG" alt="" /></p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/oiramario/aggbug/1592983.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/oiramario/archive/2009/10/30/1592983.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/oiramario/archive/2009/10/30/1592983.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56831/" target="_blank">谷姐瘫痪 发公开信称已遭黑客攻击5天</a><span style="color:gray">(2010-02-10 13:21)</span><br/>· <a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><span style="color:gray">(2010-02-10 13:08)</span><br/>· <a href="http://news.cnblogs.com/n/56828/" target="_blank">暴雪介绍战网新界面</a><span style="color:gray">(2010-02-10 13:03)</span><br/>· <a href="http://news.cnblogs.com/n/56827/" target="_blank">TLS/SSL协议曝漏洞 影响所有版本Windows</a><span style="color:gray">(2010-02-10 12:56)</span><br/>· <a href="http://news.cnblogs.com/n/56826/" target="_blank">YouTube模式遭嫌弃 Hulu模式成视频行业新宠</a><span style="color:gray">(2010-02-10 12:52)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>这几个礼拜做的事情</title><link>http://www.cnblogs.com/oiramario/archive/2009/10/13/1582701.html</link><dc:creator>千里马肝</dc:creator><author>千里马肝</author><pubDate>Tue, 13 Oct 2009 10:56:00 GMT</pubDate><guid>http://www.cnblogs.com/oiramario/archive/2009/10/13/1582701.html</guid><description><![CDATA[<p>阅读: 974 评论: 5 作者: <a href="http://www.cnblogs.com/oiramario/" target="_blank">千里马肝</a> 发表于 2009-10-13 18:56 <a href="http://www.cnblogs.com/oiramario/archive/2009/10/13/1582701.html" target="_blank">原文链接</a></p><div>plugin相关</div>
<div>1. 骨骼关键帧输出进行了优化，以更少的关键帧表现动画，以提高渲染效率和载入的速度，但还有点问题需要解决。（因为max会使用很多复杂的controler，而engine通常无法实现，所以仅取关键帧是不行的）</div>
<div>2. 对于avatar，之前是每个身体部件都有自己的骨架，这是没有必要的。现在改成只输出一套骨架，挂载点也在内，各个身体部件共享这一套骨架，渲染效率大大提升。</div>
<div>3. 因为avatar骨架的修改，现在不需要指定挂载点所在的骨骼。</div>
<div>4. 整理了整个插件的命名和代码，更清晰明了。</div>
<div>5. 支持了多层纹理UV的导出，以及对应材质的纹理tex_coord_set。</div>
<div>6. 默认self lumination这一层为lightmap层。</div>
<div>7. 输出信息更为正确和详细。</div>
<div>8. 导出速度提升30％。</div>
<div><br />
</div>
<div>渲染相关</div>
<div>1. 试验了HSL-&gt;RGB的几种方法，理论上使用3d texture查表是最快的，也是最耗显存的；最终证明传统转换算法才是最有效的。</div>
<div>2. 用简单的方式实现了一个glow的效果，感觉上要比ogre自带的bloom效果要好，而且只需要2个pass。</div>
<div>3. 充分理解和认识到main loop的正确写法和重要程度，logic和display是需要明确分开的。</div>
<div>4. 开始尝试将self shadowing加入avatar渲染。</div>
<div>5. 搞不定lighting map，只能将场景导回max，然后再导出，正在进一步试验中。</div><img src="http://www.cnblogs.com/oiramario/aggbug/1582701.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/oiramario/archive/2009/10/13/1582701.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/oiramario/archive/2009/10/13/1582701.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56831/" target="_blank">谷姐瘫痪 发公开信称已遭黑客攻击5天</a><span style="color:gray">(2010-02-10 13:21)</span><br/>· <a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><span style="color:gray">(2010-02-10 13:08)</span><br/>· <a href="http://news.cnblogs.com/n/56828/" target="_blank">暴雪介绍战网新界面</a><span style="color:gray">(2010-02-10 13:03)</span><br/>· <a href="http://news.cnblogs.com/n/56827/" target="_blank">TLS/SSL协议曝漏洞 影响所有版本Windows</a><span style="color:gray">(2010-02-10 12:56)</span><br/>· <a href="http://news.cnblogs.com/n/56826/" target="_blank">YouTube模式遭嫌弃 Hulu模式成视频行业新宠</a><span style="color:gray">(2010-02-10 12:52)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>游戏主循环</title><link>http://www.cnblogs.com/oiramario/archive/2009/09/23/1572836.html</link><dc:creator>千里马肝</dc:creator><author>千里马肝</author><pubDate>Wed, 23 Sep 2009 10:29:00 GMT</pubDate><guid>http://www.cnblogs.com/oiramario/archive/2009/09/23/1572836.html</guid><description><![CDATA[<p>阅读: 765 评论: 4 作者: <a href="http://www.cnblogs.com/oiramario/" target="_blank">千里马肝</a> 发表于 2009-09-23 18:29 <a href="http://www.cnblogs.com/oiramario/archive/2009/09/23/1572836.html" target="_blank">原文链接</a></p><div><br />
</div>
<div><span  style="font-family: 宋体, Hei, Sans, Song, Tahoma, SimSun; font-size: 12px; line-height: normal; color: #666666; ">
<div id="c_article" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; ">
<div class="top" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; width: 730px; height: 154px; float: right; background-image: url(http://08s.cn/images/corner/con_boxC.jpg); background-repeat: repeat-x; background-attachment: initial; background-color: initial; background-position: 50% 0%; ">
<div class="l" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: left; height: 154px; width: 10px; background-image: url(http://08s.cn/images/corner/con_boxL.jpg); background-repeat: no-repeat; background-attachment: initial; background-color: initial; background-position: 0% 0%; "></div>
<div class="c" style="padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; width: 690px; float: left; ">
<div id="place" style="padding-top: 5px; padding-right: 22px; padding-bottom: 5px; padding-left: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #0c4e9c; background-image: url(http://08s.cn/images/ico_04.gif); background-repeat: no-repeat; background-attachment: initial; background-color: initial; font-weight: bold; font-size: 14px; line-height: 1.5em; background-position: 0px 6px; ">现在位置：<a href="http://www.08s.cn/" style="padding-top: 0px; padding-right: 6px; padding-bottom: 0px; padding-left: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #0c4e9c; text-decoration: none; font-weight: bold; font-size: 14px; ">主页</a>&gt;<a href="http://08s.cn/plus/list.php?tid=3" style="padding-top: 0px; padding-right: 6px; padding-bottom: 0px; padding-left: 6px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #0c4e9c; text-decoration: none; font-weight: bold; font-size: 14px; ">C++博客</a>&gt; 文章内容</div>
<h1 style="padding-top: 20px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 18px; font-weight: bold; color: #000000; clear: both; ">[翻译]游戏主循环</h1>
<div class="info" style="padding-top: 6px; padding-right: 0px; padding-bottom: 6px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #666666; "><span style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; float: right; position: relative; top: -15px; "><a href="javascript:JSAddFavorite();" title="加入收藏" style="padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #111111; text-decoration: none; font-size: 12px; "><img src="http://08s.cn/images/collection.gif" alt="收藏" style="padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /></a><a href="javascript:void(0);" onclick="copy_url()" title="复制网址" style="padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #111111; text-decoration: none; font-size: 12px; "><img src="http://08s.cn/images/issuance.gif" alt="发布" style="padding-top: 0px; padding-right: 5px; padding-bottom: 0px; padding-left: 5px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /></a></span>更新日期：2009-09-02 点击：13</div>
</div>
<div class="c" style="padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 10px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; width: 690px; float: left; "></div>
</div>
</div>
<div id="end_text" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; text-align: left; color: #333333; overflow-x: hidden; overflow-y: hidden; font-size: 14px; clear: both; line-height: 1.7em; word-wrap: break-word; word-break: break-all; ">
<h2 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "></h2>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">原文地址<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
http://dewitters.koonsolo.com/gameloop.html<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 18pt; ">游戏主循环</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">引言</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">游戏主循环是每个游戏的心跳，输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜鸟游戏程序员如何为自己的程序供养。不过不用担心，因为你刚好不小心看到了这篇，也是唯一一篇给予这个话题足够重视的文章。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">由于我身为游戏程序员，我见过许许多多的手机小游戏的代码。这些代码给我展示了五彩缤纷的游戏主循环实现方法。你可能要问：&#8220;这么简单的一个小玩意还能做到千奇百怪？&#8221; 事实就是这样，我就会在此文中讨论一些主流实现的优缺点，并且给你介绍在我看来最好的输送养分的解决方案。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">游戏主循环</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
每一个游戏都是由获得用户输入，更新游戏状态，处理AI，播放音乐和音效，还有画面显示这些行为组成。游戏主循环就是用来处理这个行为序列。如我在引言中所说，游戏主循环是每一个游戏的心跳。在此文中我不会深入讲解上面提到的任何一个行为，而只详细介绍游戏主循环。所以我把这些行为简化为了两个函数：</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">update_game(); //更新游戏状态 （后文可能翻译为逻辑帧）<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
display_game(); //更新显示 （显示帧）</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">下面是最简单的游戏主循环：</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">bool game_is_running = true;</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">while( game_is_running ) {<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
update_game();<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
display_game();<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
}<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
这个简单循环的主要问题是它忽略了时间，游戏会尽情的飞奔。在小霸王机器上运行会使玩家有极强的挫败感，在牛逼的机器上运行则会要求玩家有超人的判断力和APM（原意为慢的机器上运行慢，快的机器上运行快%26#8230;%26#8230;）。在远古时代，硬件的速度已知的情况下，这不算什么，但是目前有如此多的硬件平台使得我们不得不去处理时间这个重要因素。对于时间的处理有很多的方法，接下来我会一一奉上。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">首先我会解释两个贯穿全文的术语：</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">每秒帧数（后简称FPS）</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">FPS是Frames Per Second的缩写。在此文的上下文中它意味着display_game()每秒被调用的次数。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">游戏速度</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">游戏速度是每秒更新游戏状态的速度，换言之，即update_game()每秒被调用的次数。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">FPS依赖于恒定的游戏速度</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">实现</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">一个让游戏每秒稳定运行在25帧的解决方案如下：</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">const int FRAMES_PER_SECOND = 25;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
const int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">DWORD next_game_tick = GetTickCount();&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
// GetTickCount() returns the current number of milliseconds<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
// that have elapsed since the system was started</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">int sleep_time = 0;</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">bool game_is_running = true;</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">while( game_is_running ) {<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
update_game();<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
display_game();</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">next_game_tick += SKIP_TICKS;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
sleep_time = next_game_tick - GetTickCount();<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
if( sleep_time &gt;= 0 ) {<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
Sleep( sleep_time );<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
}<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
else {<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
// Shit, we are running behind!<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
}<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
}<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
这个方案有一个非常大的优点：简单！因为你知道update_game()每秒被调用25次，那么你的游戏的逻辑部分代码编写将非常直白。比如说在这种主循环实现的游戏中实现一个 重放 函数将非常简单（译者注：因为每帧的间隔时间已知，只需要记录每一帧游戏的状态，回放时按照恒定的速度播放即可。就像电影胶片一样）。如果在游戏中没有受到随机值的影响，只需要记录玩家的输入就可以实现重放。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">在你实现这个循环的硬件上你可以按需要调整FRAMES_PER_SECOND到一个理想的值，但是这个游戏主循环实现会在各种硬件上表现得怎么样呢？</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">小霸王机</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">如果硬件可以应付指定的FPS，那么不会有什么事情发生。但是小霸王通常是应付不了的，游戏就会卡。在极端情况下就会卡得掉渣，或者一步十卡、一卡十步（原意为某些情况下游戏速度很慢，有一些情况下又比较正常）。这样的问题会毁掉你的游戏，使得玩家及其挫败。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">牛逼的机器</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">在牛逼的机器上似乎不会有任何问题，但是这样的游戏主循环浪费大量的时钟循环！牛逼的机器运行这个游戏可以轻松的跑到300帧，却每秒只运行了25或者30帧~ 那么这个主循环实现会让拥有牛逼硬件的玩家无法尽情发挥其硬件效果产生极大的挫败感（原意为这样的实现会让你的视觉效果受到影响，尤其是高速移动物体）。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">从另外一个角度来说，在移动设备上，这一点可能会是一个优点。游戏持续的高速运行会很快地消耗电池%26#8230;%26#8230;</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">结论</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">基于恒定游戏速度的FPS的主循环实现方案简单易学。但是存在一些问题，比如定义的FPS太高会使得老爷机不堪重负，定义的FPS太低则会使得高端硬件损失太多视觉效果。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">基于可变FPS的游戏速度</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">实现</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">另外一种游戏实现可以让游戏尽可能的飞奔，并且让依据FPS来决定游戏速度。游戏状态会根据每一显示帧消耗的时间来进行更新。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">DWORD prev_frame_tick;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
DWORD curr_frame_tick = GetTickCount();</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">bool game_is_running = true;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
while( game_is_running ) {<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
prev_frame_tick = curr_frame_tick;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
curr_frame_tick = GetTickCount();</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">update_game( curr_frame_tick - prev_frame_tick );<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
display_game();<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
}<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
这个游戏主循环的代码比起之前稍微复杂一些，因为我们必须去考虑两次update_game()调用之间的时间差。不过，好在这并不算复杂。<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
初窥这个实现的代码好像是一个理想的实现方案。我已经见过许多聪明的游戏程序员用这种方式来书写游戏主循环。但是我会给你展示这个实现方案在小霸王和牛逼的机器上的严重问题！是的，包括非常职业非常娴熟非常牛逼的玩家的机器。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">小霸王</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">小霸王会在某些运算复杂的地方出现卡的情况，尤其在3D游戏中的复杂场景更是如此。帧率的降低会影响游戏输入的响应，同时降低玩家的反应速度。游戏状态更新也会因此突然受到影响。这样的情况会使得玩家和AI的反应速度减慢，造成玩家挫败感加剧。比如一个在正常帧率下可以轻松越过的障碍会在低帧率下无法逾越。更严重的问题是在小霸王上会经常发生一些违反物理规律的怪事，如果这些运算涉及到物理模拟的话。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">牛逼的机器</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">你可能会好奇，为什么刚才的游戏循环在飞快的机器上会出现问题。不幸的是，这个方案的确如此，首先，让我给你介绍一些计算机数学知识。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">浮点数类型占用内存大小是有限的，那么有一些数值就无法被呈现。比如0.1就不能用2进制表示，所以会被近似的存储在一个浮点数中。我用python给你们展示一下。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">&gt;&gt;&gt; 0.1<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
0.10000000000000001</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">这个问题本身并不怎么具有戏剧性，但是这样的后果却截然相反。比方说你的赛车的速度是0.001个单元每微秒。那么正确的结果是在10秒后你的赛车会移动10个单位，那么我们这样来实现一下：</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">&gt;&gt;&gt; def get_distance( fps ):<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
... skip_ticks = 1000 / fps<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
... total_ticks = 0<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
... distance = 0.0<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
... speed_per_tick = 0.001<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
... while total_ticks &lt; 10000:<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
... distance += speed_per_tick * skip_ticks<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
... total_ticks += skip_ticks<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
... return distance</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
现在我们来得到40帧每秒时运行10秒后的结果<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
&gt;&gt;&gt; get_distance( 40 )<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
10.000000000000075</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">等等~怎么不是10呢？发生了什么？嗯，400次加法后的误差就有这么大，每秒运行100次加法后又会是怎么一个样子呢？</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">&gt;&gt;&gt; get_distance( 100 )<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
9.9999999999998312</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">误差越来越大了！那么，40帧每秒的结果和100帧每秒之间误差差距是多大呢？</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">&gt;&gt;&gt; get_distance( 40 ) - get_distance( 100 )<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
2.4336088699783431e-13</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">你可能会想这样的误差可以忽略。但是真正的问题出现在你使用这些错误的值去进行更多的运算。小的误差会被扩大为致命的错误！然后这些错误会在游戏飞奔的同时毁掉它！这些问题发生的几率绝对大到足够引起你的注意。我有见过因为这个原因在高帧率出现问题得游戏。之后那个游戏程序员发现这些问题出现在游戏的核心部分，只有重写大部分代码才能修复它。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">结论</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">这样的游戏主循环看上起不错，但是并不怎么样。不管运行它的硬件怎样，都可能出现严重的问题。另外，游戏实现的代码相对于固定游戏速度的主循环而言更加复杂，那你还有什么使用它的理由呢？</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">最大FPS和恒定游戏速度</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">实现</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">我们的第一个实现中，FPS依赖于恒定的游戏速度，在低端的机器上会出现问题。游戏速度和游戏显示都会出现掉帧。一个可行的解决方案是牺牲显示帧率的来保持恒定的游戏速度。下面就实现了这种方案：</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
const int TICKS_PER_SECOND = 50;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
const int SKIP_TICKS = 1000 / TICKS_PER_SECOND;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
const int MAX_FRAMESKIP = 10;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
DWORD next_game_tick = GetTickCount();<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
int loops;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
bool game_is_running = true;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
while( game_is_running ) {</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">loops = 0;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
while( GetTickCount() &gt; next_game_tick %26amp;%26amp; loops &lt; MAX_FRAMESKIP) {<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
update_game();<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
next_game_tick += SKIP_TICKS;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
loops++;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
}<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
display_game();<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
}</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">游戏会以稳定的50（逻辑）帧每秒的速度更新，渲染速度也尽可能的快。需要注意的是，如果渲染速度超过了50帧每秒的话，有一些帧的画面将会是完全相同的。所以显示帧率实际上也等同于最快每秒50帧。在小霸王上运行的话，显示帧率会在更新游戏状态循环达到MAX_FRAMESKIP时下降。从上面这个例子来说就是当渲染帧率下降到5（FRAMES_PER_SECOND / MAX_FRAMESKIP）以下时，游戏速度会变慢。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">小霸王</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">在小霸王上运行这样的游戏循环会出现掉帧，但是游戏速度不受到影响。如果硬件还是没有办法处理这样的循环，那么游戏速度和游戏帧率都会受到影响。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">牛逼的机器</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">在牛逼的机器上这个游戏循环不会出现问题，但是如同第一个解决方案一样，还是浪费了太多的时钟周期。找到一个快速更新并且依然能够在小霸王上运行游戏的平衡点是至关重要的！</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">结论</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">使用上面的这个方案可以使游戏的实现代码比较简单。但是仍然有一些问题：如果定义了一个过高的FPS会让小霸王吃不消，如果过低则会让牛逼的机器难以发挥性能。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
<strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">独立的可变显示帧率和恒定的游戏速度</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">实现</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">有没有可能对之前的那种方案进行优化使得它在各种平台上都有足够好的表现呢？当然是有的！游戏状态本身并不需要每秒更新60次。玩家输入，AI信息等都不需要如此高的帧率来进行更新，大约每秒25次就足够了。所以，我们可以试着让update_game()每秒不多不少的被调用25次。渲染则放任不管，让其飞奔。但是不能让小霸王的低渲染帧率影响到游戏状态更新的速度。下面就是这个方案的实现：</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">const int TICKS_PER_SECOND = 25;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
const int SKIP_TICKS = 1000 / TICKS_PER_SECOND;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
const int MAX_FRAMESKIP = 5;</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">DWORD next_game_tick = GetTickCount();<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
int loops;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
float interpolation;</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">bool game_is_running = true;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
while( game_is_running ) {</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">loops = 0;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
while( GetTickCount() &gt; next_game_tick %26amp;%26amp; loops &lt; MAX_FRAMESKIP) {<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
update_game();</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">next_game_tick += SKIP_TICKS;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
loops++;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
}</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
/ float( SKIP_TICKS );<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
display_game( interpolation );<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />
}</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">使用这种方案的update_game()实现会比较简单，相对而言，display_game()则会变得稍许复杂。你需要实现一个接收插值参数的预言函数，这并不是什么难事，只是需要做一些额外的工作。我会接着解释这个预言函数是如何工作的，不过首先让我告诉你为什么需要这样的一个函数。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">游戏状态每秒被更新25次，如果你渲染的时候不使用插值计算，渲染帧率就会被限定在25帧。需要注意的是，25帧并没有人们想象中的糟糕，电影画面在每秒24帧的情况下依然流畅。所以25帧可以很好的展示游戏画面，不过对于高速移动的物体，更高的帧率会带来更好的效果。所以我们要做的是，在显示帧之间让高速移动的物体平滑过度。这就是我们需要一个插值和预言函数的原因。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">插值和预言函数</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">如我之前所说，游戏状态更新在一个恒定的帧率下运行着，当你渲染画面的时刻，很有可能就在两个逻辑帧之间。假设你已经第10次更新了你的游戏状态，现在你需要渲染你的场景。这次渲染就会出现在第10次和第11次逻辑帧之间。很有可能出现在第10.3帧的位置。那么插值的值就是0.3。举个例子说，我的一辆赛车以下面的方式计算位置。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">position = position + speed;</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">如果第10次逻辑帧后赛车的位置是500，速度是100，那么第11帧的位置就会是600. 那么在10.3帧的时候你会在什么位置渲染你的赛车呢？显而易见，应该像下面这样：</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">view_position = position + (speed * interpolation)</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">现在，赛车将会被正确地渲染在530这个位置。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">基本上，插值的值就是渲染发生在前一帧和后一帧中的位置。你需要做的就是写出预言函数来预计你的赛车/摄像机或者其他物件在渲染时刻的正确位置。你可以根据物件的速度来计算预计的位置。这些并不复杂。对于某些预计后的帧中出现的错误现象，如某个物体被渲染到了某个物体之中的情况的确会出现。由于游戏速度恒定在每秒更新25次状态，那么这种错误停留在画面上的时间极短，难以发现，并无大碍。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">小霸王</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">大多数情况下，update_game()执行需要的时间比display_game()少得多。实际上，我们可以假设在小霸王上update_game()每秒还是能运行25次。所以游戏的逻辑状态不会受到太大的影响，即使FPS非常低。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">牛逼的机器</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">在牛逼的硬件上，游戏速度会保持每秒25次，屏幕更新却可以非常快。插值的方案可以让游戏在高帧率中有更好的画面表现。但实质上游戏的状态每秒只更新了25次。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">结论</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">使游戏状态的更新独立于FPS的解决方案似乎是最好的游戏主循环实现。不过，你必须实现一个插值计算函数。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; "><strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">整体总结</strong></p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">游戏主循环对游戏的影响远远超乎你的想象。我们讨论了4个可能的实现方法，其中有一个方案是要坚决避免的，那就是可变帧率来决定游戏速度的方案。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">一个恒定的帧率对移动设备而言可能是一个很好的实现，如果你想展示你的硬件全部的实力，那么最好使用FPS独立于游戏速度的实现方案。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">如果你不想麻烦的实现一个预言函数，那么可以使用最大帧率的实现方案，只是要找到一个帧率大小的平衡点。</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">现在，你可以着手编写你梦寐以求的游戏了！</p>
<p style="padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: 'courier new'; ">Koen Witters</p>
</div>
</span></div><img src="http://www.cnblogs.com/oiramario/aggbug/1572836.html?type=1" width="1" height="1" alt=""/><p>评论: 4　<a href="http://www.cnblogs.com/oiramario/archive/2009/09/23/1572836.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/oiramario/archive/2009/09/23/1572836.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56831/" target="_blank">谷姐瘫痪 发公开信称已遭黑客攻击5天</a><span style="color:gray">(2010-02-10 13:21)</span><br/>· <a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><span style="color:gray">(2010-02-10 13:08)</span><br/>· <a href="http://news.cnblogs.com/n/56828/" target="_blank">暴雪介绍战网新界面</a><span style="color:gray">(2010-02-10 13:03)</span><br/>· <a href="http://news.cnblogs.com/n/56827/" target="_blank">TLS/SSL协议曝漏洞 影响所有版本Windows</a><span style="color:gray">(2010-02-10 12:56)</span><br/>· <a href="http://news.cnblogs.com/n/56826/" target="_blank">YouTube模式遭嫌弃 Hulu模式成视频行业新宠</a><span style="color:gray">(2010-02-10 12:52)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>春哥硬又黑，不转不行～</title><link>http://www.cnblogs.com/oiramario/archive/2009/08/10/1542710.html</link><dc:creator>千里马肝</dc:creator><author>千里马肝</author><pubDate>Mon, 10 Aug 2009 03:08:00 GMT</pubDate><guid>http://www.cnblogs.com/oiramario/archive/2009/08/10/1542710.html</guid><description><![CDATA[<p>阅读: 992 评论: 0 作者: <a href="http://www.cnblogs.com/oiramario/" target="_blank">千里马肝</a> 发表于 2009-08-10 11:08 <a href="http://www.cnblogs.com/oiramario/archive/2009/08/10/1542710.html" target="_blank">原文链接</a></p><embed src="http://vlog.17173.com/playercs2008.swf?Flvid=492821" width="500" height="395" type="application/x-shockwave-flash"></embed><img src="http://www.cnblogs.com/oiramario/aggbug/1542710.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/oiramario/archive/2009/08/10/1542710.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/oiramario/archive/2009/08/10/1542710.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56831/" target="_blank">谷姐瘫痪 发公开信称已遭黑客攻击5天</a><span style="color:gray">(2010-02-10 13:21)</span><br/>· <a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><span style="color:gray">(2010-02-10 13:08)</span><br/>· <a href="http://news.cnblogs.com/n/56828/" target="_blank">暴雪介绍战网新界面</a><span style="color:gray">(2010-02-10 13:03)</span><br/>· <a href="http://news.cnblogs.com/n/56827/" target="_blank">TLS/SSL协议曝漏洞 影响所有版本Windows</a><span style="color:gray">(2010-02-10 12:56)</span><br/>· <a href="http://news.cnblogs.com/n/56826/" target="_blank">YouTube模式遭嫌弃 Hulu模式成视频行业新宠</a><span style="color:gray">(2010-02-10 12:52)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Color Spaces</title><link>http://www.cnblogs.com/oiramario/archive/2009/08/05/1539414.html</link><dc:creator>千里马肝</dc:creator><author>千里马肝</author><pubDate>Wed, 05 Aug 2009 04:05:00 GMT</pubDate><guid>http://www.cnblogs.com/oiramario/archive/2009/08/05/1539414.html</guid><description><![CDATA[<p>阅读: 319 评论: 0 作者: <a href="http://www.cnblogs.com/oiramario/" target="_blank">千里马肝</a> 发表于 2009-08-05 12:05 <a href="http://www.cnblogs.com/oiramario/archive/2009/08/05/1539414.html" target="_blank">原文链接</a></p><a href="http://www.couleur.org/index.php?page=transformations">http://www.couleur.org/index.php?page=transformations</a><br /><br />
<div class="pagetitle">Color Spaces</div><br />You can find the PDF version of this document <a href="http://www.couleur.org/index.php?page=documentation">here</a>. <br /><br />Color spaces: <a href="http://www.couleur.org/index.php?page=transformations#RGB">RGB</a>, <a href="http://www.couleur.org/index.php?page=transformations#CMY">CMY</a>, <a href="http://www.couleur.org/index.php?page=transformations#XYZ">XYZ</a>, <a href="http://www.couleur.org/index.php?page=transformations#xyY">xyY</a>, <a href="http://www.couleur.org/index.php?page=transformations#I1I2I3">I1I2I3</a>, <a href="http://www.couleur.org/index.php?page=transformations#UVW">UVW</a>, <a href="http://www.couleur.org/index.php?page=transformations#LSLM">LSLM</a>, <a href="http://www.couleur.org/index.php?page=transformations#Lab">L*a*b*</a>, <a href="http://www.couleur.org/index.php?page=transformations#Luv">L*u*v*</a>, <a href="http://www.couleur.org/index.php?page=transformations#LHC">LHC</a>, <a href="http://www.couleur.org/index.php?page=transformations#LHS">LHS</a>, <a href="http://www.couleur.org/index.php?page=transformations#HSV">HSV</a>, <a href="http://www.couleur.org/index.php?page=transformations#HSVPol">HSV Polar</a>, <a href="http://www.couleur.org/index.php?page=transformations#HSI">HSI</a>, <a href="http://www.couleur.org/index.php?page=transformations#HSIPol">HSI Polar</a>, <a href="http://www.couleur.org/index.php?page=transformations#YUV">YUV</a>, <a href="http://www.couleur.org/index.php?page=transformations#YIQ">YIQ</a>, <a href="http://www.couleur.org/index.php?page=transformations#YCbCr">YCbCr</a> <br /><br />
<center>(If you are interested in multispectral imaging go to <a href="http://www.couleur.org/index.php?page=gpuviewer">GPU Spectral Viewer</a>)</center>
<center><a href="http://www.couleur.org/index.php?page=gpuviewer"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="Joconde Ori" src="http://colantoni.nerim.net/images-joconde/joc-final-small.jpg"  \ /></a> &nbsp; <a href="http://www.couleur.org/index.php?page=gpuviewer"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="Joc\&#10;onde Rest" src="http://colantoni.nerim.net/images-joconde/joc-rest-final-small.jpg" /> </a></center><br /><!-- RGB --><a name="RGB"></a>
<div class="title">.: RGB color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="RGB" src="http://www.couleur.org/spaces/RGBspace.jpg" /> </center></div><!-- CMY --><a name="CMY"></a>
<div class="title">.: CMY color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="CMY" src="http://www.couleur.org/spaces/CMYspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="CMY" src="http://www.couleur.org/equations/cmy.gif" /> </center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- XYZ --><a name="XYZ"></a>
<div class="title">.: XYZ (CIEXYZ) color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="XYZ (CIEXYZ)" src="http://www.couleur.org/spaces/XYZspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="XYZ" src="http://www.couleur.org/equations/xyz.gif" /> </center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- xyY --><a name="xyY"></a>
<div class="title">.: xyY color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="xyY" src="http://www.couleur.org/spaces/xyYspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="xyY" src="http://www.couleur.org/equations/xyy.gif" /> </center>
<center><ins style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; border-left: medium none; width: 728px; padding-top: 0px; border-bottom: medium none; position: relative; height: 90px"><ins style="border-right: medium none; padding-right: 0px; border-top: medium none; display: block; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; border-left: medium none; width: 728px; padding-top: 0px; border-bottom: medium none; position: relative; height: 90px"></ins></ins></center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- Lab --><a name="Lab"></a>
<div class="title">.: L*a*b* (CIELAB) color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="L*a*b* (CIELAB)" src="http://www.couleur.org/spaces/Labspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="L*a*b*" src="http://www.couleur.org/equations/lab.gif" /> </center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- Luv --><a name="Luv"></a>
<div class="title">.: L*u*v* (CIELUV) color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="L*u*v* (CIELUV)" src="http://www.couleur.org/spaces/Luvspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="L*u*v*" src="http://www.couleur.org/equations/luv.gif" /> </center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- YUV --><a name="YUV"></a>
<div class="title">.: YUV color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="YUV" src="http://www.couleur.org/spaces/YUVspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="YUV" src="http://www.couleur.org/equations/yuv.gif" /> </center>
<center><ins style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; border-left: medium none; width: 728px; padding-top: 0px; border-bottom: medium none; position: relative; height: 90px"><ins style="border-right: medium none; padding-right: 0px; border-top: medium none; display: block; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; border-left: medium none; width: 728px; padding-top: 0px; border-bottom: medium none; position: relative; height: 90px"></ins></ins></center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- YIQ --><a name="YIQ"></a>
<div class="title">.: YIQ color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="YIQ" src="http://www.couleur.org/spaces/YIQspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="YIQ" src="http://www.couleur.org/equations/yiq.gif" /> </center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- YCbCr --><a name="YCbCr"></a>
<div class="title">.: YCbCr color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="YCbCr" src="http://www.couleur.org/spaces/YCbCrspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="YCbCr" src="http://www.couleur.org/equations/ycbcr.gif" /> </center>
<center><ins style="border-right: medium none; padding-right: 0px; border-top: medium none; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; border-left: medium none; width: 728px; padding-top: 0px; border-bottom: medium none; position: relative; height: 90px"><ins style="border-right: medium none; padding-right: 0px; border-top: medium none; display: block; padding-left: 0px; visibility: visible; padding-bottom: 0px; margin: 0px; border-left: medium none; width: 728px; padding-top: 0px; border-bottom: medium none; position: relative; height: 90px"></ins></ins></center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- I1I2I3 --><a name="I1I2I3"></a>
<div class="title">.: I1I2I3 color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="I1I2I3" src="http://www.couleur.org/spaces/I1I2I3space.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="I1I2I3" src="http://www.couleur.org/equations/i1i2i3.gif" /> </center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- LSLM --><a name="LSLM"></a>
<div class="title">.: LSLM color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="LSLM" src="http://www.couleur.org/spaces/LSLMspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="LSLM" src="http://www.couleur.org/equations/lslm.gif" /> </center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- UVW --><a name="UVW"></a>
<div class="title">.: UVW color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="UVW" src="http://www.couleur.org/spaces/UVWspace.jpg" /> </center></div><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- HSI --><a name="HSI"></a>
<div class="title">.: HSI color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="HSI" src="http://www.couleur.org/spaces/HSIspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="HSI" src="http://www.couleur.org/equations/hsi.gif" /> </center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- HSI Polar --><a name="HSIPol"></a>
<div class="title">.: HSI Polar color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="HSI Polar" src="http://www.couleur.org/spaces/HSIPolspace.jpg" /> </center></div><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- HSV --><a name="HSV"></a>
<div class="title">.: HSV color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="HSV" src="http://www.couleur.org/spaces/HSVspace.jpg" /> </center></div><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- HSV Polar --><a name="HSVPol"></a>
<div class="title">.: HSV Polar color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="HSV Polar" src="http://www.couleur.org/spaces/HSVPolspace.jpg" /> </center></div><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- LHC --><a name="LHC"></a>
<div class="title">.: LHC color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="LHC" src="http://www.couleur.org/spaces/LHCspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="LHC" src="http://www.couleur.org/equations/lhc.gif" /> </center>
<center><br />LHC transformation used in ColorSpace <br /></center><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="LHC" src="http://www.couleur.org/equations/lhc2.gif" /> </center><br />
<center><a href="http://www.couleur.org/index.php?page=transformations#hautdepage">Top</a></center><br /><br /><!-- LHS --><a name="LHS"></a>
<div class="title">.: LHS color space :. </div><br />
<div class="frameImage">
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="LHS" src="http://www.couleur.org/spaces/LHSspace.jpg" /> </center></div><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="LHS" src="http://www.couleur.org/equations/lhs.gif" /> </center>
<center><br />LHS transformation used in ColorSpace <br /></center><br />
<center><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" alt="LHS" src="http://www.couleur.org/equations/lhs2.gif" /> </center><img src="http://www.cnblogs.com/oiramario/aggbug/1539414.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/oiramario/archive/2009/08/05/1539414.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/oiramario/archive/2009/08/05/1539414.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56831/" target="_blank">谷姐瘫痪 发公开信称已遭黑客攻击5天</a><span style="color:gray">(2010-02-10 13:21)</span><br/>· <a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><span style="color:gray">(2010-02-10 13:08)</span><br/>· <a href="http://news.cnblogs.com/n/56828/" target="_blank">暴雪介绍战网新界面</a><span style="color:gray">(2010-02-10 13:03)</span><br/>· <a href="http://news.cnblogs.com/n/56827/" target="_blank">TLS/SSL协议曝漏洞 影响所有版本Windows</a><span style="color:gray">(2010-02-10 12:56)</span><br/>· <a href="http://news.cnblogs.com/n/56826/" target="_blank">YouTube模式遭嫌弃 Hulu模式成视频行业新宠</a><span style="color:gray">(2010-02-10 12:52)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56812/" target="_blank">Google社会化产品Buzz发布会实录</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>