??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一本综合久久,久久九九久精品国产,91精品国产9l久久久久http://www.shnenglu.com/mybios/游戏开?C++ Cocos2d-x OpenGL DirectX 数学 计算机图形学 SQL Server <BR> <BR>zh-cnTue, 06 May 2025 23:37:35 GMTTue, 06 May 2025 23:37:35 GMT60cocos2d-x脚本引擎QJavaScript、Lua{等Q的大统一Q方案概qͼhttp://www.shnenglu.com/mybios/archive/2015/11/20/212299.html李锦?mybios)李锦?mybios)Fri, 20 Nov 2015 07:03:00 GMThttp://www.shnenglu.com/mybios/archive/2015/11/20/212299.htmlhttp://www.shnenglu.com/mybios/comments/212299.htmlhttp://www.shnenglu.com/mybios/archive/2015/11/20/212299.html#Feedback2http://www.shnenglu.com/mybios/comments/commentRss/212299.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/212299.html    cocos2d-x支持多种脚本引擎的绑定,例如支持luaQ通过lua或luajitQ、javascriptQ通过SpiderMonkey脚本引擎Q,分别对应libluacocos2d和libjscocos2d两个工程Q每个工E里分别对应大量的自动绑定和手动l定代码。如果需要增加一些引擎功能需要绑定到脚本的话Q两个工E都需要修改代码,非常不便于维护。假如希望用其他脚本引擎的话(例如googleU红火火的V8Q或者ms的chakraQ,那得多开几个工程Q每个工E都需要实现几乎一P但是又不一L代码。现在我提出一U思想Q来解决q类问题?/span>
    现有的脚本引擎多如牛毛,而不同企业间可能有不同的技术积累,希望选择不一L脚本引擎Q有的python蟒蛇z,有的是luaz,有的是rubyz,q有JavaScript、lua{等{等Q所以,JavaScript和Lua不应该成Z选一?/div>
而这些脚本引擎之_有很多的共同点,例如都是q型语aQ都是支持那么几U简单类型,都是使用GC机制来回收等{?/div>
脚本引擎l一化,是把多个脚本引擎Qlua、JavaScriptCore、chakra、v8、spidermonkey{等Q通过同一套抽象接口进行封装,引擎的脚本绑定代码都通过抽象接口来编写。通过选择~译不同的实现层来实现脚本引擎间的切换,而不是每个脚本引擎都要写不一L脚本l定代码Q这栯大大化脚本绑定层的维护成本,q能保证所有脚本引擎的接口的绝对一致性,q让用户L选择使用哪个脚本引擎Q而不限定于必M用官斚w择的引擎?/div>
    脚本引擎抽象层API的定义非常关键,概括h我认Z必须W合以下要求Q?/div>
1?span style="background-color: inherit; line-height: 1.5;">抽象层的接口必须在各个脚本引擎之间都可以实现Q例如:“创徏字符?#8221;q个接口Q是L脚本引擎都能实现?/span>
2?/span>抽象层在l定脚本的过E中是够用的,例如Q我们需要导Z个C++的类Q还需要导出类里的函数Q还有特D的l构体,甚至包含lambda表达式,q些都需要考虑q去抽象层定义的需求里?/span>
3、抽象层q必够的薄,薄到q行时根本感觉不C的存在。需要?#8220;?#8221;或者inline函数的方式来l这个抽象层减肥Q坚决不使用C++cȝ方式来加厚他?/span>
4、抽象层在用的q程中必够简单,单到好像是一个单独的脚本引擎API一Pq些API看上L大统一的,q且是脚本语a无关的?/span>
    在定义抽象层的过E中Q我参考了很多别h的方案,最l,我?nbsp;了这么个Ҏ(gu)Q?/div>
1、用C inline函数来定义API接口函数的声明,各个引擎的实现部分分别实现这些函?/div>
2、定义一些基本类型,基本cd有各个脚本引擎来最l定义,但名字和意义都是l一的,初步定义了这些类型,每个cd在不同脚本引擎中对应的类型分别如下表Q?/div>
l一cd
描述
Lua
JavaScript
JavaScriptCore
V8
chakra
USValue
表示脚本中的Lcd
Lcd

Object
JSValueRef
v8::Local<v8::Value>
JsValueRef
USObject
脚本对象Q对象可以由key、valuel成Q可以拥有承结?/div>
table
Object
JSObjectRef
v8::Local<v8::Object>
JsValueRef
USFunction
脚本函数
function
Function
JSObjectRef
v8::Local<v8::Function>
JsValueRef
USArray
数组cdQ下标从0开?/div>
table
Array
JSObjectRef
v8::Local<v8::Array>
JsValueRef
USMap
?值配对的mapcd
table
Map
JSObjectRef
v8::Local<v8::Object>
JsValueRef
USSet
g为键也作为值得列表Qg能重?/div>
table
Set
JSObjectRef
v8::Local<v8::Object>
JsValueRef
USNumber
数值类?/div>
number
Number
JSValueRef
v8::Local<v8::Number>
JsValueRef
USBoolean
boolcd
boolean
Boolean
JSValueRef
v8::Local<v8::Boolean>
JsValueRef
USString
字符串类?/div>
string
String
JSValueRef
v8::Local<v8::String>
JsValueRef
USBuffer
内存块缓存对?/div>
string
Int8Array
JSValueRef
v8::Local<v8::Int8Array>
JsValueRef
USConstructor
对象实例的构造器Q用来导出C++c?/div>
table
Object
JSValueRef
v8::Local<v8::Object>
JsValueRef
3、定义一批APIQ用以对以上定义的基本类型进行创建、调用、修改等操作Q例如创建的q程API定义成这UŞ式:

 1  // 创徏Null?/span>
 2     inline USValue createUSNull();
 3  // 创徏Undefined?/span>
 4     inline USValue createUSUndefined();
 5  // 创徏普通的对象
 6     inline USObject createUSObject();
 7  // 创徏数组
 8     inline USArray createUSArray(int length = 0);
 9  // 创徏Map
10     inline USMap createUSMap();
11  // 创徏Set
12     inline USSet createUSSet();
13  // 创徏字符?/span>
14     inline USString createUSString(const char *str, int length = -1);
15  // 创徏BufferQ将会拷贝数据到Buffer中,脚本引擎负责销?/span>
16     inline USBuffer createUSBuffer(const char *buffer, size_t size);
17  // 创徏一个脚本函敎ͼ函数调用时会回调到callbackQƈ带上data
18     USFunction createUSFunction(USFunctionCallback callback, void *data = nullptr, const char *name = nullptr);
19  // 创徏数字
20     inline USNumber createUSNumber(double number);
21  // 创徏bool
22     inline USBoolean createUSBoolean(bool value);
23 
24  // 创徏对象构造器
25     USConstructor USClassCreateConstructor(const USClass &cls);
 
抽象层定义好后,需要经q大量的努力Q才能在各个脚本引擎间的最l实现。当最l实现完毕后Q就可以下一步工作:
1、把cocos2d-x对于自动l定代码的templatec进行修改,修改成用统一脚本引擎的API
2、把cocos2d-x对于手动l定的代码如法炮?/div>
3、用不同的引擎实现来编?/div>
l过q样如法炮制之后Q最lcocos2d-x只剩下一套脚本绑定的工程Q而通过选择不同的底层脚本引擎,却可以编译出完全不一L脚本引擎版本?/div>
l过cocos2d-x githubC֌的努力,最l应该会出现不同的forkQ如python、ruby{等各种语言出现各种l定版本Q而这U绑定版本的出现Q只需实现抽象层API的基本API卛_?/div>
xcocos2d-x的脚本引擎统一卛_完成大业?/div>
但,事情q没完,我在下一中Q将会讲到抽象API的详l定义,敬请期待下一?br />

如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p>

不如打赏我一杯咖啡,鼓励我l分享优U的文章?br />






李锦?mybios) 2015-11-20 15:03 发表评论
]]>tolua++导出C++cȝ一些问题和解决Ҏ(gu)http://www.shnenglu.com/mybios/archive/2010/02/09/107616.html李锦?mybios)李锦?mybios)Tue, 09 Feb 2010 11:43:00 GMThttp://www.shnenglu.com/mybios/archive/2010/02/09/107616.htmlhttp://www.shnenglu.com/mybios/comments/107616.htmlhttp://www.shnenglu.com/mybios/archive/2010/02/09/107616.html#Feedback7http://www.shnenglu.com/mybios/comments/commentRss/107616.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/107616.html阅读全文

李锦?mybios) 2010-02-09 19:43 发表评论
]]>
使用FreeType实现矢量字体的粗体、斜体、描辏V阴影效?/title><link>http://www.shnenglu.com/mybios/archive/2009/08/01/91869.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sat, 01 Aug 2009 02:42:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2009/08/01/91869.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/91869.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2009/08/01/91869.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/91869.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/91869.html</trackback:ping><description><![CDATA[     摘要: 使用FreeType实现矢量字体的粗体、斜体、描辏V阴影效?  前言Q?Freetype是一个跨q_、开源的字体渲染器,|上很多文章介绍Q本人就不啰嗦了。本文重点在于实现文章标题所属的各种效果Q不是Freetype的基本用方法介l文档,所以对于Freetype不熟(zhn)的同学们请先学习下Freetype的基本用法,才可以用本文中所提及的方法?正文Q?用FreeType实现?..  <a href='http://www.shnenglu.com/mybios/archive/2009/08/01/91869.html'>阅读全文</a><img src ="http://www.shnenglu.com/mybios/aggbug/91869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2009-08-01 10:42 <a href="http://www.shnenglu.com/mybios/archive/2009/08/01/91869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于天龙八部frame文g格式http://www.shnenglu.com/mybios/archive/2009/07/26/91270.html李锦?mybios)李锦?mybios)Sun, 26 Jul 2009 12:41:00 GMThttp://www.shnenglu.com/mybios/archive/2009/07/26/91270.htmlhttp://www.shnenglu.com/mybios/comments/91270.htmlhttp://www.shnenglu.com/mybios/archive/2009/07/26/91270.html#Feedback2http://www.shnenglu.com/mybios/comments/commentRss/91270.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/91270.htmlq来人都说技术只是一层纸Q一捅就破。想当天׃很多旉ȝIframe文g的二q制格式I竟是怎么来的Q但始终未果。到头来发现竟然只是一个普通的.skeleton文gQ脑后不冒出好几条黑色竖条?br />现我把这层纸捅破了,望过来h不用再辛辛苦苦研Iframe文g格式走弯路了?br />

如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p>

不如打赏我一杯咖啡,鼓励我l分享优U的文章?br />





李锦?mybios) 2009-07-26 20:41 发表评论
]]>
发布一个前D|间写的天龙八部GridInfod源码http://www.shnenglu.com/mybios/archive/2009/07/26/91267.html李锦?mybios)李锦?mybios)Sun, 26 Jul 2009 12:36:00 GMThttp://www.shnenglu.com/mybios/archive/2009/07/26/91267.htmlhttp://www.shnenglu.com/mybios/comments/91267.htmlhttp://www.shnenglu.com/mybios/archive/2009/07/26/91267.html#Feedback5http://www.shnenglu.com/mybios/comments/commentRss/91267.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/91267.html阅读全文

李锦?mybios) 2009-07-26 20:36 发表评论
]]>
Unreal3游戏引擎UObject源码阅读分析http://www.shnenglu.com/mybios/archive/2009/07/26/91196.html李锦?mybios)李锦?mybios)Sun, 26 Jul 2009 01:50:00 GMThttp://www.shnenglu.com/mybios/archive/2009/07/26/91196.htmlhttp://www.shnenglu.com/mybios/comments/91196.htmlhttp://www.shnenglu.com/mybios/archive/2009/07/26/91196.html#Feedback8http://www.shnenglu.com/mybios/comments/commentRss/91196.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/91196.htmlUnreal3Q以下简UU3Q是一个以脚本Z体的游戏引擎Q所有代码几乎都本服务,意味着所有源码都会提供相应的脚本函数在脚本中使用?br />UObject是U3中很重要的一个基c,所有由UObjectz的类都可以导出到脚本中(不从UObjectz行不行?不知道呢Q,但我对U3的脚本不熟。暂且从C++角度来分析下UObject是如何实现的?br />UObject֐思义是一?#8220;基本对象”Q材质、mesh、文件、玩家等{都是从q个UObjectl承而来Q这个类做了很多事情Q?/p>

1、属性的l一讉K接口Q脚本中可以通过q个接口来访问属性了Q?br />2、成员函数的l一讉K接口Q脚本中可以通过q些接口来调用UObject或其zcȝ成员函数Q?br />3、串行化的统一接口Q实C一个保存所有对象的UPackage包管理器Q从而做C存到二进制文件、从二进制文件读取,q样做的好处是持久化对象Q比如游戏中的材质列表)的蝲入非常快速,׃是二q制格式Q不需要Q何字W串数据转换Q?br />4、提供对象的垃圾回收功能Q?br />5、提供编辑器的相应功能,如:对象?#8220;属?#8221;有各U编辑器所需的标讎ͼ是否可编辑CPF_Edit{)、对象在~辑器中的渲染DrawThumbnail、对象描qGetThumbnailDesc、对象选择IsSelected、是否更改了包MarkPackageDirty{等Q?br />6、提供一个对象的理器,q个对象理器是通过UObject中的一堆静态函数来实现的,如:从管理器中查找一个对象StaticFindObject、分配一个对象StaticAllocateObject、从包中载入一个对象StaticLoadObject、根据类型来遍历理器中的所有对象FObjectIterator/TObjectIterator、遍历所有选择了的对象TSelectedObjectIteratorQ编辑器使用Q?br />7、提供配|管理器Q通过UObject中的LoadConfig、SaveConfig实现
8、提供类描述信息Q描qCq个cM哪个cL生、有什么属性、每个属性的讉K方式、有什么函敎ͼ从而实C动态类型判断、脚本属性访问、脚本函数访问、属性串行化{等
9、其他。。。?/p>

单分析下UObject中的各个成员变量的意义:
IndexQ用来记录这个UObject在所有UObject列表GObjObjects中的唯一索引
HashNextQ用来记录全局UObject Hash表GObjHash中跟q个UObject 的Hash值相同的下一个UObject的指针,用来配合全局Hash表GObjHash通过StaticFindObject函数快速搜索一个指定名U的UObject
StateFrameQ脚本相关的咚咚Q还没看
_LinkerQ通过在包文g中蝲入时的蝲入器
_LinkerIndexQ通过包文件蝲入时的UPackage包对象在GObjObjects中的唯一索引Q相当于Outer->Index
OuterQ这个对象所属的?br />ObjectFlagsQ这个对象的一些标讎ͼ具体参见EObjectFlags枚DQ不同标记来军_q个对象的一些行为,比如是否可以保存、是否可见等{?br />NameQ对象名Uͼ通过一个FName来实玎ͼq个FName可是个好东西哦,字符串比较变成了一个Hash值比?br />ClassQ用来描q这个类Q就是以上第1??点说到的。这个Class在调用UObject::StaticClass或派生类的StaticClass静态函数时会一ơ性初始化Q意味着即创徏多少个UObjectQ但Class只会有一个实例,我们通过q个c,可以使用TFieldIterator的统一方式来遍历这个类的所有属性、函数?/p>

UObject的静态变量,q些静态变量其实就是UObject对象理器用的变量Q如果用Ogre的设计方法来做,q当于另外一个class UObjectManager : public Singleton<UObjectManager>Q然后在里面把这些静态变量拿到UObjectManager中去。简要分析下静态变量的意义Q?br />GObjInitializedQ对象管理器是否已经初始化,全局对象理器只需要初始化一ơ就够了Q?br />GObjNoRegisterQ调用StaticInit时会讄?Q?br />GObjBeginLoadCountQ有多少个对象被BeginLoad了;
GObjRegisterCountQProcessRegistrants中?br />GImportCountQ还没细看哦
GObjHashQ通过每个UObject的Name的Hash值取?2位作为烦引g存在GObjHash表中QHash值的?2位相同的Q只记录W一个在GObjHash表中Q其他的通过链表方式使用UObject的HashNext来链接v?br />GAutoRegisterQ自动注册的对象列表
GObjRootQ对象树U的层对象
GObjObjectsQ所有对象的列表

先说q么多了Ql学习?/p>

如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p>

不如打赏我一杯咖啡,鼓励我l分享优U的文章?br />





李锦?mybios) 2009-07-26 09:50 发表评论
]]>
在VS2005调试器中昄Unreal3的数?/title><link>http://www.shnenglu.com/mybios/archive/2009/05/24/85618.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sun, 24 May 2009 09:13:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2009/05/24/85618.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/85618.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2009/05/24/85618.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/85618.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/85618.html</trackback:ping><description><![CDATA[Unreal3引擎中,大量使用了自定义的模版或数据cdQ比如TArray、FName、FString{等Q对于这三种数据cdQ我们无法在VS2005中直接查看他们的|L不能像std::vector/std::string一L观查看)?br>通过msdnQ得知vs2005的autoexp.dat可以可以l自定义的数据类型编写可视化脚本从而实现直观的调试?br>l过一番研IӞ实现了对Unreal3数据cd的直观的可视化调试,Ҏ(gu)如下Q?br><br>打开vs2005目录中的autoexp.dat文g<br><br>扑ֈ[AutoExpand]Q在[AutoExpand]的下面添加一?<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">FNameEntry</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><Name</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">su></span></div> <br><br>d文g最后,d以下代码到文件的最后:<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000"><br></span><span style="COLOR: #008000">;</span><span style="COLOR: #008000"> Unreal格式的数l?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">TArray<*>{<br>    children<br>    (<br>        #array<br>        (<br>            expr :    (($T1*)($c.Data))</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">$i</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">  <br>            size :    $c.ArrayNum<br>        )<br>    )<br>    <br>    preview<br>    ( <br>        #( <br>            </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> <br>            $c.ArrayNum </span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"><br>            </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">](</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> <br>            <br>            #array<br>            (<br>                expr : (($T1*)($c.Data))</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">$i</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">  <br>                size :     $c.ArrayNum<br>            )</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> <br>            </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>        )<br>    )<br>}<br><br></span><span style="COLOR: #008000">;</span><span style="COLOR: #008000"> Unreal格式的FName</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">FName{<br>    preview(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">((FNameEntry**)FName.Names.Data)[$c.Index</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">])<br>        stringview(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">((FNameEntry**)FName.Names.Data)[$c.Index</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">])<br>}<br></span><span style="COLOR: #008000">;</span><span style="COLOR: #008000"> Unreal格式的字W串</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">FString{<br>    preview(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">$c.Data,su</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">)<br>        stringview(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">[</span><span style="COLOR: #800000">$c.Data,su</span><span style="FONT-WEIGHT: bold; COLOR: #800000">]</span><span style="COLOR: #000000">)<br>}</span></div> <br>然后Q到调试器里情看TArray、FString、FName{等qx不容易看的数据吧。效果图׃贴了?br>此方法可以D一反三Q用来实现对L数据cd的查看?br><br><br> <img src ="http://www.shnenglu.com/mybios/aggbug/85618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2009-05-24 17:13 <a href="http://www.shnenglu.com/mybios/archive/2009/05/24/85618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Y件调试》读书随W箋http://www.shnenglu.com/mybios/archive/2008/12/21/70006.html李锦?mybios)李锦?mybios)Sun, 21 Dec 2008 09:58:00 GMThttp://www.shnenglu.com/mybios/archive/2008/12/21/70006.htmlhttp://www.shnenglu.com/mybios/comments/70006.htmlhttp://www.shnenglu.com/mybios/archive/2008/12/21/70006.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/70006.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/70006.html810?利用DBGHELP函数回溯栈,可以可编E的记录当时的调用栈详细信息
814?利用RTL函数回溯栈,非常快速的回溯栈,但只记录函数指针Q不记录函数名和函数参数Q后期如果要看函数名Q需要通过PDB文g和UMDHq样的工h译成函数名。但是对于大量的调用速度会很快?br>815?讲述q实C一个用来检视某地址被访问的记录Q能记录下这个地址被访问的旉、调用堆栈等{信息?br>824?介绍了用Windows性能监视器来~写性能监视功能的方法(如监视游戏FPS变化Q?br>830?介绍?Gh/GH~译开关的作用Q监视所有函数的q出

李锦?mybios) 2008-12-21 17:58 发表评论
]]>
《Y件调试》读书随W?/title><link>http://www.shnenglu.com/mybios/archive/2008/12/20/69933.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sat, 20 Dec 2008 13:51:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2008/12/20/69933.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/69933.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2008/12/20/69933.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/69933.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/69933.html</trackback:ping><description><![CDATA[<p>几个非常有用的技术:<br>421?ETW 架构Q比较适合用来记录大量日志<br>699?_heapchk()函数可以手工查堆内容是否有缓存溢?br>661?低碎片堆Q内核别的内存分配器<br>666?栈回溯数据库Q用来记录所有分配内存时的调用栈信息?/p> <img src ="http://www.shnenglu.com/mybios/aggbug/69933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2008-12-20 21:51 <a href="http://www.shnenglu.com/mybios/archive/2008/12/20/69933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍本近期出的好书《Y件调试?/title><link>http://www.shnenglu.com/mybios/archive/2008/12/13/69371.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sat, 13 Dec 2008 14:18:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2008/12/13/69371.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/69371.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2008/12/13/69371.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/69371.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/69371.html</trackback:ping><description><![CDATA[《Y件调试》,?008q?月䆾出的CQ我觉得比较适合用C++用了比较长时间的人看Q这可以提高他们的调试水q뀂其实,评h(hun)一个h是否是编E高手,主要q是看当E序出问题时调试能力?br>q本书在当当|上打折后是96元?br>以下是这本书的一些介l:<br>ACM院士和调试技术先驱Jack B.Dennis教授做历史回计机和操作系l领域资׃家David A.Solomon撰写序言。调试高手笔耕三载集十余q经验成百万a,业内专家鼎力相助Q汇五十q精华补软g界空白?br>  (zhn)将学习刎ͼ<br>  CPU的调试支持,包括异常、断炏V单步执行、分支监视、JTAG、MCE{?br>  Windows操作pȝ中的调试设施Q包括内核调试引擎、用h调试予pȝ、验证器、Dr.Watson、WER、ETW、故障{储、WHEA{?br>  Visual CQC++~译器的调试支持Q包括编译期查、运行期查,以及调试W号?br>  WinDBG调试器的发展历史、模块结构、工作模型、用方法、主要调试功能的实现l节Q以及遍布全书的应用实例?br>  内核调试、用h调试、JIT调试、远E调试的原理、实现和用法。异常的概念、分发方法、处理方法(SEH、VEH、CppEHQ,未处理异常,以及~译器编译异常处理代码的Ҏ(gu)?br>  调试W号的作用、生过E、存储格式和使用Ҏ(gu)。栈和堆的结构布局、工作原理和有关的Y仉题,包括栈的自动增长和溢出,~;中区溢出Q溢出攻击,内存泄漏Q堆崩溃{?br>  软g的可调试性和提高可调试性的Ҏ(gu)?br>  此外Q书中还诠释了很多较隄解的概念Q思考了一pd耐h深思和h普遍意义的问题。本书是对Y件调试技术在q去50q中所取得成就的全面展C,也是W者本人在软g设计和系l开发第一U奋?0多年的经验ȝ。本书适合每一位希望深ȝ解Y件和自由N软g的h阅读Q不论?zhn)是否直接参与软g开发和试Q不论?zhn)是热pYӞq是憎恨软gQ不论?zhn)是想发现软g中的瑕疵Q还是想领略其中蕴含的智慧!<br>  本书直面软g工程中的最困难d——侦?br>  围绕软g世界中的最强大工具——调试器<br>  全方位展CZ软g调试技术的无比威力和无I魅?br>  80个示例程序的源程序文件和目文g<br>  览W号文g的SymView工具<br>  与内核调试引擎对话的KdTalker工具<br>  直接览用户态{储文件的UdmpView工具<br>  昄CPU执行轨迹Q分支)的Cpuwhere工具<br>  观察IDT、GDT和系l对象的SOZOOmer工具<br>  本书是对软g调试技术在q去50q中所取得成就的全面展C,也是对作者本人在软g设计和系l开发第一U奋?0多年的经验ȝ。全书共??0章,选取了大量具有代表性和普遍意义的技术细节进行讨论,包括CPU的调试支持、操作系l的调试支持、编译器的调试支持、WinDBG及其实现{,是学习Y件调试技术的宝贵资料。该书可供各大专院校作ؓ教材使用Q也可供从事相关工作的h员作为参考用书用? <img src ="http://www.shnenglu.com/mybios/aggbug/69371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2008-12-13 22:18 <a href="http://www.shnenglu.com/mybios/archive/2008/12/13/69371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>兽争霸3自动拼接地Ş渲染源码与执行程序下?/title><link>http://www.shnenglu.com/mybios/archive/2008/10/31/65636.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Fri, 31 Oct 2008 11:51:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2008/10/31/65636.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/65636.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2008/10/31/65636.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/65636.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/65636.html</trackback:ping><description><![CDATA[q里发的源码是针对上ơ的文章的源码http://www.shnenglu.com/mybios/archive/2008/10/26/65076.html<br /><a href="http://www.shnenglu.com/Files/mybios/源码与执行程?part01.rar">http://www.shnenglu.com/Files/mybios/源码与执行程?part01.rar</a><br /><a href="http://www.shnenglu.com/Files/mybios/源码与执行程?part02.rar">http://www.shnenglu.com/Files/mybios/源码与执行程?part02.rar</a><br /><a href="http://www.shnenglu.com/Files/mybios/源码与执行程?part03.rar">http://www.shnenglu.com/Files/mybios/源码与执行程?part03.rar</a><br /><a href="http://www.shnenglu.com/Files/mybios/源码与执行程?part04.rar">http://www.shnenglu.com/Files/mybios/源码与执行程?part04.rar</a><br /><a href="http://www.shnenglu.com/Files/mybios/源码与执行程?part05.rar">http://www.shnenglu.com/Files/mybios/源码与执行程?part05.rar</a><br /><br />发现有的行不了程序,是由于没安装vc2008的redistD的。请下蝲安装之:<br /><a >http://www.microsoft.com/downloads/details.aspx?FamilyID=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=zh-cn</a><br /><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">不如打赏我一杯咖啡,鼓励我l分享优U的文章?br /><img src="http://www.shnenglu.com/images/cppblog_com/mybios/222.jpg" border="0" alt="" /><br /><br /><br /><br /></p><img src ="http://www.shnenglu.com/mybios/aggbug/65636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2008-10-31 19:51 <a href="http://www.shnenglu.com/mybios/archive/2008/10/31/65636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>兽争霸3的自动拼接地形渲染方?/title><link>http://www.shnenglu.com/mybios/archive/2008/10/26/65076.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sun, 26 Oct 2008 04:16:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2008/10/26/65076.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/65076.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2008/10/26/65076.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/65076.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/65076.html</trackback:ping><description><![CDATA[<p align="left">源码已发布,h开下蝲<a href="http://www.shnenglu.com/mybios/archive/2008/10/31/65636.html">http://www.shnenglu.com/mybios/archive/2008/10/31/65636.html</a><br />上次发了个这L图,l果被某些h鄙视了,很郁闷啊?br /><br />我们把一个魔?的草地脓(chung)图提取出来,q且用下面的分块Ҏ(gu)来标C每一块小贴图Q然后通过一U特定的方式来组l这些小贴图QŞ成真正的地表贴图?br />兽争霸~辑器中刷地表时Q刷一格就会媄响四个周围的渲染块,具体如何影响Q请看下图:<br /><br />q是贴图的分块烦引方法:<br /><img height="256" alt="" src="http://www.shnenglu.com/images/cppblog_com/mybios/Lords_Grass.tga.jpg" width="512" border="0" /><br /><br /><br /><br />通过兽争霸地图~辑器点一下刷地表草之后,在地图中׃出现一块l色草地地表Q请注意在图中我用数????来表C四个渲染块对应的脓(chung)囄引,而这????是固定的。代表的是相对于W刷位置Q笔刷位|是指周围四个渲染块中间位置Q来_左下角的角落贴图索引?Q右下角的角落脓(chung)囄引是2Q左上角的角落脓(chung)囄引是4Q右上角的角落脓(chung)囄引是8。如下图所C:<br /><img height="465" alt="" src="http://www.shnenglu.com/images/cppblog_com/mybios/1.jpg" width="651" border="0" /><br /><br /><br />如果在已l有草地的地表旁边再点一下刷地表Q会h如下图这个样子:<br />看明?+4=12没有Q这里是两个角落贴图索引相加后的l果Q得?2Q就从文章开头的索引贴图中找?2对应的小贴图贴上厅R?br />2+1=3同理Q用两个角落贴图索引相加后的l果3从烦引脓(chung)图中扑ֈ3对应的小贴图贴上厅R?br />q样得到的效果就会变成如下图Q?br /><img height="531" alt="" src="http://www.shnenglu.com/images/cppblog_com/mybios/2.jpg" width="923" border="0" /><br /><br /><br />q里有是更复杂的情况Q有三个角落相加Q?+8+4=13Q不q道理都是一L?br /><img height="768" alt="" src="http://www.shnenglu.com/images/cppblog_com/mybios/3.jpg" width="1034" border="0" /><br /><br />最后说一下四周都有脓(chung)囄情况Q看C间笔刷位|没有?W刷左上Ҏ(gu)一个脓(chung)图,对应的是贴图索引中的0Q这是因Z四个角都填充了,所以就需要从0?6~31中随机选择一个小贴图贴上M完整的填充整个渲染块Q?br /><img height="768" alt="" src="http://www.shnenglu.com/images/cppblog_com/mybios/4.JPG" width="899" border="0" /><br /><br />x贴图选择的方法已l说完了?br />至于渲染的方法,都是大同异Q这里就不多说了?/p><br /><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">不如打赏我一杯咖啡,鼓励我l分享优U的文章?br /><img src="http://www.shnenglu.com/images/cppblog_com/mybios/222.jpg" border="0" alt="" /><br /><br /><br /><br /></p><img src ="http://www.shnenglu.com/mybios/aggbug/65076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2008-10-26 12:16 <a href="http://www.shnenglu.com/mybios/archive/2008/10/26/65076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>刚完成了一个基于Ogre渲染的世界编辑器Q发囄?/title><link>http://www.shnenglu.com/mybios/archive/2008/03/09/44046.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sun, 09 Mar 2008 14:55:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2008/03/09/44046.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/44046.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2008/03/09/44046.html#Feedback</comments><slash:comments>29</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/44046.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/44046.html</trackback:ping><description><![CDATA[<p>q个世界~辑器,从一开始设计的时候就考虑使用卌x得的形式来实玎ͼ地图载入、保存等{操作是独立装在一个叫DisplaySystem的Dll中,而世界编辑器使用插g的Ş式来实现各种功能Q如Q地形编辑插件、网格插件、物件编辑插件、环境编辑插件等{。用插g的Ş式实现的好处很多Q以后要增加新功能的时候世界编辑器本n的代码就不需要修改了。而且对于团队开发也很有利,一个h负责一个插件的开发就可以?br />发几个图Q?br /><br />以下是没有启用插件的模式Q?br /><img src="http://www.shnenglu.com/images/cppblog_com/mybios/WorldEditor.jpg" border="0" alt="" /><br /><br />以下是启用了地Ş~辑器插件的模式Q?br /><img src="http://www.shnenglu.com/images/cppblog_com/mybios/TerrainEditor.jpg" border="0" alt="" /><br /><br />以下是启用了物g~辑器插件的模式Q?br /><img height="768" src="http://www.shnenglu.com/images/cppblog_com/mybios/NoPlugins.jpg" width="1257" border="0" alt="" /></p><br /><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">不如打赏我一杯咖啡,鼓励我l分享优U的文章?br /><img src="http://www.shnenglu.com/images/cppblog_com/mybios/222.jpg" border="0" alt="" /><br /><br /><br /><br /></p><img src ="http://www.shnenglu.com/mybios/aggbug/44046.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2008-03-09 22:55 <a href="http://www.shnenglu.com/mybios/archive/2008/03/09/44046.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ogre 的渲染到U理的关键的3个步?/title><link>http://www.shnenglu.com/mybios/archive/2007/12/27/39764.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Thu, 27 Dec 2007 13:06:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2007/12/27/39764.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/39764.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2007/12/27/39764.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/39764.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/39764.html</trackback:ping><description><![CDATA[<p>好久没写技术的东西了。现在辗转间又回C深圳工作Q还是做我喜Ƣ的游戏开发。奉献点东西l大家?/p> <p><br />1、创建渲染目标纹理,关键要指定TU_RENDERTARGET参数Q在创徏q个渲染目标U理的过E中QOgre会自动调?nbsp; Root::getSingleton().getRenderSystem()->attachRenderTarget把这个纹理添加到Root的渲染目标中Q也是说每帧都会渲染到q个U理?br />TexturePtr texture = TextureManager::getSingleton().createManual( "RttTex", <br /> ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, <br /> 512, 512, 0, PF_R8G8B8, TU_RENDERTARGET );</p> <p>2、获得渲染目标,有了渲染目标Q才能给目标指定视口和摄像机<br />RenderTarget *rttTex = texture->getBuffer()->getRenderTarget();</p> <p>3、给q个渲染目标指定摄像机,做了q步骤之后,每更新时就会把q个摄像机看到的东西渲染到texture?br />Viewport *v = rttTex->addViewport( mReflectCam );</p> <p>4、OKQ?/p><br /><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">不如打赏我一杯咖啡,鼓励我l分享优U的文章?br /><img src="http://www.shnenglu.com/images/cppblog_com/mybios/222.jpg" border="0" alt="" /><br /><br /><br /><br /></p><img src ="http://www.shnenglu.com/mybios/aggbug/39764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2007-12-27 21:06 <a href="http://www.shnenglu.com/mybios/archive/2007/12/27/39764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>兽3贴图Ҏ(gu)http://www.shnenglu.com/mybios/archive/2007/08/28/31043.html李锦?mybios)李锦?mybios)Tue, 28 Aug 2007 10:57:00 GMThttp://www.shnenglu.com/mybios/archive/2007/08/28/31043.htmlhttp://www.shnenglu.com/mybios/comments/31043.htmlhttp://www.shnenglu.com/mybios/archive/2007/08/28/31043.html#Feedback18http://www.shnenglu.com/mybios/comments/commentRss/31043.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/31043.html只能说这么多了。公司有保密制度。请见谅Q?br />

如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p>

不如打赏我一杯咖啡,鼓励我l分享优U的文章?br />





李锦?mybios) 2007-08-28 18:57 发表评论
]]>
l于实现了魔?贴图法Q发囄?/title><link>http://www.shnenglu.com/mybios/archive/2007/08/28/31021.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Tue, 28 Aug 2007 07:00:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2007/08/28/31021.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/31021.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2007/08/28/31021.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/31021.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/31021.html</trackback:ping><description><![CDATA[兽3的地形脓(chung)囄法非常的巧妙。不q,认真观看他的地图~辑器和用工具导Z的地形脓(chung)囄看,q是可以摸出规律来的?br /><br /><img height="627" alt="" src="http://www.shnenglu.com/images/cppblog_com/mybios/WC3.JPG" width="808" border="0" /><br /><div><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">不如打赏我一杯咖啡,鼓励我l分享优U的文章?br /><img src="http://www.shnenglu.com/images/cppblog_com/mybios/222.jpg" border="0" alt="" /><br /><br /><br /><br /></p></div><img src ="http://www.shnenglu.com/mybios/aggbug/31021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2007-08-28 15:00 <a href="http://www.shnenglu.com/mybios/archive/2007/08/28/31021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于CEGUI的String的调试问?/title><link>http://www.shnenglu.com/mybios/archive/2007/07/29/28914.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sun, 29 Jul 2007 02:17:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2007/07/29/28914.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/28914.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2007/07/29/28914.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/28914.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/28914.html</trackback:ping><description><![CDATA[CEGUI的String不是std::string或std::wstringQ而是自己实现的一个字W串c,他的功能跟std的string很接q?br>但是Q他支持unicodeQ内部存储是使用utf32~码规范来存储unicode字符Q也是?nbsp;typedef  uint32 utf32; utf32*  d_buffer;用这?2位无W号整型的数l来保存unicode字符丌Ӏ优Ҏ(gu)显而易见的Q就是世界上所有字W都可以包囊q去Q毕竟是32位啊Q但是,~点也出来了Q有两点Q?br>W一、内存占用过多,一个字W就要占4个字节,也太费了点Q?br>W二、调试不方便Q由于VS2005的调试窗口只支持ansi和utf16的格式,所以,CEGUI的String在调试器中只能看C堆数字数l,而看不到字符Q这是很郁闷的,每次要查看都要翻到内存那里看Q而且q一堆ؕ码,ȝ?br><br>解决办法Q修改Stringc,使用utf16来代替CEGUI的utf32?br>优点Q?br>解决了内存占用过多的问题Q一个字W只?个字节就可以了;<br>解决了调试问题,VS2005直接支持utf16的显C?br>~点Q?br>可能不支持全世界的字W,因ؓutf16不能表示过16位的字符Q但是,对于大多数国家的字符来说Q已l够了Q毕竟windows2000/xp也是Zutf16~码的?br><br>然后Q下面是修改后的字符串类Q?a title=CEGUIString href="http://www.shnenglu.com/Files/mybios/CEGUIString.rar">CEGUIString</a><br> <img src ="http://www.shnenglu.com/mybios/aggbug/28914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2007-07-29 10:17 <a href="http://www.shnenglu.com/mybios/archive/2007/07/29/28914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在windows下用patch工具更新源码http://www.shnenglu.com/mybios/archive/2007/07/28/28900.html李锦?mybios)李锦?mybios)Sat, 28 Jul 2007 09:09:00 GMThttp://www.shnenglu.com/mybios/archive/2007/07/28/28900.htmlhttp://www.shnenglu.com/mybios/comments/28900.htmlhttp://www.shnenglu.com/mybios/archive/2007/07/28/28900.html#Feedback4http://www.shnenglu.com/mybios/comments/commentRss/28900.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/28900.html但是Q我们下载到的patch文gQ貌似是linux/unix的diff工具生成的,要用linux/unix的patch工具才能把补丁文件更新到源码中?br />后来Q我发现了个windows下可以用的patch工具Q网址如下Q?a >http://gnuwin32.sourceforge.net/packages/patch.htm
使用是很单的Q用命o行方式执行:
patch 源文?补丁文g

例如我们有源文gtest.cppQ下载了个补丁文件test.patchQ那么执行patch test.cpp test.patchQ就会自动把patch里的内容更新到test.cpp中去了?br />
PSQcygwin貌似也有q个工具吧。。以前看q里面好像还有diff工具Q可以生成patch文gQ呵c?br />

如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p>

不如打赏我一杯咖啡,鼓励我l分享优U的文章?br />





李锦?mybios) 2007-07-28 17:09 发表评论
]]>
关于GOOF的新版本http://www.shnenglu.com/mybios/archive/2007/07/18/28250.html李锦?mybios)李锦?mybios)Wed, 18 Jul 2007 01:21:00 GMThttp://www.shnenglu.com/mybios/archive/2007/07/18/28250.htmlhttp://www.shnenglu.com/mybios/comments/28250.htmlhttp://www.shnenglu.com/mybios/archive/2007/07/18/28250.html#Feedback2http://www.shnenglu.com/mybios/comments/commentRss/28250.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/28250.html
Yeah, I'm currently hard at work on the core engine, as the editor is nearly complete. The major feature I need to add for the editor is the ability to add new object definitions without needing to go through text files, but I'm a bit burned out on the editor part so I'm taking a break and working on one of the biggest engine features that needs some work: handling meshes.

Basically I'm reworking the MeshGameObject class completely so it's more viable for large worlds.

As far as features go before I release alpha, the list is still sorta large.

1. Finish the physics system so that it can be used for character movement.
2. An attachment system to be able to specify attachment locations on an object and attach any other object to it.
3. Mesh animation, animation blending, animation sharing between objects.
4. Character class which plays animations based on current state (movement direction, velocity, jumping, strafing, etc.)
5. Redo the mesh system (in progress). This is a biggy and involves a lot crazy stuff that is too complex to explain in bullet point. Basically, will be using all of Ogre's advanced features for mesh lods, material lods, etc. but also tie into background resource loading, load only the lods that are necessary, track which lods are currently loaded, etc.
6. Ability to add, update and delete meta objects from the editor using property dialog functionality. Once a meta object is updated, call a function on all objects that use that meta data so they can update themselves with newest data.
7. Managed material system
8. Create plugins of all dlls and dynamically load.
9. Create a viewer application that is separate from the editor and can load any world file.
10. Update the lighting system, particle system, to use new fading code based on updated mesh code

Those are my major todos, once finished and tested I release alpha. I will likely update CVS after I get the meta objects finished though. I may also fit in the vegetation system before I release alpha. How long will the above list take? Based on my current speed of development, 3 months.

I have a core list of features that I think are necessary for an engine, and they include:

1. Physics simulation, character movement, vehicles, damage, explosions, breakable objects
2. Lighting - ambient occlusion, realtime lighting and shadows. Lighting manager is required to control ambient, shadows when moving from interior to exterior
3. Trees and vegetation
4. Dynamic environment. Sky transitioning, clouds, fog, global ambient, sun position and direction, sun glare, dynamic shadows
5. Networking using ReplicaNet. Run GOOF engine in server mode where it doesn't initialize any rendering systems. Update all objects to know whether they're being created on standalone server or not.
6. Sound management, 2d sounds, 3d sounds, sound line, background music.
7. Doors, triggers, elevators
8. In-game cutscenes
9. Background loading, resource garbage collection, forced loading
10. AI framework
11. Character inventory, equipping with 3 clothing types: shared skeleton, individual skeleton, attached to bone
12. Terrain with splatting

The above will take me years unless I have help
Smile

Oh yeah, the editor is very nice now, in my opinion.

Not only did I port to wxWidgets, I fixed and added a lot of general features to the GOOF Engine Editor Tool (the tool for creating scenes for the GOOF engine).

1. Multi select objects from the selection dialog
2. Ctrl drag to box select objects in the viewport, or Alt drag to box unselect, with selection lines to show what you're selecting.
3. Option to orient objects to the normal of the collided object when in drag mode. Means you can basically drag things up walls now if you're in a room and the object, such as a painting, will orient to the wall you drag it along.
4. Redid the movement axis manipulator so it now moves to exactly where you want it to move to instead of sliding along crazily.
5. Added a line that shows what you're linking to when you are in link mode.
6. Tree view for the select dialog, with scene hierarchy
7. Ability to click and edit partition properties from the same select dialog, and shows objects under their partition with the active partition listed at the top.
8. Obviously, all the wxWidgets stuff such as window snapping, toolbar, menu, automatic viewport resizing, view menu which lists windows, redid all the open/save functionality to support a standard file dialog, etc.

Fixed tons of bugs. Undo system works now. Linking and unlinking objects fixed. Deleting multiple objects fixed when there are parent/child relationships between objects. The movement axis manipulator fixed. Fixed dragging over other objects - the object used to jump around crazily.

Probably tons more as well, but this is what I remember off the top of my head.




李锦?mybios) 2007-07-18 09:21 发表评论
]]>
关于GOOF的bug问题http://www.shnenglu.com/mybios/archive/2007/07/16/28157.html李锦?mybios)李锦?mybios)Mon, 16 Jul 2007 14:53:00 GMThttp://www.shnenglu.com/mybios/archive/2007/07/16/28157.htmlhttp://www.shnenglu.com/mybios/comments/28157.htmlhttp://www.shnenglu.com/mybios/archive/2007/07/16/28157.html#Feedback10http://www.shnenglu.com/mybios/comments/commentRss/28157.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/28157.html使用了几天GOOFQ发C存在很多bug啊,什么缓存溢出,数组界之类的。。很明显q个框架没有真正用在一个项目上的。我列D几个大问题吧。好让大家别到处壁?br />bool EnvironmentGameSystem::save(DataElementPtr element)q个函数没有实现Q所以无法保存环境信息?br />
q有
 void GridPartition::enumerateConnectedPartitions(vector<CorePartition*>& connected)
 {
  //get surrounding grid cells within a certain radius
  float loadRadius = mGridPartitionMgr->getGridCellLoadRadius();

  //enumerate partitions
  vector<CorePartition*> partitions;
  mGridPartitionMgr->enumeratePartitions(partitions);

  //iterate through and check distance
  for(vector<CorePartition*>::iterator itr = partitions.begin(); itr != partitions.end(); ++itr)
  {
   float distance = Vector3(getWorldPosition() - (*itr)->getWorldPosition()).length();
   // add by 李锦?2007-7-16
   // 不要q回自己作ؓdQ会产生bug
   if(distance < loadRadius && *itr != this)
    connected.push_back(*itr);
  }
 }

再给Z个比较严重的bug
GOOFTranslationManipulator.h中的
  // add by 李锦?2007-7-12
  // 不要用魔术数Q搞到缓存溢?br />  SceneNode* mNode[AT_LAST];
  Entity* mEnt[AT_LAST];
  Entity* mConeEnt[AT_LAST];
  CollisionShapePtr mCol[AT_LAST];
  AxisManipulatorHandle* mHandle[AT_LAST];

另外QCorePartition中的setSkyboxMaterial、setGlobalAmbient之类的代码貌似没用。准备弃之?br />


    // add by 李锦?2007-7-16
    // q个法暂时有问题,先屏蔽,以后再慢慢解?br />    //disable static geometry until it is fixed
    if(false)// getStaticGeometryRule() == SGR_ALWAYS || (getStaticGeometryRule() == SGR_WHEN_NOT_PROX_IMMEDIATE && getPartition()->getProximity() != CorePartition::PROX_IMMEDIATE))
    {
     willConvertToStaticGeometry = true;
     getPartition()->addObjectToConvertToStaticGeometry(this);
    }

李锦?mybios) 2007-07-16 22:53 发表评论
]]>
ZOGRE渲染引擎的地形插件PLSM2的编辑器GOOFhttp://www.shnenglu.com/mybios/archive/2007/07/06/27620.html李锦?mybios)李锦?mybios)Fri, 06 Jul 2007 12:28:00 GMThttp://www.shnenglu.com/mybios/archive/2007/07/06/27620.htmlhttp://www.shnenglu.com/mybios/comments/27620.htmlhttp://www.shnenglu.com/mybios/archive/2007/07/06/27620.html#Feedback17http://www.shnenglu.com/mybios/comments/commentRss/27620.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/27620.html


李锦?mybios) 2007-07-06 20:28 发表评论
]]>
l过近一个月的努力,服务器框架终于搭v来了http://www.shnenglu.com/mybios/archive/2007/06/05/25605.html李锦?mybios)李锦?mybios)Tue, 05 Jun 2007 15:12:00 GMThttp://www.shnenglu.com/mybios/archive/2007/06/05/25605.htmlhttp://www.shnenglu.com/mybios/comments/25605.htmlhttp://www.shnenglu.com/mybios/archive/2007/06/05/25605.html#Feedback20http://www.shnenglu.com/mybios/comments/commentRss/25605.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/25605.html好久没更新blog了啊。找到新工作都已l很久了Q本来在深圳做得好好的,公司H然又搬到杭州来了,没办法,跟着来了杭州。现在我做客L逻辑与服务器引擎架构一hQ好晕啊Q天天加班做。幸好客L是用现成的引擎,只是Q不太喜Ƣ现在这个引擎,Torque game engine advanceQ架构实在太差了Q以后有Z一定要换成Ogre或Nebula2才行啊?br>
现在在开发一Ƒօ新的MMORPG游戏Q现在是目立项阶段Q需要出技术演C,没办法啊Q时间紧q,我跟另外一个程序主用了将q一个月完成了项目的W一个里E碑。完成了玩家d、角色创?删除、h物行走、多人在Uѝ怪物生成与行走AI{等|络功能了,当然客户端方面也做好了。可惜项目主不是我Q图也不允许抓下来啊Q对不v大家了。欢q加QQQ?0743734交流MMORPG开发?br>
明天爸爸要做肺部肿瘤切除手术了,愿他一切顺利啊Q等他痊愈后我发誓要让他q上q福的晚q生zR祝爸爸健康q福。。。大伙们帮忙福一下吧Q谢谢大家了?/p> 爸爸Q请原谅儿子我的不孝Q\途遥q,不能赶回来陪着(zhn)做手术Q我以后一定会好好孝顺(zhn)的?

李锦?mybios) 2007-06-05 23:12 发表评论
]]>
VS2005cd导的问题http://www.shnenglu.com/mybios/archive/2006/12/31/17088.html李锦?mybios)李锦?mybios)Sun, 31 Dec 2006 07:51:00 GMThttp://www.shnenglu.com/mybios/archive/2006/12/31/17088.htmlhttp://www.shnenglu.com/mybios/comments/17088.htmlhttp://www.shnenglu.com/mybios/archive/2006/12/31/17088.html#Feedback7http://www.shnenglu.com/mybios/comments/commentRss/17088.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/17088.htmlq会带来什么问题?我今天就遇到了一ơ。当我用VS2005cd导生成一个类Q如
class BaseClass
{
public:
    BaseClass(){};
   ~BaseClass(){};
   virtual void VFun() = 0;
}

然后Q再生成一个类l承于他
class ProblemClass : public BaseClass
{
public:
    ProblemClass (){};
   ~ProblemClass (){};
   virtual void VFun(){};
}

然后Q执行以下代码:

BaseClass *pClass = new ProblemClass ;
delete pClass ;

如无以外Q在delete的时候就会出现堆错误


李锦?mybios) 2006-12-31 15:51 发表评论
]]>
g兼容性的陷阱QDrawIndexedPrimitiveUP的用?/title><link>http://www.shnenglu.com/mybios/archive/2006/12/25/16840.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Mon, 25 Dec 2006 07:11:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/12/25/16840.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/16840.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/12/25/16840.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/16840.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/16840.html</trackback:ping><description><![CDATA[好好的一个程序,在我的电(sh)脑(ELSA X800 256M昑֍Q上q行一切正常,拿到别的?sh)脑Q?45G内置昑֍Q上。啊。花屏~~赶快调试,q好公司的电(sh)脑也有这U内|显卡的?sh)脑。赶快用q程调试。谁知这一调试Q就׃我整整一个上午。。。赶快写下来。。?br /><br />最l排差的原因是DrawIndexedPrimitiveUP最后一个参?em>VertexStreamZeroStride</em> Q这个参数是用来指定点所占的字节数。我自作聪明的把点l构后增加了一个自q的数据,如:正常的顶点结?br />struct CUSTOMVERTEX<br />{<br /> FLOAT x, y, z,rhw;<br /> DWORD color;<br /> float u,v;<br />};<br /><br />我改了之后的点l构Q?br />struct CUSTOMVERTEX<br />{<br /> FLOAT x, y, z,rhw;<br /> DWORD color;<br /> float u,v;<br />DWORD dwMyData; // 用来保存我自q的数?br />};<br /><br />l果Q在我的昑֍上一切正常,q个数据也有用,然后DrawIndexedPrimitiveUP的时候,也会Ҏ(gu)最后的参数sizeof(CUSTOMVERTEX)利的读取相应的点。但是,拿到845G的内|显卡上死z花屏。后来终于知道是q个原因Q于是解军_法就是把dwMyDataLQ放到顶点结构外面去?br /><br />Z说说DrawIndexedPrimitiveUP的用法:<br /><strong>HRESULT DrawIndexedPrimitiveUP(</strong><br />  <b>D3DPRIMITIVETYPE</b><i>PrimitiveType</i><b>, // 囑֎的类?/b><br />  <b>UINT</b><i>MinVertexIndex</i><b>,  // 指定0</b><br />  <b>UINT</b><i>NumVertices</i><b>,  // 指定需要渲染的点的数量(如一个矩形可以由4个顶点组成,然后通过点索引来达到渲?个三角Ş的效果,那么q里应该填?Q而不?Q?/b><br />  <b>UINT</b><i>PrimitiveCount</i><b>, // 要渲染的囑֎的数量(如一个矩形,׃个三角Şl成Q就应该填写2Q?/b><br />  <b>CONST void *</b><i>pIndexData</i><b>, // 索引数据指针</b><br />  <b>D3DFORMAT</b><i>IndexDataFormat</i><strong>, // 索引数据格式Q一般ؓD3DFMT_INDEX16或D3DFMT_INDEX32</strong> <br />  <b>CONST void*</b><i>pVertexStreamZeroData</i><b>, // 点数据指针</b><br />  <b>UINT</b><i>VertexStreamZeroStride // 点大小一般ؓsizeof(点l构)</i><br /><b>);</b><br /><br />记得默认情况下渲染三角Ş的顺序是逆时针的Q初学者经常范q个错误Q本来想渲染一个矩形,l果一个三角Ş时间、另一个三角Ş逆时针,l果渲染出来只看C个三角Ş了,被背面剔除掉了)?br /><img src ="http://www.shnenglu.com/mybios/aggbug/16840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-12-25 15:11 <a href="http://www.shnenglu.com/mybios/archive/2006/12/25/16840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D 引擎中的 GUI 渲染优化补完http://www.shnenglu.com/mybios/archive/2006/12/24/16795.html李锦?mybios)李锦?mybios)Sun, 24 Dec 2006 06:14:00 GMThttp://www.shnenglu.com/mybios/archive/2006/12/24/16795.htmlhttp://www.shnenglu.com/mybios/comments/16795.htmlhttp://www.shnenglu.com/mybios/archive/2006/12/24/16795.html#Feedback1http://www.shnenglu.com/mybios/comments/commentRss/16795.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/16795.html阅读全文

李锦?mybios) 2006-12-24 14:14 发表评论
]]>
3D 引擎?GUI 渲染的优?/title><link>http://www.shnenglu.com/mybios/archive/2006/12/23/16778.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sat, 23 Dec 2006 14:32:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/12/23/16778.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/16778.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/12/23/16778.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/16778.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/16778.html</trackback:ping><description><![CDATA[前几天的BLOG中说了一些我?D引擎GUI的渲染部分原理,q几天做到ListCtrl控g的时候,当我d很多Itemq去的时候(几乎满屏?2Px汉字Q一个汉字两个三角ŞQ相当于上万个三角Ş了)QFPS降得吓hQDebug版只?8FPSQRelease版也只有60FPS。。优化、优化、还是优化!优化之后QFPSl于辑ֈ了o人满意的500FPS左右了。且听我慢慢说来?br /><br />首先是用我的引擎内部剖析分析了代码的瓉QProfileq东西真的有用啊Q让我很Ҏ(gu)找C慢的原因Q参见GPG3 1.17《实时的层次化性能评测》)Q发现处理时间主要被Cache法和渲染两部䆾占了Q于是,我在惻I渲染慢是正常的(当时的想法比较弱智,后文有术Q,所以,我打从Cache法着手。首先是优化了ListCtrl的Cache法Q把那些在屏q外的Item的Visible属性设|成falseQ我的算法中Visible为falseQCache部分法q接蟩q)Q于是速度一下子׃来了QRelease版本辑ֈ?30FPS。但是,q是慢啊。怎么办?剖析之后Q发现大部分的处理时间都集中在渲染部分,我之前的x是渲染慢是正常的Q所以暂时无法解冟뀂。?br /><br />下班的时候,出去遛了一圈,路上H然惛_了我渲染法中另外一个跟渲染速度有关的东西,动态修攚wҎ(gu)据!N是这里的原因Q回来后马上试Q把动态修改的代码屏蔽Q直接每帧渲?0000三角形,妈呀Q?000Q的FPSQ完全否定了我之前的xQ渲染慢是正常的Q,唉,x也是Q每U千万、上亿个三角形生成速度的显卡,对于区区一万个三角形怎么会慢?..既然扑ֈ原因Q就要优化啊Q现在找到原因是因ؓ动态修攚w点导_惛_了以前看q一文章说点数据存储的位|(即CreateVertexBuffer的D3DPool参数Q,说到做到Q把原来的D3DPOOL_MANAGEDҎ(gu)D3DPOOL_SYSMEMORYQ哇Q速度一下子提升?60FPS左右Q想h原因也是单的Q既然要每Lockq么多数据,那么点数据需要从昑֭->CPU处理Q然后CPU提交回显存,ȝ交换也太频繁了,如果Ҏ(gu)SYSMEMORY的话Q就只需要从CPU->昑֭可以了?br /><br />然后我又惻I有没有更好的优化Ҏ(gu)Q答案是有的。。最快的修改内存数据的方法是什么?当然是直接读写内存啊Q那么我惛_了DrawPrimitiveUPQ把点数据直接new出来Q然后DrawPrimitiveUP提交Q改成这样后Q速度再度提升Q达到惊人的500FPSQ?br /><br />最后,我把DrawPrimitiveUPҎ(gu)DrawIndexedPrimitiveUPQ那么顶Ҏ(gu)量也减少了。但是奇怪的是速度~没有更快,反而慢了一点点Q慢??0FPS左右Q,但是Q我用了DrawIndexedPrimitiveUPQ我之后q有更好的优化算法准备实现。通过DrawIndexedPrimitiveUPQ但是还没做好。。所以先卖个兛_了。明天搞好的话再写Blog?br /><br />唉,回头看了下自己写的东西,׃八糟。都不知道有没有人看得懂啊。不了。知之ؓ知之Q不知ؓ不知吧。呵呵,看不懂的误Z下?br /><br />写代码去了~?img src ="http://www.shnenglu.com/mybios/aggbug/16778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-12-23 22:32 <a href="http://www.shnenglu.com/mybios/archive/2006/12/23/16778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天到了LINK2005的问?/title><link>http://www.shnenglu.com/mybios/archive/2006/12/22/16719.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Fri, 22 Dec 2006 03:14:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/12/22/16719.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/16719.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/12/22/16719.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/16719.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/16719.html</trackback:ping><description><![CDATA[烦h的错误。。搞了一个多时才解冻I写下来记录一下?br /><br />解决办法Q保证需要链接的几个目的运行时库用同一个类型就O(jin)K了!例如我的工程中有GameCore、Plugin_D3D9RenderSystem、Plugin_Win32Platform三个工程Q那么就去设|每个工E的C/C++ ->代码生成->q行时库Q统一讄?#8220;多线E?DLL(/MD)”Q就可以了。如果其中一个不是MDQ就会出C下的错误。很烦h。希望同样遇到这个问题的朋友能少走弯?br /><br />以下是链接错误信息:<br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (<a href="mailto:?width@ios_base@std@@QAEHH@Z">?width@ios_base@std@@QAEHH@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (<a href="mailto:?width@ios_base@std@@QBEHXZ">?width@ios_base@std@@QBEHXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (<a href="mailto:?flags@ios_base@std@@QBEHXZ">?flags@ios_base@std@@QBEHXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (<a href="mailto:?good@ios_base@std@@QBE_NXZ">?good@ios_base@std@@QBE_NXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: int __thiscall std::ios_base::rdstate(void)const " (<a href="mailto:?rdstate@ios_base@std@@QBEHXZ">?rdstate@ios_base@std@@QBEHXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits<char>::length(char const *)" (<a href="mailto:?length@?$char_traits@D@std@@SAIPBD@Z">?length@?$char_traits@D@std@@SAIPBD@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "class std::basic_ostream<wchar_t,struct std::char_traits<wchar_t> > & __cdecl std::operator<<<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >(class std::basic_ostream<wchar_t,struct std::char_traits<wchar_t> > &,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" (<a href="mailto:??$?6_WU?$char_traits@_W@std@@V?$allocator@_W@1@@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@0@AAV10@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@@Z">??$?6_WU?$char_traits@_W@std@@V?$allocator@_W@1@@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@0@AAV10@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: wchar_t __thiscall std::basic_ios<wchar_t,struct std::char_traits<wchar_t> >::fill(void)const " (<a href="mailto:?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WXZ">?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __thiscall std::basic_ostringstream<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::str(void)const " (<a href="mailto:?str@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ">?str@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_ostringstream<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::basic_ostringstream<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >(int)" (<a href="mailto:??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@H@Z">??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@H@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_ostream<wchar_t,struct std::char_traits<wchar_t> > & __thiscall std::basic_ostream<wchar_t,struct std::char_traits<wchar_t> >::operator<<(int)" (<a href="mailto:??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@H@Z">??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@H@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" (<a href="mailto:??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV01@@Z">??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV01@@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: void __thiscall std::basic_ostream<wchar_t,struct std::char_traits<wchar_t> >::_Osfx(void)" (<a href="mailto:?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ">?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_ostream<wchar_t,struct std::char_traits<wchar_t> > * __thiscall std::basic_ios<wchar_t,struct std::char_traits<wchar_t> >::tie(void)const " (<a href="mailto:?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ">?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf<wchar_t,struct std::char_traits<wchar_t> >::_Lock(void)" (<a href="mailto:?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ">?_Lock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf<wchar_t,struct std::char_traits<wchar_t> >::_Unlock(void)" (<a href="mailto:?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ">?_Unlock@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: unsigned short __thiscall std::basic_streambuf<wchar_t,struct std::char_traits<wchar_t> >::sputc(wchar_t)" (<a href="mailto:?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEG_W@Z">?sputc@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEG_W@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::~basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >(void)" (<a href="mailto:??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ">??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ</a>) 已经?Plugin_Win32Platform.lib(Plugin_Win32Platform.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >(wchar_t const *)" (<a href="mailto:??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_W@Z">??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_W@Z</a>) 已经?Plugin_Win32Platform.lib(Plugin_Win32Platform.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >(void)" (<a href="mailto:??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ">??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: void __thiscall std::basic_ostringstream<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::`vbase destructor'(void)" (<a href="mailto:??_D?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ">??_D?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_ostream<wchar_t,struct std::char_traits<wchar_t> > & __thiscall std::basic_ostream<wchar_t,struct std::char_traits<wchar_t> >::flush(void)" (<a href="mailto:?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ">?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_streambuf<wchar_t,struct std::char_traits<wchar_t> > * __thiscall std::basic_ios<wchar_t,struct std::char_traits<wchar_t> >::rdbuf(void)const " (<a href="mailto:?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ">?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: void __thiscall std::basic_ios<wchar_t,struct std::char_traits<wchar_t> >::setstate(int,bool)" (<a href="mailto:?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z">?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::locale __thiscall std::ios_base::getloc(void)const " (<a href="mailto:?getloc@ios_base@std@@QBE?AVlocale@2@XZ">?getloc@ios_base@std@@QBE?AVlocale@2@XZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: static unsigned int __cdecl std::ctype<wchar_t>::_Getcat(class std::locale::facet const * *)" (<a href="mailto:?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@@Z">?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: wchar_t __thiscall std::ctype<wchar_t>::widen(char)const " (<a href="mailto:?widen@?$ctype@_W@std@@QBE_WD@Z">?widen@?$ctype@_W@std@@QBE_WD@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::locale::facet const * __thiscall std::locale::_Getfacet(unsigned int)const " (<a href="mailto:?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z">?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::locale::~locale(void)" (<a href="mailto:??1locale@std@@QAE@XZ">??1locale@std@@QAE@XZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: void __thiscall std::locale::facet::_Register(void)" (<a href="mailto:?_Register@facet@locale@std@@QAEXXZ">?_Register@facet@locale@std@@QAEXXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: void __thiscall std::locale::facet::_Incref(void)" (<a href="mailto:?_Incref@facet@locale@std@@QAEXXZ">?_Incref@facet@locale@std@@QAEXXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::locale::id::operator unsigned int(void)" (<a href="mailto:??Bid@locale@std@@QAEIXZ">??Bid@locale@std@@QAEIXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: static unsigned short __cdecl std::char_traits<wchar_t>::eof(void)" (<a href="mailto:?eof@?$char_traits@_W@std@@SAGXZ">?eof@?$char_traits@_W@std@@SAGXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: static bool __cdecl std::char_traits<wchar_t>::eq_int_type(unsigned short const &,unsigned short const &)" (<a href="mailto:?eq_int_type@?$char_traits@_W@std@@SA_NABG0@Z">?eq_int_type@?$char_traits@_W@std@@SA_NABG0@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "bool __cdecl std::operator<<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &,class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" (<a href="mailto:??$?M_WU?$char_traits@_W@std@@V?$allocator@_W@1@@std@@YA_NABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@0@Z">??$?M_WU?$char_traits@_W@std@@V?$allocator@_W@1@@std@@YA_NABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@0@0@Z</a>) 已经?Plugin_Win32Platform.lib(Win32RenderWindow.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "protected: wchar_t const * __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::_Myptr(void)const " (<a href="mailto:?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IBEPB_WXZ">?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IBEPB_WXZ</a>) 已经?Plugin_Win32Platform.lib(Plugin_Win32Platform.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: wchar_t const * __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::c_str(void)const " (<a href="mailto:?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ">?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ</a>) 已经?Plugin_Win32Platform.lib(Win32LogSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "protected: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Myptr(void)const " (<a href="mailto:?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IBEPBDXZ">?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IBEPBDXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: unsigned int __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::size(void)const " (<a href="mailto:?size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ">?size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: char const * __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::c_str(void)const " (<a href="mailto:?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ">?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (<a href="mailto:??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ">??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (<a href="mailto:??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z">??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (<a href="mailto:??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z">??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: bool __thiscall std::ios_base::fail(void)const " (<a href="mailto:?fail@ios_base@std@@QBE_NXZ">?fail@ios_base@std@@QBE_NXZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > & __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::erase(unsigned int,unsigned int)" (<a href="mailto:?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@II@Z">?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@II@Z</a>) 已经?Plugin_Win32Platform.lib(Plugin_Win32Platform.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: void __thiscall std::basic_ios<wchar_t,struct std::char_traits<wchar_t> >::clear(int,bool)" (<a href="mailto:?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z">?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: unsigned int __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::size(void)const " (<a href="mailto:?size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ">?size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ</a>) 已经?Plugin_Win32Platform.lib(Plugin_Win32Platform.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "protected: wchar_t * __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::_Myptr(void)" (<a href="mailto:?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEPA_WXZ">?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEPA_WXZ</a>) 已经?Plugin_Win32Platform.lib(Plugin_Win32Platform.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (<a href="mailto:??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ">??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf<wchar_t,struct std::char_traits<wchar_t> >::sputn(wchar_t const *,int)" (<a href="mailto:?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEHPB_WH@Z">?sputn@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QAEHPB_WH@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits<wchar_t>::length(wchar_t const *)" (<a href="mailto:?length@?$char_traits@_W@std@@SAIPB_W@Z">?length@?$char_traits@_W@std@@SAIPB_W@Z</a>) 已经?Plugin_Win32Platform.lib(Plugin_Win32Platform.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(char const *,unsigned int)" (<a href="mailto:?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z">?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::append(char const *,unsigned int)" (<a href="mailto:?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z">?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />libcpmt.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (<a href="mailto:?_Addstd@ios_base@std@@SAXPAV12@@Z">?_Addstd@ios_base@std@@SAXPAV12@@Z</a>) 已经?msvcprt.lib(MSVCP80.dll) 中定?br />libcpmt.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (<a href="mailto:?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z">?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z</a>) 已经?msvcprt.lib(MSVCP80.dll) 中定?br />libcpmt.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (<a href="mailto:?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ">?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ</a>) 已经?msvcprt.lib(MSVCP80.dll) 中定?br />libcpmt.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" (<a href="mailto:?facet_Register@facet@locale@std@@CAXPAV123@@Z">?facet_Register@facet@locale@std@@CAXPAV123@@Z</a>) 已经?msvcprt.lib(MSVCP80.dll) 中定?br />libcpmt.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (<a href="mailto:?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z">?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z</a>) 已经?msvcprt.lib(MSVCP80.dll) 中定?br />libcpmt.lib(locale0.obj) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::operator=(char const *)" (<a href="mailto:??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z">??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z</a>) 已经?msvcprt.lib(MSVCP80.dll) 中定?br />libcpmt.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (<a href="mailto:?_Init@locale@std@@CAPAV_Locimp@12@XZ">?_Init@locale@std@@CAPAV_Locimp@12@XZ</a>) 已经?msvcprt.lib(MSVCP80.dll) 中定?br />libcpmt.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,char const *)" (<a href="mailto:?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z">?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z</a>) 已经?msvcprt.lib(MSVCP80.dll) 中定?br />libcpmt.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (<a href="mailto:??0_Lockit@std@@QAE@H@Z">??0_Lockit@std@@QAE@H@Z</a>) 已经?msvcprt.lib(MSVCP80.dll) 中定?br />libcpmt.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (<a href="mailto:??1_Lockit@std@@QAE@XZ">??1_Lockit@std@@QAE@XZ</a>) 已经?msvcprt.lib(MSVCP80.dll) 中定?br />msvcprt.lib(MSVCP80.dll) : error LNK2005: "public: class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > & __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::assign(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &)" (<a href="mailto:?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@@Z">?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@@Z</a>) 已经?Plugin_Win32Platform.lib(Win32InputSystem.obj) 中定?br />   正在创徏?../Lib/GameCore.lib 和对?../Lib/GameCore.exp<br />../Bin/GameCore.dll : fatal error LNK1169: 扑ֈ一个或多个多重定义的符?br /><div><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p><p style="margin-top: 10px; margin-bottom: 10px; box-sizing: border-box; line-height: 24px; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px;">不如打赏我一杯咖啡,鼓励我l分享优U的文章?br /><img src="http://www.shnenglu.com/images/cppblog_com/mybios/222.jpg" border="0" alt="" /><br /><br /><br /><br /></p></div><img src ="http://www.shnenglu.com/mybios/aggbug/16719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-12-22 11:14 <a href="http://www.shnenglu.com/mybios/archive/2006/12/22/16719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>q段旉开?D引擎啊,正在做GUI部分http://www.shnenglu.com/mybios/archive/2006/12/19/16630.html李锦?mybios)李锦?mybios)Tue, 19 Dec 2006 13:30:00 GMThttp://www.shnenglu.com/mybios/archive/2006/12/19/16630.htmlhttp://www.shnenglu.com/mybios/comments/16630.htmlhttp://www.shnenglu.com/mybios/archive/2006/12/19/16630.html#Feedback10http://www.shnenglu.com/mybios/comments/commentRss/16630.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/16630.html
接下来的一D|子里Q是时候l学3D的东西了Q于是萌生了个做游戏引擎的想法。我是个惛_做的hQ虽然我也知道自己是不自量力Q但是,只要我肯dQ即使做不好Q也L能学C西啊Q把学过的东西拿来用一番,p有感觉了?br />
说说引擎部分的构建,引擎部分的FrameWork主要参考了GPG3?.2那个框架模式Q采用Unicode~译Q感觉上那个模式比较好用Q但是太复杂了点Q于是我化了他,基本上只保留了Q务系l。用^台无关的插g方式把Win32和Direct3D9的模块做了出来(当然只封装了一部分函敎ͼQ把Ogre的基库全部拿来主义(哈哈Q主要就是数学库、工具库{等Q。而声韛_擎也留了接口Q很好扩展了?br />
然后Q现在正在做GUI部分Q主要还是说说GUI的渲染部分吧。GUI其中有两个我认ؓ比较关键的地方,其一是渲染文字部分,其二是渲染窗口部分。下面说说我的做?br />文字渲染部分Q?br />我的做法是用FreeType2dTTF文gQ然后当要渲染文字的时候,看哪个用到的文字load哪个文字Q先获得q个文字的大,然后在脓(chung)图中扑ֈ一个空闲的区域Q我的脓(chung)囑֤是512×512Q也可以讄Q,然后blt到脓(chung)图中Q真正渲染的时候就把这个脓(chung)囄理坐标脓(chung)C个三角Ş上就完成了一个文字的渲染了?br />在脓(chung)图中扄闲区域我有个比较特别的做法,是每个需要渲染的文字l护一个RefCount引用计数Q例如一个屏q里10个“我”字Q那么“我”的引用计数是10Q当“我”字不需要再渲染的时候(引用计数?Q,此文字的贴图区域可以被其他文字所覆盖?br />H口渲染部分Q?br />

class GAMECORE_EXPORT GUIRenderCache
{
protected:
    
// 不允许显式创建,只可以?/span>
    GUIRenderCache(void);
public:
    
virtual ~GUIRenderCache(void);

    
// d到渲染队?/span>
    void AddCache(const GUIRenderQuad& quad)
    
{
        m_vtGUIRenderQuad.insert(GUIRenderQuadPtr(
new GUIRenderQuad(quad)));
    }



    
// 渲染需要Cache队列
    void RenderCache(void)
    
{
        
// 从新Cache队列
        if(m_bDirty)
        
{
            ClearCacheList();
            DoCache();
            m_bDirty 
= false;
        }

        
// d到渲染器
        for(VectorGUIRenderQuad::const_iterator iter = m_vtGUIRenderQuad.begin() ; iter != m_vtGUIRenderQuad.end() ; iter ++)
        
{
            Systems::GetSingleton().GetGUIRendererSystem()
->AddCache(*iter);
        }

    }

    
// 清空cache队列
    void ClearCacheList(void)
    
{
        m_vtGUIRenderQuad.clear();
    }

protected:

    
// Cache需要渲染的目
    virtual void DoCache(){};

    VectorGUIRenderQuad m_vtGUIRenderQuad;    
// 渲染队列
    bool m_bDirty; // 需要重新Cache需要渲染的目
}
;



每个WindowQ一个Window是一个抽象类QStatic/Button/Dialog{等所有窗口都是承于WindowQ都l承于GUIRenderCache对象Q当H口的某个属性(如WindowTextQ改变时Q就会把m_bDirty标记讄成true。每帧渲染的时候调用RenderCache。那么如果窗口的属性没有改变,只需要把m_vtGUIRenderQuad的东西渲染出来;如果属性改变了Q即m_bDirty为trueQ,则调用DoCacheQ由l承c(如Static/Button{)改写q个函数Q计脓(chung)囑֝标、三角Ş坐标{等东西都放在这个函数里。ȝ来说QCache之后速度会比Cache之前快v码一半以上?br />
好了Q睡觉去了?img src ="http://www.shnenglu.com/mybios/aggbug/16630.html" width = "1" height = "1" />

李锦?mybios) 2006-12-19 21:30 发表评论
]]>
点声明http://www.shnenglu.com/mybios/archive/2006/12/02/15891.html李锦?mybios)李锦?mybios)Sat, 02 Dec 2006 08:42:00 GMThttp://www.shnenglu.com/mybios/archive/2006/12/02/15891.htmlhttp://www.shnenglu.com/mybios/comments/15891.htmlhttp://www.shnenglu.com/mybios/archive/2006/12/02/15891.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15891.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15891.html阅读全文

李锦?mybios) 2006-12-02 16:42 发表评论
]]>
VS2003下编译Windows计算?/title><link>http://www.shnenglu.com/mybios/archive/2006/12/02/15889.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sat, 02 Dec 2006 08:10:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/12/02/15889.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15889.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/12/02/15889.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15889.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15889.html</trackback:ping><description><![CDATA[工程已经放上Q?a href="http://www.shnenglu.com/Files/mybios/calc.rar">下蝲回去~译p</a>Q放个脓(chung)图:<br /><br /><img height="309" alt="Calc.JPG" src="http://www.shnenglu.com/images/cppblog_com/mybios/ArticlePics/Calc.JPG" width="480" border="0" /><img src ="http://www.shnenglu.com/mybios/aggbug/15889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-12-02 16:10 <a href="http://www.shnenglu.com/mybios/archive/2006/12/02/15889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天遇到了郁LC函数Q幸好遇到高手帮忙解决了http://www.shnenglu.com/mybios/archive/2006/11/30/15817.html李锦?mybios)李锦?mybios)Thu, 30 Nov 2006 08:30:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/30/15817.htmlhttp://www.shnenglu.com/mybios/comments/15817.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/30/15817.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15817.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15817.html
char sChar[MAX_PATH];
const WCHAR wChar[] = L"我的朋友";
// 把wCharq个Unicode字符串{换成ANSI字符Ԍ保存到sCharQƈ且返回ANSI的字W串大小Q如果失败,则返?1
  wcstombs(sChar, wChar, MAX_PATH);

q样是运行不q不ȝQLq回-1?br />
后来lh提醒Q需要在调用wcstombs之前要先讄代码:

char sChar[MAX_PATH];
const WCHAR wChar[] = L"我的朋友";

// 讄代码ؓ默认代码?br />  _tsetlocale(LC_ALL,_T(""));
// 把wCharq个Unicode字符串{换成ANSI字符Ԍ保存到sCharQƈ且返回ANSI的字W串大小Q如果失败,则返?1
  wcstombs(sChar, wChar, MAX_PATH);


q样可以了Q不用调用烦人的WideCharToMultiByteQ多好啊Q?br />相反的函敎ͼmbstowcsQ可以从ANSI转换到Unicode

李锦?mybios) 2006-11-30 16:30 发表评论
]]>
【{贴】DXUT~程指南(?:通过DXUT使用讑֤http://www.shnenglu.com/mybios/archive/2006/11/22/15531.html李锦?mybios)李锦?mybios)Wed, 22 Nov 2006 03:35:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/22/15531.htmlhttp://www.shnenglu.com/mybios/comments/15531.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/22/15531.html#Feedback1http://www.shnenglu.com/mybios/comments/commentRss/15531.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15531.html 通过DXUT使用讑֤
DirectX讑֤的创建在DXUT中得C改进。你可以让你的应用程序直接创备而其它有框架提供的特征仍然可用?br />创徏讑֤
选择最佳的讑֤讄
修改可用的设备设|?br />降ؓ软g点处理
使用你自q讑֤

创徏讑֤
典型圎ͼ你将通过标准的Direct3DҎ(gu)创徏讑֤
HRESULT CreateDevice(
    UINT                  Adapter,
    D3DDEVTYPE            DeviceType,
    HWND                  hFocusWindow,
    DWORD                 BehaviorFlags,
    D3DPRESENT_PARAMETERS *pPresentationParameters,
    IDirect3DDevice9      **ppReturnedDeviceInterface
);
q个Ҏ(gu)需要有效的适配器,讑֤cd(HAL or REF),H口句柄Q行为标?software/hardware vertex processing 和其它驱动标?Q以及呈现参?presentation parameters).此外QD3DPRESENT_PARAMETERl构体还拥有大量的成员指定后备缓冲区Q多重采栯定,交换效果Q窗口模式,深度模版~冲Q刷新率Q呈现间隔,以及呈现标志?br />为所有这些参数选择有效的设定是h挑战性的。框枉过DXUTCreateDevice函数化了q一选择q程?br />HRESULT DXUTCreateDevice(
    UINT AdapterOrdinal  = D3DADAPTER_DEFAULT,
    BOOL bWindowed       = TRUE,
    INT nSuggestedWidth  = 640,
    INT nSuggestedHeight = 480,
    LPDXUTCALLBACKISDEVICEACCEPTABLE pCallbackIsDeviceAcceptable     = NULL,
    LPDXUTCALLBACKMODIFYDEVICESETTINGS pCallbackModifyDeviceSettings = NULL
);
最基本的用法是全部使用~省参数调用Q?br />DXUTCreateDevice();
通过q样的调用框架用缺省设|创Z个在大多数情况下可用的设备。缺省的讄如下Q?br />

Direct3D Creation Flag Description Default Value from DXUTCreateDevice
AdapterFormat parameter of CheckDeviceFormat Adapter surface format. Desktop display mode, or D3DFMT_X8R8G8B8 if the desktop display mode is less than 32 bits.
Adapter parameter of IDirect3D9::CreateDevice Display adapter ordinal. D3DADAPTER_DEFAULT
D3DPRESENT_PARAMETERS. BackBufferCount Number of back buffers. 2, indicating triple buffering.
D3DPRESENT_PARAMETERS. BackBufferFormat Back buffer format. Desktop display mode, or D3DFMT_X8R8G8B8 if the desktop display mode is less than 32 bits.
D3DPRESENT_PARAMETERS. AutoDepthStencilFormat Depth format of the automatic depth-stencil surface that the device will create. D3DFMT_D16 if the backbuffer format is 16 bits or less, or D3DFMT_D32 otherwise.
The DeviceType parameter of IDirect3D9::CreateDevice Enumerated type of the device. D3DDEVTYPE_HAL if available, otherwise D3DDEVTYPE_REF or failure code if neither is available.
D3DPRESENT_PARAMETERS. MultiSampleQuality Quality level. MultiSampleQuality = 0, indicating multisampling is disabled.
D3DPRESENT_PARAMETERS. Flags Presentation parameters flags. D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
D3DPRESENT_PARAMETERS. PresentationInterval Presentation interval. D3DPRESENT_INTERVAL_IMMEDIATE for windowed mode, or D3DPRESENT_INTERVAL_DEFAULT for full-screen mode.
D3DPRESENT_PARAMETERS. FullScreen_RefreshRateInHz Rate at which the display adapter refreshes the screen. 0, indicating windowed mode.
D3DPRESENT_PARAMETERS. BackBufferWidth and .BackBufferHeight Display mode resolution. 640 x 480 pixels for windowed mode, or the desktop resolution for full-screen mode.
D3DPRESENT_PARAMETERS. AutoDepthStencilFormat Stencil format of the automatic depth-stencil surface that the device will create. D3DFMT_D16 if the backbuffer format is 16 bits or less, or D3DFMT_D32 otherwise.
D3DPRESENT_PARAMETERS. SwapEffect Swap effect. D3DSWAPEFFECT_DISCARD
BehaviorFlags parameter of IDirect3D9::CreateDevice Vertex processing flags. D3DCREATE_HARDWARE_VERTEXPROCESSING if supported, otherwise D3DCREATE_SOFTWARE_VERTEXPROCESSING.
D3DPRESENT_PARAMETERS. Windowed Windowed or full-screen mode. true, indicating windowed mode.
hFocusWindow parameter of CreateDevice Handle to the created window (see Using Application Windows with DXUT). hWndFocus parameter of DXUTSetWindow
D3DPRESENT_PARAMETERS. hDeviceWindow Handle to the device window. hWndDeviceFullScreen or hWndDeviceWindowed parameters of DXUTSetWindow
D3DPRESENT_PARAMETERS. EnableAutoDepthStencil Depth-stencil buffer creation flag. true.

应用E序可以通过参数传递给CreateDevice来更多的控制讑֤的创建,q将比用缺省的方式更好。例如,你可以通过nSuggestedWidth and nSuggestedHeight参数改变H口的尺寸?br />DXUTCreateDevice(
    D3DADAPTER_DEFAULT,
    false,
    1024,
    786,
    NULL,
    NULL,
    NULL
);
要得到更多的控制权,应用E序可以使用q两个可选的回调函数QLPDXUTCALLBACKISDEVICEACCEPTABLE and LPDXUTCALLBACKMODIFYDEVICESETTINGS.

选择最佳的讑֤讄
你可以用IsDeviceAcceptable回调函数帮助框架Z的应用程序选择最佳的讑֤讄Q就像下面的代码Q?br />bool CALLBACK IsDeviceAcceptable(
D3DCAPS9*     pCaps,
D3DFORMAT     AdapterFormat,
D3DFORMAT     BackBufferFormat,
bool          bWindowed,
void*         pUserContext )
{
    // TODO: return true for acceptable settings and false otherwise.
    return true;
}
q个回调函数的模型基于LPDXUTCALLBACKISDEVICEACCEPTABLE原型(This callback function is modeled on the prototype LPDXUTCALLBACKISDEVICEACCEPTABLE)Q框架ؓ每个唯一的以?个设|的有效l合调用q个函数一ơ:
D3DDEVTYPE DeviceType;
UINT       AdapterOrdinal;
D3DFORMAT  AdapterFormat;
D3DFORMAT  BackBufferFormat;
bool       Windowed;
注意适配器序号和讑֤cd没有直接的传入回调函敎ͼ而是分别作ؓD3DCAPS9l构体的成员?br />通过q个回调函数Q应用程序可以拒lQ何它不支持的或不惌的组合。例如,应用E序可以使用下面的代码拒l?6bits的后备缓冲区格式和所有至不能支持像素着色器PS_2_0的设备:
bool CALLBACK IsDeviceAcceptable(
    D3DCAPS9*     pCaps,
    D3DFORMAT     AdapterFormat,
    D3DFORMAT     BackBufferFormat,
    bool          bWindowed )
{
    if( pCaps->PixelShaderVersion < D3DPS_VERSION(2,0) )
     return false;
    if( BackBufferFormat == D3DFMT_X1R5G5B5 || BackBufferFormat == D3DFMT_R5G6B5 )
        return false;
    return true;
}

为每个唯一的组合调用回调函数后Q框架排列剩下的可用l合Qƈ选择它们当中最好的。排名较高的如下Q?br />D3DDEVTYPE_HALQ获取硬件加?br />如果应用E序以全屏模式显C,框架更趋向于使用匚w桌面格式的适配器格式,q样可以在全屏与H口之间快速切换。例外的是,如果桌面昄模式于32位,框架更趋向于D3DFMT_X8R8G8B8.
匚w适配器格式的后备~冲区格?br />在选择了这些排名高的组合后Q要创徏讑֤Q行为标志和呈现参数仍然是需要的。对于这些设|?Direct3D使用上面表中的缺省倹{?/p>

使用你自q讑֤
你没有必要依赖于框架来创建Direct3D讑֤。应用程序自己可以创备ƈ他传递给框架使用。就像应用程序可以覆盖框架的window creation 讄。简单的使用你想要的讄创徏一个设备,然后调用 DXUTSetDevice函数让框架在你的讑֤上渲染?br />注意Q如果应用程序创Z不依赖于框架的设备,那么应用E序也必dd@环执行完以后亲自的通过cleanup 释放讑֤接口?br />另请参阅
通过DXUT作更高的设备选择



李锦?mybios) 2006-11-22 11:35 发表评论
]]>
【{贴】C语言高效~程的几?/title><link>http://www.shnenglu.com/mybios/archive/2006/11/21/15514.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Tue, 21 Nov 2006 09:26:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/11/21/15514.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15514.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/21/15514.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15514.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15514.html</trackback:ping><description><![CDATA[引言Q?br />  ~写高效z的C语言代码Q是许多软g工程师追求的目标。本文就工作中的一些体会和l验做相关的阐述Q不对的地方请各位指教?br /><br />W?招:以空间换旉<br /><br />  计算机程序中最大的矛盾是空间和旉的矛盾,那么Q从q个角度出发逆向思维来考虑E序的效率问题,我们有了解决问题的W?招——以I间换时间?br />例如Q字W串的赋倹{?br />Ҏ(gu)AQ通常的办法:<br />#define LEN 32<br />char string1 [LEN];<br />memset (string1,0,LEN);<br />strcpy (string1,“This is a example!!”);<br />Ҏ(gu)BQ?br />const char string2[LEN] =“This is a example!?<br />char * cp;<br />cp = string2 ;<br />(使用的时候可以直接用指针来操作?<br /><br />  从上面的例子可以看出QA和B的效率是不能比的。在同样的存储空间下QB直接使用指针可以操作了Q而A需要调用两个字W函数才能完成。B的缺点在于灵zL没有A好。在需要频J更改一个字W串内容的时候,Ah更好的灵zL;如果采用Ҏ(gu)BQ则需要预存许多字W串Q虽然占用了大量的内存,但是获得了程序执行的高效率?br /><br />  如果pȝ的实时性要求很高,内存q有一些,那我推荐你用该招数?br /><br />  该招数的变招——用宏函数而不是函数。D例如下:<br />Ҏ(gu)CQ?br />#define bwMCDR2_ADDRESS 4<br />#define bsMCDR2_ADDRESS 17<br />int BIT_MASK(int __bf)<br />{<br />return ((1U << (bw ## __bf)) - 1) << (bs ## __bf);<br />}<br />void SET_BITS(int __dst, int __bf, int __val)<br />{<br />__dst = ((__dst) & ~(BIT_MASK(__bf))) | \<br />(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))<br />}<br /><br />SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);<br />Ҏ(gu)DQ?br />#define bwMCDR2_ADDRESS 4<br />#define bsMCDR2_ADDRESS 17<br />#define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)<br />#define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))<br />#define SET_BITS(__dst, __bf, __val) \<br />((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | \<br />(((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))<br /><br />SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);<br /><br />  函数和宏函数的区别就在于Q宏函数占用了大量的I间Q而函数占用了旉。大家要知道的是Q函数调用是要用系l的栈来保存数据的,如果~译器里有栈查选项Q一般在函数的头会嵌入一些汇~语句对当前栈进行检查;同时QCPU也要在函数调用时保存和恢复当前的现场Q进行压栈和Ҏ(gu)操作Q所以,函数调用需要一些CPU旉。而宏函数不存在这个问题。宏函数仅仅作ؓ预先写好的代码嵌入到当前E序Q不会生函数调用,所以仅仅是占用了空_在频J调用同一个宏函数的时候,该现象尤其突出?br /><br />  DҎ(gu)是我看到的最好的|位操作函数Q是ARM公司源码的一部分Q在短短的三行内实现了很多功能,几乎늛了所有的位操作功能。CҎ(gu)是其变体Q其中滋呌需大家仔细体会?br /><br />W?招:数学Ҏ(gu)解决问题<br /><br />  现在我们演绎高效C语言~写的第二招——采用数学方法来解决问题?br /><br />  数学是计机之母Q没有数学的依据和基Q就没有计算机的发展Q所以在~写E序的时候,采用一些数学方法会对程序的执行效率有数量的提高?br />举例如下Q求 1~100的和?br />Ҏ(gu)E<br />int I , j;<br />for (I = 1 ;I<=100; I ++Q{<br />j += I;<br />}<br />Ҏ(gu)F<br />int I;<br />I = (100 * (1+100)) / 2<br /><br />  q个例子是我印象最q一个数学用例,是我的计机启蒙老师考我的。当时我只有学三年U,可惜我当时不知道用公?N×QN+1Q? 2 来解册个问题。方法E循环?00ơ才解决问题Q也是说最用?00个赋|100个判断,200个加法(I和jQ;而方法F仅仅用了1个加法,1 ơ乘法,1ơ除法。效果自然不a而喻。所以,现在我在~程序的时候,更多的是动脑{找规律Q最大限度地发挥数学的威力来提高E序q行的效率?br /><br />W?招:使用位操?br /><br />  实现高效的C语言~写的第三招——用位操作Q减除法和取模的运?br /><br />  在计机E序中,数据的位是可以操作的最数据单位,理论上可以用“位q算”来完成所有的q算和操作。一般的位操作是用来控制g的,或者做数据变换使用Q但是,灉|的位操作可以有效地提高程序运行的效率。D例如下:<br />Ҏ(gu)G<br />int I,J;<br />I = 257 /8;<br />J = 456 % 32;<br />Ҏ(gu)H<br />int I,J;<br />I = 257 >>3;<br />J = 456 - (456 >> 4 << 4);<br /><br />  在字面上好像H比Gȝ了好多,但是Q仔l查看生的汇编代码׃明白Q方法G调用了基本的取模函数和除法函敎ͼ既有函数调用Q还有很多汇~代码和寄存器参与运;而方法H则仅仅是几句相关的汇~,代码更简z,效率更高。当Ӟ׃~译器的不同Q可能效率的差距不大Q但是,以我目前遇到的MS C ,ARM C 来看Q效率的差距q是不小。相x~代码就不在q里列D了?br />q用q招需要注意的是,因ؓCPU的不同而生的问题。比如说Q在PC上用q招~写的程序,q在PC上调试通过Q在ULC?6位机q_上的时候,可能会生代码隐(zhn)。所以只有在一定技术进阶的基础下才可以使用q招?br /><br />W?招:汇编嵌入<br /><br />  高效C语言~程的必杀技Q第四招——嵌入汇~?br /><br />  “在熟?zhn)汇编语言的h眼里QC语言~写的程序都是垃䏀。这U说法虽然偏Ȁ了一些,但是却有它的道理。汇~语a是效率最高的计算aQ但是,不可能靠着它来写一个操作系l吧?所以,Z获得E序的高效率Q我们只好采用变通的Ҏ(gu) ——嵌入汇~,混合~程?br /><br />  举例如下Q将数组一赋值给数组?要求每一字节都相W?br />char string1[1024],string2[1024];<br />Ҏ(gu)I<br />int I;<br />for (I =0 ;I<1024;I++)<br />*(string2 + I) = *(string1 + I)<br />Ҏ(gu)J<br />#ifdef _PC_<br />int I;<br />for (I =0 ;I<1024;I++)<br />*(string2 + I) = *(string1 + I);<br />#else<br />#ifdef _ARM_<br />__asm<br />{<br />MOV R0,string1<br />MOV R1,string2<br />MOV R2,#0<br />loop:<br />LDMIA R0!, [R3-R11]<br />STMIA R1!, [R3-R11]<br />ADD R2,R2,#8<br />CMP R2, #400<br />BNE loop<br />}<br />#endif<br /><br />  Ҏ(gu)I是最常见的方法,使用?024ơ@环;Ҏ(gu)J则根据^C同做了区分,在ARMq_下,用嵌入汇~仅?28ơ@环就完成了同L操作。这里有朋友会说Qؓ什么不用标准的内存拯函数?q是因ؓ在源数据里可能含有数据ؓ0的字节,q样的话Q标准库函数会提前结束而不会完成我们要求的操作。这个例E典型应用于LCD数据的拷贝过E。根据不同的CPUQ熟l用相应的嵌入汇编Q可以大大提高程序执行的效率?br /><br />  虽然是必杀技Q但是如果轻易用会付出惨重的代仗这是因为,使用了嵌入汇~,侉K制了E序的可UL性,使程序在不同q_UL的过E中Q卧虎藏龙,险象环生Q同时该招数也与C软g工程的思想相违背,只有在迫不得已的情况下才可以采用。切讎ͼ切记?<br /><br /><img src ="http://www.shnenglu.com/mybios/aggbug/15514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-21 17:26 <a href="http://www.shnenglu.com/mybios/archive/2006/11/21/15514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{贴】直接蝲入内存中的DLLhttp://www.shnenglu.com/mybios/archive/2006/11/21/15483.html李锦?mybios)李锦?mybios)Mon, 20 Nov 2006 16:45:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/21/15483.htmlhttp://www.shnenglu.com/mybios/comments/15483.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/21/15483.html#Feedback6http://www.shnenglu.com/mybios/comments/commentRss/15483.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15483.htmlL?/a>

下蝲源代?/a>

前言

  你可能不希望在发布程序时附带上一个外部的 DLLQ因为可能会有些用户在无意中?DLL 删除了而造成 EXE 不能正确q行Q也有可能该 DLL 会被别h拿去使用Q也有可能,?DLL 会成为破解者破解你的程序的H破口。无论出于何U原因,如果你想把一?DLL 合ƈC?EXE 中的话,本文向你介绍q种Ҏ(gu)?


Win32 E序调用 DLL 的机?/strong>

   Win32 EXE 在调用一个外?DLL 中的函数Ӟ首先要调?LoadLibary 函数来蝲入此 DLL 到程序的q程地址I间?如果 LoadLibary 载入?DLL 成功Q将q回一个该 DLL 的句柄?q个句柄实际上就是该 DLL 在内存中的v始地址?在蝲?DLL 成功后,q必调?GetProcAddress 函数来获取要调用的函数的地址。然后再Ҏ(gu)该地址来调用这个函数?br />Ҏ(gu)上述原理Q我们可以把一?DLL 作ؓ资源文g攑ֈ EXE 文g中,在程序运行时Q分配一块内存,然后此资源复制到该分配的内存中QƈҎ(gu)该内存地址计算得到相关的导出函数地址Q然后,当我们需要调用某一函数Ӟ可以用该函数在内存中的地址来调用它?
E序实现?br />  首先Q把要合q的 DLL 作ؓ资源加入到项目的资源文g中,然后在程序运行时Q从资源中蝲入该资源Q以得到?DLL 在内存中的位|:
LPVOID sRawDll; // 资源文g在内存中的地址 
HRSRC hRes; 
HMODULE hLibrary; 
HGLOBAL hResourceLoaded; 
char lib_name[MAX_PATH]; 
GetModuleFileName(hInstance, lib_name, MAX_PATH ); // 得到q行E序的名?
hLibrary = LoadLibrary(lib_name);                  // p载入一?DLL 一栯入运行程序到内存?

if (NULL != hLibrary) 
{
	// 得到指定的资源文件在内存中的位置 
	hRes = FindResource(hLibrary, MAKEINTRESOURCE(IDR_DATA1), RT_RCDATA); 
	if (NULL != hRes) 
	{
		// 资源文件蝲入内?
		hResourceLoaded = LoadResource(hLibrary, hRes); 
		if (NULL != hResourceLoaded) 
		{
			// 得到资源文g大小 
			SizeofResource(hLibrary, hRes); 

			// 锁定资源以得到它在内存中的地址 
			sRawDll = (LPVOID)LockResource(hResourceLoaded); 
		}
	}
	else return 1; 
	FreeLibrary(hLibrary);
}
else return 1; 
然后Q从资源中蝲?DLL 到内存函?LoadPbDllFromMemory 蝲?DLL 到内存中Q?该函数有两个参数Q第一个参数是指向 DLL 资源在内存中的地址的指针,也就是前面代码中?LockResource 函数的返回倹{第二个参数是一个空的指针,如果函数 LoadPbDllFromMemory q行成功Q该指针指向重新组合后的内存中?DLL 的v始地址。该函数q有一个功能就是如果运行成功,它将手动地用 DLL_PROCESS_ATTACH 参数调用 DLL 的入口函?DllMain 来初始化?DLL。除此之外,它还会手动地载入合ƈ?DLL 的入口表中导入的 DLL q调整它们在内存中的相对地址。以下是该函C?
DWORD LoadPbDllFromMemory(LPVOID lpRawDll, LPVOID lpImageDll) 
{
	SYSTEM_INFO sSysInfo; 
	PIMAGE_DOS_HEADER dosHeader; 
	PIMAGE_NT_HEADERS pNTHeader; 
	PIMAGE_SECTION_HEADER section; 
	PIMAGE_IMPORT_DESCRIPTOR pImportDesc; 
	PIMAGE_IMPORT_BY_NAME pOrdinalName; 
	PIMAGE_BASE_RELOCATION baseReloc; 
	PDWORD lpLink; 
	unsigned char Protection[4096]; 
	HINSTANCE hDll; 
	WORD i; 
	DWORD ImagePages,fOldProtect,j,MaxLen,HdrLen,Addr1,Addr2,Pg,Pg1,Pg2; 
	char * sDllName; 

	if(NULL == lpRawDll) return 1 ; 

	dosHeader = (PIMAGE_DOS_HEADER)lpRawDll; 

	// Is this the MZ header? 
	if ((TRUE == IsBadReadPtr(dosHeader,sizeof (IMAGE_DOS_HEADER))) ||
				 (IMAGE_DOS_SIGNATURE != dosHeader->e_magic)) 
		return 2; 

	// Get the PE header. 
	pNTHeader = MakePtr(PIMAGE_NT_HEADERS,dosHeader,dosHeader->e_lfanew); 

	// Is this a real PE image? 
	if((TRUE == IsBadReadPtr(pNTHeader,sizeof ( IMAGE_NT_HEADERS))) || 
				( IMAGE_NT_SIGNATURE != pNTHeader->Signature)) 
		return 3 ; 

	if(( pNTHeader->FileHeader.SizeOfOptionalHeader != 
			sizeof(pNTHeader->OptionalHeader)) || 
		(pNTHeader->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)) 
		return 4; 

	if (pNTHeader->FileHeader.NumberOfSections < 1) return 5; 

	section = IMAGE_FIRST_SECTION( pNTHeader ); 
	int HeaderSize = sizeof(IMAGE_SECTION_HEADER); 

	// 节头长度 
	HdrLen = (DWORD)section - (DWORD)dosHeader + 
			HeaderSize * pNTHeader->FileHeader.NumberOfSections; 

	// 扑և最大的节的长度,此节一般是代码所在的?.text ? 
	MaxLen = HdrLen; 
	int ii=0; 

	for (i = 0;i<(DWORD)pNTHeader->FileHeader.NumberOfSections;i++)// find MaxLen 
	{
		if(MaxLen < section[i].VirtualAddress + section[i].SizeOfRawData) 
		{
			MaxLen = section[i].VirtualAddress + section[i].SizeOfRawData; 
		}
		if(strcmp((const char *)section[i].Name,".rsrc") == 0) ii=i; 
	}

	GetSystemInfo(&sSysInfo);
	ImagePages = MaxLen / sSysInfo.dwPageSize; 
	if (MaxLen % sSysInfo.dwPageSize) ImagePages++; 

	// 分配所需的内?
	DWORD NeededMemory = ImagePages * sSysInfo.dwPageSize; 
	lpImageDll = VirtualAlloc(NULL, NeededMemory, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 

	if (lpImageDll == NULL) return 6; // 分配内存p| 

	MoveMemory( lpImageDll, lpRawDll, HdrLen ); // 复制节头 

	DWORD OrgAddr = 0; 
	DWORD NewAddr = 0; 
	DWORD Size = 0; 

	// 复制 .text 节数?
	for (i = 0;i<pNTHeader->FileHeader.NumberOfSections;i++) 
	{
		OrgAddr = (DWORD)lpImageDll + (DWORD)section[i].VirtualAddress; 
		NewAddr = (DWORD)lpRawDll + (DWORD)section[i].PointerToRawData; 
		Size = (DWORD)section[i].SizeOfRawData; 
		MoveMemory((void *)OrgAddr, (void *)NewAddr, Size ); 
	}

	// 把指针指向新?DLL 映像 
	dosHeader = (PIMAGE_DOS_HEADER) lpImageDll; // Switch to new image 
	pNTHeader = (PIMAGE_NT_HEADERS) ((DWORD)dosHeader + dosHeader->e_lfanew); 
	section = (PIMAGE_SECTION_HEADER) ((DWORD)pNTHeader + sizeof(IMAGE_NT_HEADERS)); 
	pImageBase = (PBYTE)dosHeader; 

	if((ii!=0) && (IsNT()==TRUE)) 
	{
		section[ii].VirtualAddress = section[ii].VirtualAddress + (DWORD)lpRawDll; 
		section[ii].PointerToRawData = section[ii].PointerToRawData + (DWORD)lpRawDll; 
	}

	DWORD importsStartRVA; 

	// Look up where the imports section is (normally in the .idata section) 
	// but not necessarily so. Therefore, grab the RVA from the data dir. 
	importsStartRVA = GetImgDirEntryRVA(pNTHeader,IMAGE_DIRECTORY_ENTRY_IMPORT); 
	if ( !importsStartRVA ) 
	{
		VirtualFree(dosHeader,0, MEM_RELEASE); 
		return 7; 
	}

	pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) pNTHeader->
		OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; 

	if(pImportDesc!= 0) 
		pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ((DWORD)pImportDesc + (DWORD)dosHeader); 
	else 
	{
		VirtualFree(dosHeader,0, MEM_RELEASE); 
		return 8; 
	}

	while (1) // 处理各入口表中的 DLL 
	{
		// 查是否遇CI的 IMAGE_IMPORT_DESCRIPTOR 
		if ((pImportDesc->TimeDateStamp==0 ) && (pImportDesc->Name==0)) break; 

		// 从磁盘蝲入必ȝ Dll, 
		// 注意,载入?DLL 是合q的 DLL 的入口表中的 DLL, 
		// 不是合ƈ?EXE 中的 DLL 
		sDllName = (char *) (pImportDesc->Name + (DWORD)pImageBase); 
		hDll = GetModuleHandle(sDllName); 

		if (hDll == 0 ) hDll = LoadLibrary(sDllName); 

		if (hDll == 0 ) 
		{
			MessageBox(NULL, "Can''t find required Dll",
					"Error in LoadPbDllFromMemory()",0); 
			VirtualFree(dosHeader,0, MEM_RELEASE); 
			return 9; 
		}

		DWORD *lpFuncNameRef = (DWORD *) (pImportDesc->OriginalFirstThunk +
								 (DWORD)dosHeader); 
		DWORD *lpFuncAddr = (DWORD *) (pImportDesc->FirstThunk +
								 (DWORD)dosHeader); 

		while( *lpFuncNameRef != 0) 
		{
			pOrdinalName = (PIMAGE_IMPORT_BY_NAME) (*lpFuncNameRef +
						 (DWORD)dosHeader); 
			DWORD pIMAGE_ORDINAL_FLAG = 0x80000000; 

			if (*lpFuncNameRef & pIMAGE_ORDINAL_FLAG) 
				*lpFuncAddr = (DWORD) GetProcAddress(hDll,
					 (const char *)(*lpFuncNameRef & 0xFFFF)); 
			else
				*lpFuncAddr = (DWORD) GetProcAddress(hDll,
						 (const char *)pOrdinalName->Name); 

			if (lpFuncAddr == 0) 
			{
				VirtualFree(dosHeader,0, MEM_RELEASE); 
				return 10;// Can''t GetProcAddress 
			}

			lpFuncAddr++;
			lpFuncNameRef++;
		}
		pImportDesc++;
	}

	DWORD TpOffset; 
	baseReloc = (PIMAGE_BASE_RELOCATION)((DWORD)pNTHeader->
     OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress); 

	if (baseReloc !=0) 
	{
		baseReloc = (PIMAGE_BASE_RELOCATION) ((DWORD)baseReloc + (DWORD)dosHeader); 
		while(baseReloc->VirtualAddress != 0) 
		{
			PWORD lpTypeOffset = (PWORD) ((DWORD)baseReloc +
					 sizeof(IMAGE_BASE_RELOCATION)); 
			while (lpTypeOffset < (PWORD)((DWORD)baseReloc +
						 (DWORD)baseReloc->SizeOfBlock)) 
			{
				TpOffset = *lpTypeOffset & 0xF000; 
				if(TpOffset == 0x3000) 
				{
					lpLink = (PDWORD) ((DWORD)dosHeader +
                                   baseReloc->VirtualAddress +
                                                      (*lpTypeOffset & 0xFFF)); 
					*lpLink = (DWORD)dosHeader + 
                                            (*lpLink) - pNTHeader->OptionalHeader.ImageBase; 
				}
				else
				{
					if (TpOffset != 0) 
					{
						VirtualFree(dosHeader,0, MEM_RELEASE); 
						return 10; 
					}
				}
				lpTypeOffset++;
			}
			baseReloc = (PIMAGE_BASE_RELOCATION)((DWORD)baseReloc + 
				(DWORD)baseReloc->SizeOfBlock); 
		}
	}

	// 取得原始的内存状?
	memset(Protection,0,4096);
	for (i = 0;i<=pNTHeader->FileHeader.NumberOfSections;i++) 
	{
		if (i == pNTHeader->FileHeader.NumberOfSections) 
		{
			Addr1 = 0; 
			Addr2 = HdrLen; 
			j = 0x60000000; 
		}
		else
		{
			Addr1 = section[i].VirtualAddress; 
			Addr2 = section[i].SizeOfRawData; 
			j = section[i].Characteristics; 
		}
		Addr2 += Addr1 - 1; 

		Pg1 = Addr1 / sSysInfo.dwPageSize; 
		Pg2 = Addr2 / sSysInfo.dwPageSize; 
		for(Pg = Pg1 ;Pg<=Pg2;Pg++) 
		{
			if (j & 0x20000000) Protection[Pg] |= 1; // Execute 
			if (j & 0x40000000) Protection[Pg] |= 2; // Read 
			if (j & 0x80000000) Protection[Pg] |= 4; // Write 
		}
	}

	// 恢复原始的内存状?
	Addr1 = (DWORD)dosHeader; 
	for (Pg = 0 ;Pg<= ImagePages;Pg++) 
	{
		switch(Protection[Pg])
		{
		case 2: 
			fOldProtect = PAGE_READONLY; 
			break;
		case 3: 
			fOldProtect = PAGE_EXECUTE_READ; 
			break;
		case 6: 
			fOldProtect = PAGE_READWRITE; 
			break;
		default: 
			// Ignore strange combinations
			fOldProtect = PAGE_EXECUTE_READWRITE;  
			break;
		}

		if (fOldProtect !=PAGE_EXECUTE_READWRITE) 
		{
			if (VirtualProtect((void *)Addr1, 
				sSysInfo.dwPageSize, 
				fOldProtect,
				&fOldProtect) == 0) 
			{
				VirtualFree(dosHeader,0, MEM_RELEASE); 
				return 11; 
			}
		}
		Addr1 += sSysInfo.dwPageSize; 
	}

	EntryPoint = (LPENTRYPOINT) ((DWORD)pNTHeader->OptionalHeader.AddressOfEntryPoint +
				 (DWORD)dosHeader); 
	LPVOID lpReserved = 0; 
	EntryPoint((HINSTANCE)dosHeader, DLL_PROCESS_ATTACH, lpReserved); 
	lpImageDll2=lpImageDll;
	return 0; 
}
  一?DLL 被正地载入到内存中Q我们就可以通过自定义函?GetProcAddressDirectly 来获取某函数在内存中的地址QƈҎ(gu)该地址来调用该函数Q该函数也有两个参数Q第一个参数是指向载入到内存中?DLL 的v始地址的指针,W二个是要调用的函数的函数名。以下是 GetProcAddressDirectly 函数代码:
DWORD GetProcAddressDirectly(PIMAGE_DOS_HEADER dosHeader, char * FuncName)  
{ 
	PIMAGE_NT_HEADERS pNTHeader;  
	PIMAGE_EXPORT_DIRECTORY pExportDir;  
	PWORD lpNameOrdinals;  
	LPDWORD lpFunctions;  
	DWORD * lpName;  
	char * lpExpFuncName;  
	DWORD i;  
	DWORD j;  
	char * lpFuncName;  

	if(dosHeader->e_magic != IMAGE_DOS_SIGNATURE) return 0;  

	pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)dosHeader + dosHeader->e_lfanew);  

	if (pNTHeader->Signature != IMAGE_NT_SIGNATURE) return 0;  

	if ((pNTHeader->FileHeader.SizeOfOptionalHeader != sizeof(pNTHeader->OptionalHeader)) ||  
		(pNTHeader->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC))  
		return 0;  

	DWORD exportsStartRVA, exportsEndRVA;  
	pImageBase = (PBYTE)dosHeader;  

	// Make pointers to 32 and 64 bit versions of the header.  
	pNTHeader = MakePtr( PIMAGE_NT_HEADERS, dosHeader,dosHeader->e_lfanew );  

	exportsStartRVA = GetImgDirEntryRVA(pNTHeader,IMAGE_DIRECTORY_ENTRY_EXPORT);  
	exportsEndRVA = exportsStartRVA +  
		GetImgDirEntrySize(pNTHeader, IMAGE_DIRECTORY_ENTRY_EXPORT);  

	// Get the IMAGE_SECTION_HEADER that contains the exports. This is  
	// usually the .edata section, but doesn''t have to be.  
	PIMAGE_SECTION_HEADER header;  
	header = GetEnclosingSectionHeader( exportsStartRVA, pNTHeader );  
	if ( !header ) return 0;  

	INT delta;  
	delta = (INT)(header->VirtualAddress - header->PointerToRawData);  
	pExportDir = (PIMAGE_EXPORT_DIRECTORY)GetPtrFromRVA(exportsStartRVA, 
				pNTHeader, pImageBase);  


	pExportDir =(PIMAGE_EXPORT_DIRECTORY) (pNTHeader->
	OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);  

	if (pExportDir == 0)  
	{ 
		MessageBox(NULL,"Error in GetProcAddressDirectly()",0,0);  
		return 0;  
	} 

	pExportDir =(PIMAGE_EXPORT_DIRECTORY) ((DWORD)pExportDir + (DWORD)dosHeader);  
	lpNameOrdinals =(PWORD)((DWORD)pExportDir->AddressOfNameOrdinals + (DWORD)dosHeader);  
	lpName =(LPDWORD) (pExportDir->AddressOfNames + (DWORD)dosHeader);  
	lpFunctions =(LPDWORD) (pExportDir->AddressOfFunctions + (DWORD)dosHeader);  
	lpFuncName = FuncName;  

	if(HIWORD(lpFuncName)!=0 )  
	{ 
		for( i = 0;i<=pExportDir->NumberOfFunctions - 1;i++)  
		{ 
			DWORD entryPointRVA = *lpFunctions;  

			// Skip over gaps in exported function  
			if ( entryPointRVA == 0 ) continue; 
			for( j = 0;j<=pExportDir->NumberOfNames-1;j++)  
			{ 
				if( lpNameOrdinals[j] == i)  
				{ 
					lpExpFuncName = (char *) (lpName[j] + 
							(DWORD)dosHeader);  
					if(strcmp((char *)lpExpFuncName,(char *)FuncName)==0)  
						return (DWORD) (lpFunctions[i] + 
								(DWORD)dosHeader);  
				} 
			} 
		} 
	} 
	else 
	{ 
		for (i = 0 ;i<=pExportDir->NumberOfFunctions - 1;i++)  
		{ 
			if (lpFuncName == (char *)(pExportDir->Base + i))  
			{ 
				if (lpFunctions[i]) return (unsigned long) (lpFunctions[i] + 
							dosHeader);  
			} 
		} 
	} 
	return 0;  
}


在调用完函数后,不要忘记?UnloadPbDllFromMemory 来从内存中移?DLL 以释攑ֈ配的内存Q该函数q会?DLL_PROCESS_DETACH 参数调用 DLL 的入口函?DllMain 来从调用q程的地址I间卸蝲?DLL?以下?UnloadPbDllFromMemory 函数代码:
DWORD UnloadPbDllFromMemory(PIMAGE_DOS_HEADER dosHeader) 
{
	PIMAGE_NT_HEADERS pNTHeader; 
	pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)dosHeader + (DWORD)dosHeader->e_lfanew); 
	EntryPoint = (LPENTRYPOINT)(pNTHeader->OptionalHeader.AddressOfEntryPoint +
					 (DWORD)dosHeader); 
	EntryPoint((HINSTANCE)dosHeader, DLL_PROCESS_DETACH, 0); 
	return VirtualFree(dosHeader, 0, MEM_RELEASE); 
}


关于CZ代码的说?/strong>

  在本文附带的CZ代码中,合ƈ了一个名?hardware.dll 的动态连接库Q该动态连接库是一个获取系l硬件信息的库文Ӟ其中包括了以下函?

   getmac 		取得|卡 MAC 
   VolumeNumber 	取得盘h 
   changeres            改变屏幕分辩?
   IsDiskInDrive        查Y׃是否插有?nbsp;
   DPGetDefaultPrinter  取得默认的打印机?
   DPSetDefaultPrinter  讄默认的打印机 
   getserial            取得盘的出厂序列号 
   getmetric            取得昄分辩?
   PrintStringDirect    直接向打印机发送一个串 
   vfpbeep              ?PC 喇叭发声 
   getcpuid             取得 CPU ID 
   getbios              取得L BIOS ID 
  在示例代码中Q只调用了其中一个函?getbios 来获取主?BIOS IDQ?q里说明一下,该函数实际上好象只能?AWARD L?BIOSQ?也就是说它是d的是pȝ内存 0x000fex71 处的倹{因为其它牌子的L BIOS 的位|稍有不同,但在E序中没有进行这斚w的处理,所以在d它牌子的L BIOS 时可能会有些问题(d的内容可能不正确)。关于此 DLL 的内容和实现Q也许我会在另一文章中论及?
 

局?br />  在我q行试Ӟ发现对于有些含有资源?DLLQ在 9x q_下可能会有问题?br />

题外?br />  另外Q其它一些本文未提及的非主要的函敎ͼ误行参见源代码中的注释?br />再,本文涉及 PE 文g格式斚w的知识,它们已经出了本文的范围Q具体信息可参见 MSDM 中的:

  • Peering Inside the PE: A Tour of the Win32 Portable Executable File Format 一文和
  • Microsoft Portable Executable and Common Object File Format Specification 一?
  • 特别感谢卢春明(AmingQ在我编写本文时所作的一些技术方面的和指?/strong>


    如果本文对你的开发有所帮助Qƈ且你手头恰好有零钱?/p>

    不如打赏我一杯咖啡,鼓励我l分享优U的文章?br />





    李锦?mybios) 2006-11-21 00:45 发表评论
    ]]>
    【{贴】EffectFrameworkhttp://www.shnenglu.com/mybios/archive/2006/11/20/15464.html李锦?mybios)李锦?mybios)Mon, 20 Nov 2006 08:54:00 GMThttp://www.shnenglu.com/mybios/archive/2006/11/20/15464.htmlhttp://www.shnenglu.com/mybios/comments/15464.htmlhttp://www.shnenglu.com/mybios/archive/2006/11/20/15464.html#Feedback0http://www.shnenglu.com/mybios/comments/commentRss/15464.htmlhttp://www.shnenglu.com/mybios/services/trackbacks/15464.html Effect Framework

    摘要

    本文要介l了在DirectX 9 SDK中提供的Effect Framework支持Q以及DirectX FX文gl构和Microsoft Hight Level Shading Language的基本知识。本文假定读者对DirectX Graphics有一定了解,q正在学习DirectX Effect Framework。希望能够与各位读者共同探讨、切?

    ?

    Effect的v?

    在计机3l场景中Q物体表面的材质代表了其光学Ҏ(gu)。最单的材质可以表现为Diffuse颜色QSpecular颜色QEmissive颜色{信息的集合Q而ؓ了表现物体表面的l节Q可?在材质中加入一张纹理——这些就构成了最基本的材质信息。在以前的Direct3DE序中,q些信息可以直接传送给讑֤Q由讑֤自动Ҏ(gu)它们来计物体表面的光学效果。但是, 仅仅有这些基本的材质信息Q已l不以满游戏制作者的要求和游戏玩家的要求了——他们希望场景中的材质更加复杂,h更多的细节,更加逼真?

    在Direct3D中,除了材质的概念,q存在一个渲染状态(Render StateQ的概念。在Direct3D Device中存在很多的渲染状态,它们可以在Direct3Dq行渲染时控制渲染的程和效 果,从而实现某些带有特效的材质。程序员可以通过IDirect3DDevice*::SetRenderState()Ҏ(gu)来设|这些状态。所有的渲染状态都是一些特定的数倹{对状态的讄可以通过?~码完成Q即在程序中调用SetRenderState()Ҏ(gu)Q将讄什么样的状态“写歠Z在E序里,但是q样做的~点是太不灉|了——如果想要实CU新的渲染状态,需要修?E序代码。所以更好的一U方法是ؓ了实现某一U特效材质的一些渲染状态D录到一个“效果文件”中Q通过在程序运行时d该文Ӟ从中分析些|q将它们作ؓ?数调用SetRenderState()。这P要想实现一U新的特效,只需修改“效果文件”而不用更改代码?

    Direct3D SDK是通过Effect Framework来支持这U机制的。而前面所q的“效果文件”在Direct3D中是?.fx文g存在的。在fx文g中保存了为实现某一Ҏ(gu)的渲染状态,包括状态名 U和它们的对应倹{所以在9.0以前版本的DirectX中就已经有Effect Framework和FX文g了,早期的Effect Framework仅仅是ؓ了实现对渲染状态进行控制?但是随着计算机显C硬件技术的发展Q图形处理单元(GPUQ正在重复CPU所走过的\——新一代的GPU已经h了可~程Ҏ(gu),E序员可以通过对GPU~写一D늨序来控制其渲染的 输出效果。这U程序一般称为ShaderE序。目前的ShaderE序分成两种QVertex Shader和Pixel Shader。Vertex Shader主要用于?l网格模型的每一个顶点进行处理,而Pixel Shader主要用于对要l制到屏q上的每一个象素进行处理。通过ShaderQ程序员可以制作出相当丰富的实时渲染效果?/font>

    同CPU一P对GPU~程也是借助一定的~程语言来进行的? 在DirectX 8中,对GPU的编E是通过一U类g汇编的语aq行的。而在DirectX 9中,使用了一U类gC语言的高U语a——Microsoft High Level Shading Language (HLSL) ?/font>

    无论使用什么语a对GPU~程Q都需要把~译好的ShaderE序输送到昑֍厅RDirect3D Device可以通过SetVertexShader()和SetPixelShader()来向昑֍输送ShaderE序。然而,?于Shader和材质具有十分紧密的关系——一般来_一个Shader是Z实现一U特D的材质——最好是能够ShaderE序与材质进行整合?所以,在DirectX 8和DirectX 9中,原来的Effect Framework发生了扩充——在原来的基上加入了对ShaderE序的支持。程序员可以把Vertex Shader和Pixel ShaderE序以函?的方式直接书写在FX文g中?/font>

     .FX文g

    FX文g中的内容大致可以分成几部分:

    • 预编译标?
    • 变量?
    • l构定义
    • 函数
    • Technique

    预编译标志:预编译标志包?

    • #define
    • #elif
    • #else
    • #endif
    • #error
    • #if
    • #ifdef
    • #ifndef
    • #include
    • #line
    • #pragma
    • #undef

    其中最常用到的?include?defineQ同C语言中的意义很相|?include可以在一个FX文g中引入另外一个或多个文g?define可以定义FX文g中的宏替换。例如:

    #include "helper_Funcs.fx"      //引入一个名为helper_funcs.fx的fx文g
    #include "public_variables.fh" //引入一个名为public_variables.fh的文?/span>
    #define MATRICES_COUNT 25      //定义宏MATRICES_COUNT?5
    #define VSHADER VShader_2_0    //定义宏VSHADER为VShader_2_0

    #include带来的好处和C中也是一LQ?zhn)可以在一个头文g中定义一些公有变量、函数等Q在其他文g中引用它们-׃用写很多遍了。例如:

    文gpublic.fh:

    mat4x4 matWorldViewProj; // 4x4世界Q视Q投影变换矩?/span>
    float3 lightPosisiton;   // 三维光源位置向量
    float4 lightColor;       // 光源的颜?/span>
    float time;              // 当前旉

    //定义一个名为VS_OUTPUT的结构。关于结构体定义Q下文中会有介绍

    struct VS_INPUT
    {
        float4 LocalPos : POSITION;
        float3 Normal : NORMAL;
        float4 Color : COLOR; 
        float2 Texcoord : TEXCOORD0;
    };

    struct VS_OUTPUT
    {
        float4 WorldPos : POSITION;
        float4 Color : COLOR;
        float2 Texcoord : TEXCOORD0;
    };

    //定义一个名为CaculateWorldPosition的函数。关于函数定义,下文中会有介l?

    float3 CaculateWorldPosition( float4 LocalPos )
    {
        return mul( LocalPos, matWorldViewProj);
    }

    q样Q当我们在另外一个文件中includeq个头文件时Q上面所有的定义都可以直接用了?

    文gclient.fx:

    #include "public.fh"


    VS_OUTPUT VS_main( VS_INPUT In ) // 可以直接使用l构体定义VS_OUTPUT和VS_INPUT
    {
        VS_OUTPUT Out = 0;
        Out.WorldPos = CaculateWorldPosition( In.LocalPos ); // 可以直接使用函数
        Out.Color = In.Color;
        Out.Texcoord = In.Texcoord;
    }

     

    q样不仅可以复用代码Q还可以使变量名、结构体、函数名的定义统一?

    ?define不仅仅可以某些帔Rh比较有意义的名称Q通过?ifdefQ?ifndef, #else, #endif{结合用,q可以用来根据一些配|控制编译过E?

    变量?/p>

    每个FX文g都可以有若干参数变量Q通过Effect Framework可以在程序中识别些参数的cd、名U和用途,q样可以将E序中的一些参数输送到Effect中去Q从而更加灵z?的控制效果。参数的cd很多Q可以是int, float, matrix, texture{等。例如:

    matrix matWorld;    //定义一个名为matWorld的矩늱型参数变?/span>
    float time;         //定义一个名为time的Q点类型参数变?
    texture texDiffuse; //定义一个名为texDiffuse的纹理类型参数变?/span>

     

    另外Q每个变量还有前~修饰W、Semantic、Annotation{,限于幅Q在q里不再赘述Q具体的介绍请参考DirectX C++帮助文档的DirectX Graphics > Reference > HLSL Shader Reference > Variable Declaration Syntax条目?

    l构定义

    在FX文g中可以定义结构体Q这些结构体一般用于Shader函数的参数和q回倹{结构体的定义与C语言方式及其cMQ例如:

    struct VS_OUTPUT //l构名称
    {
        float4 Pos : POSITION; //成员变量?/span>
        float4 Color : COLOR;
        float2 Texcoord : TEXCOORD0;
    };

     

    上面每个成员变量后面的标识符是该变量的semanticQHLSL~译器根据这个标识符来确定该变量的用处。不一定非得是l构体成员变量才有semanticQ一般来说Shader的输入输出参数变量都可以有semantic?/p>

    函数

    函数部分是在Effect Framework加入了对Vertex Shader和Pixel Shader的扩充后才加入到FX文g中的。FX文g中的函数的内容可以用汇编形式书写Q也可以用HLSL~写。目前一?都是使用HLSL。用q种语言书写的函CC语言函数十分cMQ可以说Q只要学qC语言Q书写Shader函数qԒl有余了。在同一个fx文g中可以定义很多函敎ͼ在函C也可以互 相调用,但是最lShaderE序的入口将在fx文g的Technique部分中指定。对于哪个函数是Vertex shader函数Q哪个是Pixel shader函数Q也是在Technique中指定的。关于TechniqueQ将在下文中介绍?例子Q?

    float4 CalcDiffuseColor( float3 Normal )
    {
        float4 Color; ...//用于实现该函数功能的多条语句
        return Color;
    }

    VS_OUTPUT Vertex_Shader( float4 InPos : POSITION,
                             float3 InNor : NORMAL, 
                             float3 InTexcoord : TEXCOORD )
    {
        VS_OUTPUT Out; ...//用于实现该函数功能的多条语句
        Out.Color = CalcDiffuseColor(InNor); //函数调用
        return Out;
    }

     

    正如上文中所_ShaderE序分ؓ两种QVertex shader和Pixel shader。在fx函数中就有两U相应的函数QVertex shader函数和Pixel Shader函数。Vertex shader函数的输入参数是|格模型中的每一个顶Ҏ(gu)据,其输出是l过该函数特D处理的点数据Q而Pixel Shader函数的输入,则是l过g光栅化过E后l过插值的Vertex shader输出l果。至于Pixel shader的输出,一般就是经q该函数计算得到的一个颜色|卌d后备~冲中一个象素上的颜色倹{但是这个“颜色值”有时ƈ不一定代表颜艌Ӏ而且对于支持多RenderTarget的硬ӞPixel shaderq可以有多个输出Q分别对应不同的RenderTarget?/p>

    technique

    technique是FX文g的主体,是真正设|各U渲染状态的地方Q也是指定所使用的ShaderE序入口的地斏V在理解Technique前首先要理解Pass的概cPass是Technique的组成部?Q一个Pass׃表了l制时的一遍。通常Z辑ֈ一U效果,仅仅l制一遍网格模型是不够的,需要向framebuffer中多ơ绘Ӟq利用设|渲染状态中的BlendStateq行Alpha混合。这是l常提到的“Muli-pass Rendering”。但是随着g来强大,ShaderE序的功能越来越强,目前的趋势是所有的Ҏ(gu)材质都将可以用越来越个Pass来完成?一个technique中,可以存在一个或多个PassQ但是至要有一个Pass时该technique才会起实际作用。当存在多个passӞ默认情况下在渲染时将会按照pass在文件中的前后顺?作ؓ渲染时的前后序。technique和Pass中的内容都是以大括号括v来?

    technique的例子:

    technique Tec_Shader_1_X //定义一个名为Tec_Shader_1_X的technique
    {
        pass P0 //一个名为P0的pass
        {
            VertexShader = compile vs_1_1 Vertex_Shader(); //讄Vertex ShaderE序入口函数
            PixelShader = compile ps_1_1 Pixel_Shader();   //讄Pixel ShaderE序入口函数
            AlphaBlendEnable= true;                        //讄渲染状态      ?
            SrcBlend = SrcAlpha;  
            DestBlend = InvSrcAlpha; 
            ... //其他讄
        }
        pass P1 //一个名为P1的pass
        {
            ...
        }
    }

     

    ID3DXEffect接口

    上面介绍了很多fx文g相关内容Q但是在E序中如何读取和分析q些fx文g呢?在程序中对于dfx文gQ控制渲染状态、设|ShaderE序{工作都是通过D3DX库中的ID3DXEffect接口来实现的。ID3DXEffect接口提供了大量的Ҏ(gu)Q基本上分ؓ几个斚wQ?

    • 获得Effect参数变量信息
    • 讄Effect参数变量
    • 获得technique信息
    • 讄当前使用的technique
    • 开始和l束使用当前的technique
    • 执行一个passQ渲染绘刉Q?

    ID3DXEffect接口的创建: 通过D3DX库中的D3DXCreateEffectFromFile()函数Q可以根据一个指定的文g的内Ҏ(gu)创徏一个ID3DXEffect接口。在该函数执行成功后Q所创徏的接口中包含了文g里所对应?所有内容,包括参数变量表、ShaderE序、technique和pass{?

    ID3DXEffect接口的用: 通过该接口的Ҏ(gu)可以获得FX文g中的所有信息,q设|参数变量和当前的technique。所有的参数变量、technique、pass、shader{等都有自己的名UͼҎ(gu)q些名称Q通过调用ID3DXEffect::GetParameterByName()、ID3DXEffect::GetTechniqueByName()和ID3DXEffect::GetPassByName(){方法就可以获得q些对象的句柄,从而在调用 ID3DXEFFECT::Set***()q行讄时用句柄而不是字W串q行索引来提高效率?/p>

    通过ID3DXEffect::GetParameterDesc()、ID3DXEffect::GetTechniqueDesc()和GetPassDecs{方 法可以获得关于指定对象的所有细节描qC息?D3DX库中定义了一个D3DXPARAMETER_DESCl构来专门表C参数的cd。通过ID3DXEffect::GetParameterDesc()Ҏ(gu)Q可以ؓ一个参数获得这样一个结构的数据?

    typedef struct _D3DXPARAMETER_DESC
    {
        LPCSTR Name;               //参数变量?
        LPCSTR Semantic;           //参数变量的Semantic
        D3DXPARAMETER_CLASS Class; //参数变量的类别,可以是标量、矢量、矩c对象和l构
        D3DXPARAMETER_TYPE Type;   //参数变量的类?
        UINT Rows;                 //数组型参数的行数
        UINT Columns;              //数组型参数的列数
        UINT Elements;             //数组中的元素个数
        UINT Annotations;          //参数变量的Annotation个数
        UINT StructMembers;        //l构型参数变量成员的个数
        DWORD Flags;               //参数属?
        UINT Bytes;                //参数大小Q以字节?
    } D3DXPARAMETER_DESC;

     

    其中的参数类型可以有下列几种Q?

    typedef enum _D3DXPARAMETER_TYPE
    {
        D3DXPT_VOID, //Void型指?
        D3DXPT_BOOL, //Bool?
        D3DXPT_INT, //整型
        D3DXPT_FLOAT, //点?
        D3DXPT_STRING, //字符?
        D3DXPT_TEXTURE, //U理
        D3DXPT_TEXTURE1D, //一l纹?
        D3DXPT_TEXTURE2D, //二维U理
        D3DXPT_TEXTURE3D, //三维U理
        D3DXPT_TEXTURECUBE, //立方体环境纹?
        D3DXPT_SAMPLER, //U理取样?
        D3DXPT_SAMPLER1D, //一l纹理取样器
        D3DXPT_SAMPLER2D, //二维U理取样?
        D3DXPT_SAMPLER3D, //三维U理取样?
        D3DXPT_SAMPLERCUBE, //立方体环境纹理取样器
        D3DXPT_PIXELSHADER, //Pixel ShaderE序
        D3DXPT_VERTEXSHADER, //Vertex ShaderE序
        D3DXPT_PIXELFRAGMENT, //Pixel Shader片断
        D3DXPT_VERTEXFRAGMENT, //Vertex Shader片断
        D3DXPT_FORCE_DWORD = 0x7fffffff
    } D3DXPARAMETER_TYPE;

     

    而真正要让Effect起作用,需要在l制|格模型前后调用ID3DXEffect::BeginPass()和EndPassҎ(gu)。在调用q两个函C前和之后Q还需调用ID3DXEffect::Begin()?ID3DXEffect::End()Ҏ(gu)来界定此ơEffect讄的v止。大致的形式如下Q?

    LPD3DXEffect pd3dEffectQ?span class="unnamed1"> //ID3DXEffect接口指针
    ... //初始化该指针
    ... //E序中的其他部分
    ...

    UINT numPasses; //用于接受当前所使用的technique中的pass个数
    pd3dEffect->Begin( & numPasses, 0 ) //开始用当前的technique
    for( UINT iPass = 0; iPass < numPasses; iPass ++ )
    {
        //遍历所有的pass
        pd3dEffect->BeginPass( iPass ); //调用BeginPass
        DrawMesh();                     //然后q行模型的绘制?
        pd3dEffect->EndPass();          //调用EndPass
    }
    pd3dEffect->End();                  //不要忘记l束当前technique

     

    3DS MAX对DirectX 9 Shader Material的支持;Effect数据获取和导?/strong>

    在FX文g中的参数Q大部分都是用来调整FX文g所指定的Effect的一些细节,例如Q一U带有凹凸纹理的效果Q可能在FX中就有一个参数控制着凹凸不^的程度。而这些参数是需要由工来调整的。另外,工也需要有一个途径能够FX文g定义的Effect赋予C个模型或它的一部分上去。同时美工也应该能够实时的预览该Effect在模型上的实际效果?在以前,实现q些要求只能通过自制效果预览器、模型编辑器或者ؓDCC软g~写插g来完成。这对于的工作l和工期较短的项目来说是非常困难的。幸q的是,目前的DCC软g 已经开始ؓ游戏制作提供丰富的支持功能。通过DCC软g自n可以预览到实时Effect的效果,q调整其参数。在《龙的传说》这个项目中Q我们?DS MAX 6.0来作为模型徏?工具和Shader预览工具?

    ?DS MAX 6.0中,新加入了一U材质类型——DirectX 9 Shader材质。这U材质是ZFX文g的。一个FX文g可以代表一U材质。它可以同MAX中的其他材质一栯予到模型?。在MAX的Viewport中可以实时地观察到FX文g中设计的效果。通过为FX中的参数讄特定的SemanticQ可以将q些参数与MAX中的场景信息联系hQ如摄像Z|、世界变换矩 늭。对于控制Effect效果的一些本地参敎ͼ可以通过为它们添加特定的AnnotationQMAX能够直接识别q些参数q在用户界面中显C它们的名称和调节控件。对应不同类型的?敎ͼMAX可以为它们生成不同的调节控g。这Pq种材质和MAX的其他材质一P可以更改U理{等的参C?对于工来说Q通过q种用户界面可以调整该FX材质的参数达到最好的效果?/p>

    但是工所调整的结果必要能够保存下来才有意义。这个工作就得由E序员来完成了。要保存3DS MAX中编辑的所有内容,需要ؓ3DS MAX~写文g导出插gQ将其内部数据保存在特定格式的文件中。在《龙的传说》这个项目中Q我们用Microsoft DirectX .X 文g。如果从头开始写导出插gQ工作量是相当大的;q运的是Q在Microsoft DirectX SDK Extra中提供了一个能够导出模型和3DS MAX标准材质到X文g的插件源代码。通过修改该源代码Q可以它能够导出DirectX 9 Shader材质。在3DS MAX 6 SDK中新增加了一个IDxMaterial接口Q通过查询一个IMaterial接口是否为IDxMaterial接口Q就可以定该材质是否ؓDirectX 9 Shader材质。通过IDxMaterial接口可以获得该材质对应的FX文g的文件名Q以及其参数信息。这样就可以它们导Z?

    .X文g中对Effect的支持;EffectInstance和EffectDefault

    Microsoft DirectX .X文g的格式是Z模板的、可扩展的文件格式。通过为其制定新的模板Q就可以在其中加入新的内宏V一般的.X文g中的内容有三l场景的物体层关系、网格模型几何数据、材质信息、动M息等。在DirectX的众多X文g模板中有一个模板是专门用来代表Effect的实例的。当一个FX文g的参数被工加以调整从而具备一些特定的g后,?FX文g和这些参数值的集合Ş成了一个Effect实例。该模板的定义如下:

    template EffectInstance
    {
        < E331F7E4-0559-4cc2-8E99-1CEC1657928F >
        STRING EffectFilename;
        [ ... ]
    }

     

    其中Q?EffectFilename代表了该Effect实例中的FX文g名, [ ... ]代表在其中可以插入Q何X文g模板对应的数据。这样就可以代表Mcd的参数倹{?

    然而要惌Direct3DE序能够识别[ ... ]中的内容Q需要用X文g模板中的EffectParampd模板Q包括EffectParamDWord, EffectParamFlaots, EffectParamString。通过q三U模板对应的数据Q所有类型的Effect参数值都可以被记录在X文g中?

    最后,EffectInstance数据需要被攄在Material数据中才可以被识别?/p>

    Material模板Q?

    template Material
    {
        < 3D82AB4D-62DA-11CF-AB39-0020AF71E433 >
        ColorRGBA faceColor;
        FLOAT power;
        ColorRGB specularColor;
        ColorRGB emissiveColor;
        [...]
    }

     

    前面的一些颜色模板表明在Material数据中这些颜色信息是必须有的Q而最后的[ ... ]则代表可以插入Q何X文g模板对应的数据。我们的EffectInstance数据可以放|在q里 ?

    举一个简单的例子Q?

    Material { //材质
        0.500000;0.500000;0.500000;1.000000;; //faceColor
        0.000000; //power
        0.900000;0.900000;0.900000;; //specularColor
        0.000000;0.000000;0.000000;; //emissiveColor
        EffectInstance
        {                            //[...]Q这里是EffectInstance
            "SkyboxNew01.fx";        //fx文g的文件名。通过D3DXCreateEffectFromFile()可以
                                     //建立该文件对应的D3DXEffect对象
            //下面是EffectInstance中的[...]

            EffectParamString 
            {                        //EffectParamStringQ即字符串型参数?/span> 
                "TexCloudTop";       //参数的名Uͼ通过该名U调用ID3DXEffect::GetXXXByName()Ҏ(gu)
                                     //可以得到与fx文g中对应的参数?
                "DarkClouds01.jpg";  //参数的值?/span>
            } 
            EffectParamString
            {                        //同上
                "TexCloudBottom";
                "DarkClouds02.jpg";
            }
            EffectParamFloats
            {                       //EffectParamFloatsQ即点数组型参数?/span>
                "Brightness";       //参数名称
                1;                  //点数组大小
                0.500000;           //?
            }
        }
    }

     

    当我们在E序中调用D3DXLoadMeshFromX()或D3DXLoadMeshHierarchyFromX()Ӟ可以通过其LPD3DXBUFFER *ppEffectInstances参数来接收到|格所用的所有EffectInstance的信息?/p>

    在程序中Q对应于X文g中的EffectInstance模板和EffectParampd模板Q有两个l构体用来代表Effect数据Q?

    typedef struct _D3DXEFFECTINSTANCE
    { //EffectInstance
        LPSTR pEffectFilename; //fx文g?/span>
        DWORD NumDefaults; //参数个数
        LPD3DXEFFECTDEFAULT pDefaults; //参数数组
    } D3DXEFFECTINSTANCE, *LPD3DXEFFECTINSTANCE;

    typedef struct _D3DXEFFECTDEFAULT
    { //EffectDefaultQ即EffectParam
        LPSTR pParamName;           //参数?
        D3DXEFFECTDEFAULTTYPE Type; //参数cd
        DWORD NumBytes;             //参数大小Q以字节?
        LPVOID pValue;              //指向参数的值的指针
    } D3DXEFFECTDEFAULT, *LPD3DXEFFECTDEFAULT;

    需要注意的是,从文件中得到的参数类型只有以下几U:
    typedef enum _D3DXEFFECTDEFAULTTYPE
    {
        D3DXEDT_STRING = 1, //字符?
        D3DXEDT_FLOATS = 2, //点数组
        D3DXEDT_DWORD = 3,  //长整?
        D3DXEDT_FORCE_DWORD = 0x7fffffff //此g使用
    } D3DXEFFECTDEFAULTTYPE;

     

    在调用了D3DXLoadMeshFromX()和D3DXLoadMeshHierarchyFromX()之后QX文g中的所有Effect数据信息׃上述l构体的形式攄在ppEffectInstances中了?另外Q在?DS MAX导出参数到X文gӞ对于整型和QҎ(gu)l型的变量,它们的值将直接导出到X文g中去Q而对于所有的U理贴图文g参数Q导出的仅仅是该文g的文件名。所?在程序中需要再Ҏ(gu)q些文g名来建立U理对象?在《龙的传说》中Q我们用一个自定义的CEffectInstancecL处理文件名转换为纹理对象的q程?一般来_建立一个完整的CEffectInstance的过E如下:

    Ҏ(gu)D3DXEFFECTINSTANCEl构中的pEffectFilename字符串寻扑֯应的FX文g;
    Ҏ(gu)该FX文g建立ID3DXEffectQƈ指针保存在CEffectInstance?
    Ҏ(gu)D3DXEFFECTINSTANCEl构中的pDefaults讄CEffectInstance中的参数信息Q?/p>


    对于长整型和点数组Q直接拷贝; 
    对于字符Ԍ首先调用ID3DXEffect接口中的GetParameterByName()和GetParameterDesc()Ҏ(gu)Q得到该参数的类型; 然后q一步判断:


    如果实是字W串参数Q则直接拯
    如果是纹理参敎ͼ则将该字W串作ؓU理文g名徏立纹理对象,q将指针保存在CEffectInstance中?

    而在最新推出的DirectX 9 SDK Summer 2004中,通过ID3DXEffect::BeginParameterBlock()和ID3DXEffect::EndParameterBlock()Ҏ(gu)Q我们可以将Effect参数讄q程l一l定C个ParamBlock句柄上。这P在调用ID3DXEffect::Begin()之前可以直接用ID3DXEffect::ApplyParameterBlock()Ҏ(gu)来设|所有被l定的参数倹{例如:

    [以前的做?/strong>]Q?

    在读取参数时Q获得每一个参数的句柄

    hParam1 = pEffect->GetParameterByName( NULL, "LightPos" );
    hParam2 = pEffect->GetParameterByName( NULL, "LightColor" );
    ...

    在实时绘制时Q分别设|每一个参?

    pEffect->SetValue( hParam1, value1 );
    pEffect->SetValue( hParam2, value2 );
    ...
    pEffect->Begin();
    // l制
    ...

     

    [在DirectX 9 SDK Summer 2004中的做法]Q?

    在读取参数时Q绑定所有参数设|到同一句柄

    hParam1 = pEffect->GetParameterByName( NULL, "LightPos" );
    hParam2 = pEffect->GetParameterByName( NULL, "LightColor" );
    ...
    pEffect->BeginParameterBlock(); // 开始绑?/span>
    pEffect->SetValue( hParam, value1 );
    pEffect->SetValue( hParam, value2 );
    ...
    hParamBlock = pEffect->EndParameterBlock(); // l束l定Q返回句?

    在实时绘制时Q统一讄l定?

    pEffect->ApplyParameterBlock( hParamBlock );
    pEffect->Begin;
    // l制
    ...

     

    q样不仅化了在读取时对参数的分析q程Q而且提高了实际绘制时参数讄q程的效率?

    ȝ

    以上是一些对于在DirectX 9.0中对Effect Framework的用的要介l。MQ用Effect来替代以前的标准材质是目前实时图形领域的发展势。通过Effect FrameworkQ程序员和美工可以ؓ实时三维E序实现多种多样的材质效果和视觉效果?׃内容实在太多Q限于篇q,本文只是对Effect Framework中相x늚一个M概括和简要介l,所以显得有些晦涩。在以后的文章中Q将分批对这个Framework以及在其之上q行工作的流E进行比较详l的介绍?/p>

    李锦?mybios) 2006-11-20 16:54 发表评论
    ]]>
    【{贴】直接运行内存中的程?/title><link>http://www.shnenglu.com/mybios/archive/2006/11/20/15452.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Mon, 20 Nov 2006 03:54:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/11/20/15452.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15452.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/20/15452.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15452.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15452.html</trackback:ping><description><![CDATA[     摘要: 哈哈Q想不到有h居然把这U代码也搞出来了。  ?Windows的PE加蝲器在启动E序的时候,会将盘上的文g加蝲到内存,然后做很多操作,如函数导入表重定位,变量预处理之cȝ。这位仁兄等于是自己写了一个PE加蝲器。直接将内存中的E序启动。记得以前的“红色代码”病毒也有相同的Ҏ(gu)。  ?直接启动内存中的E序相当于加了一个壳Q可以把E序加密保存Q运行时解密到内存,然后启动Q不q对于增加破解难度还要稍...  <a href='http://www.shnenglu.com/mybios/archive/2006/11/20/15452.html'>阅读全文</a><img src ="http://www.shnenglu.com/mybios/aggbug/15452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-20 11:54 <a href="http://www.shnenglu.com/mybios/archive/2006/11/20/15452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我到了游戏开发学习迷惘期Q该如何是好Q?/title><link>http://www.shnenglu.com/mybios/archive/2006/11/20/15447.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Mon, 20 Nov 2006 01:46:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/11/20/15447.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15447.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/20/15447.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15447.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15447.html</trackback:ping><description><![CDATA[        学游戏开发前前后后也有两个星期了?br />        在这两个星期里,收获甚多Q从最几本的经典几何知识到高等数学、线性代数都看了一遍,从Direct3D入门到Shader的编写也看了Q甚臌学习了LUA脚本的编写和游戏引擎的架构,BSP、八叉树{等法也看q了解了一下?br />        学的东西q么多,但是真正能掌握的又有多少Q自己无法掂量啊Q那么接下去应该做什么好Q很多h说应该做一个DEMOQ甚x试着自己做一个游戏引擎,q有要我试着做一个网游?br />        实Q现在应该从实际出发了,要做点东西出来才能把学过的知识牢固掌握。但是,我现在觉得很qhQ不知道做什么好Q我打算春节q后L游戏开发,请大虑ְ虾们都给Ҏ(gu)见如何?<img src ="http://www.shnenglu.com/mybios/aggbug/15447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-20 09:46 <a href="http://www.shnenglu.com/mybios/archive/2006/11/20/15447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{贴】Ogre的官僚主义批?/title><link>http://www.shnenglu.com/mybios/archive/2006/11/19/15418.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sun, 19 Nov 2006 00:40:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/11/19/15418.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15418.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/19/15418.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15418.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15418.html</trackback:ping><description><![CDATA[ <div id="6666111" class="postbody"> <p>Ogre的Manager真是多啊,p个官僚公?q事的没几个,一堆的Manager,个个丫还都是Singleton.说自己是Singleton却又public构造函?让h来new?在第1ơ被new的时?偷偷地将this赋给静态成员ms_Singleton,W?ơnew它就要assert喊冤?当然q都是叫Singleton的模板基cȝ那个构造函数干?典型的小?见不得光).Manager一?本来不复杂的?也变得复杂了.</p> <p>1.LogManager<br />a.全局单体LogManagerl合Log指针Map集合,控制有多个Log对象,1个Log对象表达对一个Log文g的输?老一?.<br />b.同时LogManagerl护1个当前默认主事的Log对象mDefaultLog,以展现Log对象功能而隐藏自己实际是个Manager的n?邀功自?其心可诛).<br />c.l护一个监控者接口LogListener列表,以行作Z个Manager受外部监督的职责(实ؓ推清责Q).</p> <p>2.DynLibManager<br />a.全局单体DynLibManagerl合DynLib*指针Map集合,控制多个DynLib对象,1个Dynlib表达对动态库的装载和卸蝲(典型的官僚主?人Q于事,q点屁事都要有Manager).</p> <p>3.ResourceGroupManager<br />  a.全局单体ResourceGroupManagerl合ResourceManager指针Map?Manager的Manager,?好大的官)<br />  b.一上Q安插了个亲信Manager,建立个叫General的ResourceManager.</p> <p>4.SceneManagerEnumerator<br />  a.q它都是pȝ单体,一个P代器,h得志?不说?它可着一堆SceneManager,惹不?<br />  b.一开始就安排了什么事都作不了的SceneManager(基类)作默认SceneManager,大事事都是?室内室外一手包.</p> <p>5.一堆中层干?一堆的MaterialManager,MeshManager,ParticleSystemManager,SkeletonManager......,都是Singleton,有的q是ResourceManager的门?一开始都q了2件事.<br />a.定名?向ResourceGroupManager注册说自己是某方面的Manager,_registerResourceManager.<br />b.要资?向ResourceGroupManager要求控制Ҏ(gu)U脚本的解析_registerScriptLoader(是瓜分资源).<br />c.有个OverlayManager,ArchiveManager最?手下q有几个工厂l它q活,无非是自׃不了,又推l下U?</p> <p>6.一堆插件外?开始加?q些外劳到系l中来当然要注册.</p> <p>7.透明实体mTransparentObjects按z序排?不透明实体按material分组.</p> <p>8.我一开始认为Materail是个很聪明的概念,后来才发C当受骗了,它管理了mTechniques数组,而Techniche理了mPasses数组(Multipass render),最后实质的内容在PasscM,Passc表达了一个渲染的环境.׃q个官僚pȝ实在太官?所以按对象每次渲染是不可接受的(跨部门合作太?怺扯皮),渲染状态切换频J?效率极低,透明渲染z序؜?所以需要按Materail分组和z轴分?而RenderSystem的最重要Ҏ(gu)接受RenderOperation参数.</p> <p>9.Pass和RenderOperation是两位最能干的劳动h?都是受h制的对?整个pȝ的灵和核心,Pass装了最重要的渲染状?卌行glDrawXXX时管U所处的状?着色系l?,RenderOperation装了带U理几何渲染操作(glDrawElements几何pȝ),两者构成一个完整的渲染.??调用SceneManager的setPass(在其中其仍将调用RenderSystem以设|管U状?,?调用RenderSystem的_render.</p> <p>10.SceneManager的虚Ҏ(gu)_findVisibleObjects是场景管理的核心,由它?yu)Renderable分组,分透明和不透明分送入不同的渲染队?Renderablel合RenderOperation和Pass(但出头的都是Materail),然后SceneManager对之排序,整理,送入RenderSystem渲染.</p> <p>11.SceneManager的_renderScene是基本渲染核?它完成若qQ?br />   a.帧动画驱动_applySceneAnimations <br />   b.场景图更新_updateSceneGraph<br />   c.渲染队列更新,_findVisibleObjects更新d?_queueOverlaysForRendering更新上层ȝ?_queueSkiesForRendering更新天空?最后_renderVisibleObjects.</p> <p>12.渲染队列RenderQueue,l护std::map<RenderQueueGroupID, RenderQueueGroup*>对象,以表辑օ内部的多个方?世界,前景,背景)的渲染分队列.RenderQueueGroup再往下分std::map<ushort, RenderPriorityGroup*, std::less<ushort> >,以表辑օ(如前?内部按ushort优先U维护渲染分队列.RenderPriorityGroupl护一个mTransparentPasses,若干个SolidRenderablePassMap.</p> </div> <img src ="http://www.shnenglu.com/mybios/aggbug/15418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-19 08:40 <a href="http://www.shnenglu.com/mybios/archive/2006/11/19/15418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{贴】用非2ơ方q的囑փU理的问?/title><link>http://www.shnenglu.com/mybios/archive/2006/11/19/15417.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sun, 19 Nov 2006 00:26:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/11/19/15417.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15417.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/19/15417.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15417.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15417.html</trackback:ping><description><![CDATA[ <div id="1111616" class="postbody"> <p>囑փ使用2ơ方是很讨厌的问?不在技术难度上,而在技术妥协上.实际上要求美工作?ơ方U理,q且整张囄I间利用率要?是很隄.<br />当有些策划丢q来奇奇怪怪的寸的图?我都要吐血,当知?nơ方限制?他们把图像尺寸扩大一?再丢l我IZ大量I白?nơ方U理,再吐血.</p> <p>ȝ渣资源里标准?nơ方人物U理,囑փ挤的满满?每个w体部位U理q是一个矩?利用率之高不得不令h佩服,然而这对美工要求是极高?<br />1024*768的图像是要拆?*3?56*256囑փ?而不是一整大张纹?因ؓ768不是2的nơ方,更不要扩大ؓ1024*1024,加大25%的内?<br />q有Wow里Loading界面的图像都压成512*512,因ؓLoading囑փ模糊一点不要紧,很简单却都是很重要的l节.<br />所以当Wowq行在我Geforce2的显卡上?我觉的很cool.</p> <p>Nvidia的驱动程序也很讨?实际Geforce6昑֍才支持non power of two texture,Geforce 5200U的昑֍,在硬件能力上不以支持NPOT,但是最新的驱动E序使用了Y件模式进行模拟支?而Y件模拟根本毫无实用h(hun)?渲染变得~慢,因ؓ驱动E序每次U理渲染都会很聪明地把非2ơ方寸囑փ自动Scale?ơ方寸,对于一?00*600的图?驱动E序在这个步骤就吃光了CPU.<br />所以L些h喊着Z么OpenGL没有软g渲染支持,DX很体贴都?实际上DX也没?比如那个所谓的8层纹?,而我认ؓ如果软g渲染能解决问?那要g作什?不能解决问题的方案我们支持它作什?</p> <p>// OpenGL动态执?nơ方囑փ限制<br />inline int next_p2(int a)<br />{<br /> int rval=1;<br /> while(rval<a) rval<<=1;<br /> return rval;<br />}</p> <p>int nWidthPowerOfTwo = next_p2(tex.nWidth);<br />int nHeightPowerOfTwo = next_p2(tex.nHeight);</p> <p>if(tex.nWidth == nWidthPowerOfTwo  &&  tex.nHeight == nHeightPowerOfTwo)<br />{ <br /> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidthPowerOfTwo, nHeightPowerOfTwo, 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, ilGetData());<br /> tex.fScaleX = tex.fScaleY = 1.0f;<br />} <br />else<br />{ <br /> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidthPowerOfTwo, nHeightPowerOfTwo, 0, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, NULL);<br /> glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex.nWidth, tex.nHeight, ilGetInteger(IL_IMAGE_FORMAT), GL_UNSIGNED_BYTE, ilGetData());<br /> tex.fScaleX = (float)tex.nWidth / (float)nWidthPowerOfTwo;<br /> tex.fScaleY = (float)tex.nHeight/ (float)nHeightPowerOfTwo;<br />}<br /><br />然而对q个问题,正确的解x案是事先规划,强制执行,be clever.</p> </div> <img src ="http://www.shnenglu.com/mybios/aggbug/15417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-19 08:26 <a href="http://www.shnenglu.com/mybios/archive/2006/11/19/15417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【{贴】数据打包格?/title><link>http://www.shnenglu.com/mybios/archive/2006/11/19/15416.html</link><dc:creator>李锦?mybios)</dc:creator><author>李锦?mybios)</author><pubDate>Sun, 19 Nov 2006 00:17:00 GMT</pubDate><guid>http://www.shnenglu.com/mybios/archive/2006/11/19/15416.html</guid><wfw:comment>http://www.shnenglu.com/mybios/comments/15416.html</wfw:comment><comments>http://www.shnenglu.com/mybios/archive/2006/11/19/15416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mybios/comments/commentRss/15416.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mybios/services/trackbacks/15416.html</trackback:ping><description><![CDATA[ <div align="left">  游戏q行和显C的速度固然重要Q不q我认ؓQ在游戏中另外一个速度Q游戏装入的速度也同样不可轻视。试想一个游戏,动不动就要装入数据,而且每次装入的时间都令h{到“心来慌”的地步Q我x怕也没有什么h愿意玩下ȝ?br /><br />  选择一个好的打包数据格式,对于~程人员来说Q是一件很重要的事情。一般来_一个游戏的文g个数太多Qƈ不是一件好事情Q不光占用的盘I间大,而且严重的媄响装入速度。不q这样做的优点也很明显:可以很详l的分类Q可以大大的减小~程人员的工作量。另外一U做法是Q把所有的数据全部攑֜一个文仉面,q样的做法和上面一U做法的优缺Ҏ(gu)好相反,装入速度比较快(因ؓ只要做一ơ文件打开的操作)Q但是由于所有数据都攑֜一P文g数据的组l比较复杂,要求~程人员p大量的精力去定位数据的格式和存放位置。因此,选择一个合适的数据打包格式Q实际上是在这两种情况之间选择一个^衡点Q它既不会Ҏ(gu)戏的装入速度造成明显的媄响,也不会给~程人员带来额外的负担?br /><br />  那么Q对于一个游戏来_数据应该怎么l织呢?其实现在有很多好的游戏,参考一下他们的数据文g׃发现q个q点其实很好找。现在大多数的游戏,基本上把游戏需要用到的数据分门别类的存放,每一cL据放在一个文仉面。比如说音乐攑֜一个文仉面,地Ş囄攑֜一个文仉面,_造型、动L在一个文仉面,游戏需要用到的囄攑֜一个文仉面,人物的对话、事件说明放在一个文仉面……那么这些数据在文g里面怎么l织呢?<br /><br />  q是一句话Q分门别cR下面以游戏最基本的地形图素ؓ例,说明数据的组lŞ式。一般说来,游戏的地囄很多大大小的“图素”组成的Q这些图素分为几层,每一层的囄基本上可以算作一c:比如说地面层可以作一c,C层可以算作一c,然后天空层(背景层)可以作一c,部队、物品可以算作一cR而在地面层里面,又可以进一步的分类Q比如说地Ş有山圎ͼ沙漠Q草原,林Q河,h……在游戏中,是可以分为场景的Q一般的情况下,每个场景所涉及到的地Ş不会很多QL以某一cd型地行ؓ主,然后加入量其他的地形作为点~。针对这U情况,我们可以把同一cȝ地Şq箋的放在文件的某一个位|,q样我们在装入场景的时候,只要在这个位|一ơ读取这U地形的数据可以了。一般游戏在制作的过E中都有一个场景生成器Q或者叫作拚囑֙Q它的作用就是生成地䏀—或者说生成场景。这个拚囑֙在初期的时候读人的数据肯定不是已经打包了的Q因为美术还要对地Ş的基本图素进行某些修攏V?br /><br />  所以我认ؓQ好的数据打包格式应该是Z拚图器的Q他把每一U数据分门别cȝq箋存放在某一个文件之中或者文件的某一个位|,q样能够大大的加快程序读取数据的速度。这样几能够使游戏文件看h很简z,也会大大的有利于E序的开发?br /></div> <img src ="http://www.shnenglu.com/mybios/aggbug/15416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mybios/" target="_blank">李锦?mybios)</a> 2006-11-19 08:17 <a href="http://www.shnenglu.com/mybios/archive/2006/11/19/15416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.gold160.cn" target="_blank">99þۺϺݺۺϾþֹ</a>| <a href="http://www.hvnm.cn" target="_blank">þݺҹҹ96׽ </a>| <a href="http://www.hetiandai.cn" target="_blank">ۺϾþۺ</a>| <a href="http://www.3-gold.cn" target="_blank">þþҹƷ</a>| <a href="http://www.cooyu.cn" target="_blank">þۺɫHEZYO </a>| <a href="http://www.ccgangjiegou.cn" target="_blank">ŷСþþþþþ</a>| <a href="http://www.bjzfw.cn" target="_blank">þۺ³³</a>| <a href="http://www.shanzhaiji.com.cn" target="_blank">þþþƷ</a>| <a href="http://www.tpjh.com.cn" target="_blank">޾ƷþרӰҵ</a>| <a href="http://www.sjsgsl.net.cn" target="_blank">2020˾þþƷ</a>| <a href="http://www.jshzyj.cn" target="_blank">þþֻоƷձ</a>| <a href="http://www.globenewswire.com.cn" target="_blank">޾Ʒþò</a>| <a href="http://www.03caiji.cn" target="_blank">þþƷ99Ӱ </a>| <a href="http://www.zaggaa.cn" target="_blank">aѹۿþav </a>| <a href="http://www.yjpute.cn" target="_blank">Ʒ99þþþ</a>| <a href="http://www.fttyz.com.cn" target="_blank">þþþþϸApp</a>| <a href="http://www.fotoblog.cn" target="_blank">޹˾þۺ</a>| <a href="http://www.ywck.net.cn" target="_blank">˾þһ</a>| <a href="http://www.u33w.cn" target="_blank">Ʒþþþ</a>| <a href="http://www.acmpm.cn" target="_blank">þþþþþƷͼƬ</a>| <a href="http://www.520chuanqi.cn" target="_blank">AVӰƬþþþþ</a>| <a href="http://www.threecar.com.cn" target="_blank">޹˾þۺ3d</a>| <a href="http://www.fq2.com.cn" target="_blank">þþƷ99þþùŴ</a>| <a href="http://www.yssmtm.cn" target="_blank">ɫþþۺ</a>| <a href="http://www.vetg.cn" target="_blank">þþþþþAv</a>| <a href="http://www.kou365.cn" target="_blank">þþþþþƷͼƬ</a>| <a href="http://www.fuzd88.cn" target="_blank">ľƷþþþþò</a>| <a href="http://www.gcctv.cn" target="_blank">ҰĻþ</a>| <a href="http://www.7111393.cn" target="_blank">Ʒݾþþþø</a>| <a href="http://www.zjjunyao.cn" target="_blank">vaþþþ</a>| <a href="http://www.dgcry.cn" target="_blank">պAvĻþþ޸ </a>| <a href="http://www.englishtutor.com.cn" target="_blank">ƷѾþþþӰԺ</a>| <a href="http://www.adddi.cn" target="_blank">þӰ</a>| <a href="http://www.cczone.cn" target="_blank">˾þô߽AVۺӰԺ</a>| <a href="http://www.szdeyi.cn" target="_blank">þþƷ</a>| <a href="http://www.qt32.cn" target="_blank">ѹۿþþƵ</a>| <a href="http://www.s9375.cn" target="_blank">þˬˬ</a>| <a href="http://www.voos.org.cn" target="_blank">˾Ʒþö</a>| <a href="http://www.7111393.cn" target="_blank">þþþùƵӰ</a>| <a href="http://www.csmfy.cn" target="_blank">AVþþþò</a>| <a href="http://www.gzquanjing.cn" target="_blank">Ʒþþþþһ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>