日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

深入研究虚幻4反射系统实现原理(三)

發(fā)布時(shí)間:2023/12/13 综合教程 34 生活家
生活随笔 收集整理的這篇文章主要介紹了 深入研究虚幻4反射系统实现原理(三) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前面兩篇文章介紹了虛幻引擎中對(duì)于反射的支持(如果沒(méi)讀過(guò)前兩篇文章,推薦你仔細(xì)看下,否則你可能不知道我在講什么),不過(guò)還差一點(diǎn)內(nèi)容,就是這些信息是如何 加入到運(yùn)行時(shí)的,講完這些那么這個(gè)系列也就算是基本結(jié)束了,下面進(jìn)入正文。

信息注冊(cè)

虛幻引擎使用一系列靜態(tài)變量來(lái)注冊(cè)需要生成反射信息的函數(shù),這個(gè)我們前面的文章已經(jīng)比較詳細(xì)的講過(guò)。至于用生成的C++的代碼所帶來(lái)的好處,我前面翻譯的文章中也講過(guò)。下面我把它貼到這里。

用生成的C++代碼來(lái)存儲(chǔ)反射數(shù)據(jù)的一個(gè)最大好處就是,它可以保證跟二進(jìn)制做到同步。你永遠(yuǎn)也不會(huì)加載陳舊或者過(guò)時(shí)的反射數(shù)據(jù),因?yàn)樗歉娴钠渌a同時(shí)編譯的,并且它會(huì)在程序啟動(dòng)的時(shí)候使用C++表達(dá)式來(lái)計(jì)算成員偏移等,而不是通過(guò)針對(duì)特定平臺(tái)/編譯器/優(yōu)化的組合中進(jìn)行逆向工程。UHT作為一個(gè)單獨(dú)的不使用任何生成頭文件的程序來(lái)構(gòu)建,因此它也避免了雞生蛋、蛋生雞的問(wèn)題,這個(gè)在虛幻3的腳本編譯器中一直被詬病。

UCLASS

對(duì)于類的反射支持,虛幻4分為兩步來(lái)做的。

IMPLEMENT_CLASS() 這個(gè)宏用于在程序啟動(dòng)時(shí)注冊(cè)這個(gè)類,包括生成UClass類以及注冊(cè)C++原生函數(shù)等操作。
static FCompiledInDefer 創(chuàng)建一個(gè)靜態(tài)變量,用于向DeferredCompiledInRegistration這個(gè)靜態(tài)數(shù)組中添加注冊(cè)函數(shù),來(lái)初始化默認(rèn)的反射屬性。包括函數(shù)、成員變量、元數(shù)據(jù)等。

USTRUCT

對(duì)于結(jié)構(gòu)體的支持,虛幻4引擎也是分為兩步來(lái)做的。

static FCompiledInDeferStruct 存儲(chǔ)一個(gè)用于構(gòu)建結(jié)構(gòu)體的一個(gè)單例函數(shù),用于在程序啟動(dòng)的時(shí)候調(diào)用,讀者可以自行查看代碼就知道這個(gè)過(guò)程了。
還會(huì)創(chuàng)建一個(gè)靜態(tài)對(duì)象,這個(gè)對(duì)象在構(gòu)造函數(shù)中會(huì)調(diào)用UScriptStruct::DeferCppStructOps,它用來(lái)向這個(gè)DeferredCppStructOps map 中注冊(cè)一個(gè)動(dòng)態(tài)管理結(jié)構(gòu)體構(gòu)造、析構(gòu)的一個(gè)類。

UENUM

枚舉比較簡(jiǎn)單,只有一步。

static FCompiledInDeferEnum 創(chuàng)建一個(gè)靜態(tài)變量,用于在程序啟動(dòng)時(shí)存儲(chǔ)一個(gè)創(chuàng)建枚舉反射對(duì)象的一個(gè)單例函數(shù)。

啟動(dòng)過(guò)程分析

上面我們講解了這個(gè)注冊(cè)信息的過(guò)程,而它們的執(zhí)行是伴隨著當(dāng)前模塊的加載而執(zhí)行的,我們都知道靜態(tài)變量的初始化是先于Main函數(shù)執(zhí)行的。下面我們簡(jiǎn)單畫(huà)了一下虛幻編輯器的啟動(dòng)流程,這樣我們就可以準(zhǔn)確地看到整個(gè)注冊(cè)反射信息的過(guò)程了。

可以看到void ProcessNewlyLoadedUObjects()這個(gè)函數(shù)就是我們主要關(guān)注的函數(shù),我們前面講到的注冊(cè)的信息,包括類、結(jié)構(gòu)體以及枚舉類型的反射信息都會(huì)在這里進(jìn)行注冊(cè),它的代碼如下所示:

void ProcessNewlyLoadedUObjects()
{
	DECLARE_SCOPE_CYCLE_COUNTER(TEXT("ProcessNewlyLoadedUObjects"), STAT_ProcessNewlyLoadedUObjects, STATGROUP_ObjectVerbose);

#if WITH_HOT_RELOAD
	UClassGenerateCDODuplicatesForHotReload();
#endif
	UClassRegisterAllCompiledInClasses();

	while( AnyNewlyLoadedUObjects() )
	{
		UObjectProcessRegistrants();
		UObjectLoadAllCompiledInStructs();
		UObjectLoadAllCompiledInDefaultProperties();		
	}
#if WITH_HOT_RELOAD
	UClassReplaceHotReloadClasses();
#endif
}

下面我們對(duì)上面代碼做一個(gè)簡(jiǎn)單的解釋,讀者也可以自行翻閱代碼來(lái)仔細(xì)查看它是怎么實(shí)現(xiàn)的。

代碼中WITH_HOT_RELOAD這個(gè)宏是用來(lái)處理C++代碼熱加載使用的。
UClassRegisterAllCompiledInClasses()用來(lái)注冊(cè)所有要加載的類,這里面的所有類就是通過(guò)前面IMPLEMENT_CLASS()宏添加進(jìn)來(lái)的。
UObjectProcessRegistrants()用于處理自動(dòng)注冊(cè)的對(duì)象,并把它們添加到ObjectArray中去,用于后期的檢索。
UObjectLoadAllCompiledInStructs()用于注冊(cè)結(jié)構(gòu)體和枚舉的反射信息。數(shù)組里面的數(shù)組是通過(guò)FCompiledInDeferStruct和FCompiledInDeferEnum創(chuàng)建的靜態(tài)對(duì)象注冊(cè)進(jìn)去的。
UObjectLoadAllCompiledInDefaultProperties()用于注冊(cè)類的反射信息并且創(chuàng)建一個(gè)默認(rèn)對(duì)象(CDO)。

總結(jié)

到此為此,這個(gè)系列的3篇文章通過(guò)代表示例的方式向讀者展示了虛幻中反射系統(tǒng)的實(shí)現(xiàn)方式,原理其實(shí)很簡(jiǎn)單,網(wǎng)上也有一些如何用C++支持反射類的方法,虛幻實(shí)現(xiàn)的是其中一種,因?yàn)橛辛薝HT的幫助,所以好多臟活、累活都不用我們來(lái)做了,比如最笨的方法是我們自己實(shí)現(xiàn)一些宏用來(lái)注冊(cè)各種反射信息,但這樣效率還是比較低。而有的實(shí)現(xiàn)方式會(huì)從編譯器產(chǎn)生的調(diào)試信息入手,比如vs生成的pdb文件,或者clang生成的文件等,這樣做也可以,但是它有一個(gè)比較大的問(wèn)題就是跨平臺(tái)的支持不是特別友好。所以虛幻4中這一套UHT工具總體上來(lái)說(shuō)還是很不錯(cuò)的,如果后面有時(shí)間,希望給大家?guī)?lái)對(duì)UHT工具的分析。對(duì)了,如果你有什么想對(duì)虛幻4引擎比較想了解的,也歡迎在下面留言,我也會(huì)挑大家比較感興趣的模塊來(lái)先做分析。接下來(lái),我可能會(huì)主要把精力放在虛幻中藍(lán)圖的實(shí)現(xiàn)原理和基于物理的渲染具體實(shí)現(xiàn)上。敬請(qǐng)期待!

總結(jié)

以上是生活随笔為你收集整理的深入研究虚幻4反射系统实现原理(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本一区二区不卡在线观看 | 中文字幕精品三区 | 丝袜操 | 男女草比视频 | 污网站免费 | 亚洲一区二区三区激情 | 男女涩涩| 国产精品久久久久久久免费大片 | 菲律宾黄色片 | 性视频久久 | 五月婷婷六月色 | 国产精品国产三级国产在线观看 | 天天综合久久综合 | 校园春色自拍偷拍 | 中文字幕电影一区二区 | 黄色一级欧美 | 久草福利资源 | 好吊妞操 | 五十路妻| 少妇又紧又色又爽又刺激视频 | 日韩福利视频在线观看 | 亚洲精品国产精品乱码不卡 | 精品一区二区成人免费视频 | 绯色av一区二区 | 啪啪网站视频 | 日本精品一区二区视频 | 国产精品传媒麻豆hd | 1级黄色大片儿 | 黄色欧美视频 | 黑人欧美一区二区三区 | 2019国产精品 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 国产女主播在线观看 | 天天操夜夜摸 | 中文字幕第二区 | 2024国产精品视频 | 日本欧美久久久久免费播放网 | 国产性生活 | 亚洲熟妇无码一区二区三区 | 全黄一级裸片视频 | 亚洲欧美日本一区 | 久久狠狠高潮亚洲精品 | 日韩高清一二三区 | 国产精品久久在线 | 国产日本欧美一区二区 | www国产精品 | 青草综合 | 国产白浆视频 | 欧美毛茸茸 | 国产精品色综合 | 91亚洲高清 | 99久久久精品免费观看国产 | 日韩三级不卡 | 潘金莲一级淫片免费放动漫 | 亚洲AV成人无码久久精品同性 | 日本免费爱爱视频 | 欧美特级毛片 | 91丝袜美腿 | 男人喷出精子视频 | 亚洲欧美日韩网站 | 黄色一级视频免费看 | 中文字幕精品久久久 | 用舌头去添高潮无码视频 | 成人免费黄色小视频 | 国产熟妇一区二区三区aⅴ网站 | 丁香婷婷久久 | 中文字幕av免费在线观看 | 一区二区三区播放 | 日韩免费不卡视频 | 午夜电影一区二区 | 美女精品视频 | 免费在线观看中文字幕 | 麻豆一区二区在线 | 国产片高清在线观看 | 精品国产乱码久久久久久牛牛 | 妹子干综合网 | 亚洲欧美日韩综合一区二区 | 国产午夜精品一区二区理论影院 | 亚洲精品成人片在线观看精品字幕 | 欧美日韩激情视频在线观看 | 久久免费看片 | av网站国产 | 熟妇高潮喷沈阳45熟妇高潮喷 | 艳妇乳肉豪妇荡乳 | 一区二区三区高清 | 黄色录像片子 | 亚洲av永久纯肉无码精品动漫 | 韩国中文字幕hd久久精品 | 一区二区三区毛片 | 欧美性做爰猛烈叫床潮 | 福利在线观看 | 久草高清视频 | 久草视频精品 | 欧美一区二区三区视频在线 | 黄片毛片视频 | 日韩综合av | 久久99在线| 欧美性猛交xx | 免费国产视频在线观看 |