IT技術互動交流平台

虛幻4藍圖虛擬機剖析

作者||赢发彩票注册:風戀殘雪  來源-_众彩app是骗局吗:IT165收集  發布日期_-|亿人娱乐:2016-11-14 20:23:52

前言

這裏-|黄岩岛现状,我們打算對虛幻4 中藍圖虛擬機的實現做一個大概的講解-_和养堂养生一对一,如果對其它的腳本語言的實現有比較清楚的認識_-|至尊彩网站是合法的吗?,理解起來會容易很多-__国世平本人,我們先會對相關術語進行一個簡單的介紹-_369彩票官网首页,然後會對藍圖虛擬機的實現做一個講解-_|寻找了解绝杀技。

術語

編程語言一般分為編譯語言和解釋型語言--_金山升一。

編譯型語言

程序在執行之前需要一個專門的編譯過程-164期十四场胜负彩开奖,把程序編譯成 為機器語言的文件||采婷,運行時不需要重新翻譯-铜电阻率,直接使用編譯的結果就行了||药草悠悠芳草香。程序執行效率高||-k歌迷,依賴編譯器|_|触动陷阱,跨平台性差些---3M彩票首页。如C_|_160彩票靠谱么、C++---易发彩票靠谱吗、Delphi等.

解釋性語言

編寫的程序不進行預先編譯-_|长汀南禅寺,以文本方式存儲程序代碼苦参总碱。在發布程序時|_地精炼金术士,看起來省了道編譯工序--铸造石墨粉。但是_|oppo805,在運行程序的時候-|-阿芙诺蒂,解釋性語言必須先解釋再運行--0567好彩官方版苹果。

然而關於Java-|-昆山花桥开锁、C#等是否為解釋型語言存在爭議__188福地彩票官网,因為它們主流的實現並不是直接解釋執行的_-黄牛课件,而是也編譯成字節碼-_众富彩票注册,然後再運行在jvm等虛擬機上的|-2019最新买足彩软件。

UE4中藍圖的實現更像是lua的實現方式__-长治日报,它並不能獨立運行-_圆通400电话多少,而是作為一種嵌入宿主語言的一種擴展腳本__|上将名单,lua可以直接解釋執行__cfq币购物券怎么用,也可以編譯成字節碼並保存到磁盤上||灵异森林,下次調用可以直接加載編譯好的字節碼執行||2018白姐正版四不像图。

什麼是虛擬機

虛擬機最初由波佩克[a]與戈德堡定義為有效的_|-爱相约国际交友网、獨立的真實機器的副本|_av女神。當前包括跟任何真實機器無關的虛擬機||众彩国际合法吗。虛擬機根據它們的運用和與直接機器的相關性分為兩大類|wow致命一击。係統虛擬機(如VirtualBox)提供一個可以運行完整操作係統的完整係統平台||_易彩彩民福地登录app。相反的-_亿彩彩票邀请码,程序虛擬機(如Java JVM)為運行單個計算機程序設計_亿博国际娱乐登录,這意謂它支持單個進程|_-盐都区政府。虛擬機的一個本質特點是運行在虛擬機上的軟件被局限在虛擬機提供的資源裏——它不能超出虛擬世界|||陈国栋简历。

而這裏我們主要關心的是程序虛擬機_-诸暨凯翔,VM既然被稱為'機器'_|168彩票正规吗,一般認為輸入是滿足某種指令集架構(instruction set architecture||_华硕f83s,ISA)的指令序列-易网彩票靠谱吗,中間轉換為目標ISA的指令序列並加以執行_|掌上彩票出现网络异常,輸出為程序的執行結果的||-优盈彩票是合法,就是VM|-|房室交叉。源與目標ISA可以是同一種_11068移动彩票,這是所謂same-ISA VM-|-111彩票cc手机APP。

分類

虛擬機實現分為基於寄存器的虛擬機和基於棧的虛擬機-_小骨头影院。

三地址指令

a = b + c;

如果把它變成這種形式__盈盈彩注册:

add a, b, c

那看起來就更像機器指令了|寂寞先生 刘悦,對吧||-阆中市国土局?這種就是所謂'三地址指令'(3-address instruction)__yyy863 com,一般形式為-_-亿发博彩:

op dest, src1, src2

許多操作都是二元運算+賦值_-_肉图。三地址指令正好可以指定兩個源和一個目標__-加菲网,能非常靈活的支持二元操作與賦值的組合|--托儿费。ARM處理器的主要指令集就是三地址形式的-镇江老兵被打事件。

二地址指令

a += b;

變成:

add a, b

這就是所謂'二地址指令'_-优酷加速器官方免费下载,一般形式為_|广州公交月票:

op dest, src

它要支持二元操作_--海带的血型是,就隻能把其中一個源同時也作為目標_|_花都南湖国旅。上麵的add a, b在執行過後||_注册盈彩安全吗,就會破壞a原有的值|-主持人大鹏,而b的值保持不變-|诱捕野猪人。x86係列的處理器就是二地址形式的||-隆兴行。

一地址指令

顯然__长春市停水通知,指令集可以是任意'n地址'的||暖流作文,n屬於自然數||-赢咖娱乐怎么玩。那麼一地址形式的指令集是怎樣的呢-|_卓易彩票计划软件?

想像一下這樣一組指令序列-女足名单:

add 5

sub 3

這隻指定了操作的源--_陈百强演唱会高清,那目標是什麼||-珠海电大成绩查询?一般來說_|漯河军嫂被拘留,這種運算的目標是被稱為'累加器'(accumulator)的專用寄存器_-白看电视,所有運算都靠更新累加器的狀態來完成-||106福利版彩票正规吗?。那麼上麵兩條指令用C來寫就類似-|优彩app:

C代碼 收藏代碼

acc += 5;

acc -= 3;

隻不過acc是'隱藏'的目標|_|11068移动彩票登陆。基於累加器的架構近來比較少見了-_quickoffice下载,在很老的機器上繁榮過一段時間-|石家庄口碑网。

零地址指令

那'n地址'的n如果是0的話呢|-_永胜讨债2000会上门吗?

看這樣一段Java字節碼__|丁丁网 南京:

Java bytecode代碼 收藏代碼

iconst_1

iconst_2

iadd

istore_0

注意那個iadd(表示整型加法)指令並沒有任何參數|赢彩彩票苹果版。連源都無法指定了_|意彩会员注册,零地址指令有什麼用|--爱包网?_|日本地震最新消息2018?

零地址意味著源與目標都是隱含參數---美国实体娃娃,其實現依賴於一種常見的數據結構——沒錯铜陵教师罢课,就是棧--我要看一级片。上麵的iconst_1---当前热门话题、iconst_2兩條指令_|小爸爸土豆,分別向一個叫做'求值棧'(evaluation stack--车模走秀乳罩脱落,也叫做operand stack'操作數棧'或者expression stack'表達式棧')的地方壓入整型常量1-__秦岚女儿、2--上海大火。iadd指令則從求值棧頂彈出2個值众亿彩票首页,將值相加|--虹口区小学排名,然後把結果壓回到棧頂-_35彩票网页版。istore_0指令從求值棧頂彈出一個值|-保定独立团网,並將值保存到局部變量區的第一個位置(slot 0)_-10500com。

零地址形式的指令集一般就是通過'基於棧的架構'來實現的_|_168彩票是国家彩票吗。請一定要注意|-|美女一级片,這個棧是指'求值棧'|_众乐彩票合法吗,而不是與係統調用棧(system call stack--|库提价,或者就叫system stack)|-_19500彩票网苹果版。千萬別弄混了|--银川到上海火车。有些虛擬機把求值棧實現在係統調用棧上_|最新刷q币软件,但兩者概念上不是一個東西--小学生风景画。

由於指令的源與目標都是隱含的||_小米盒子越狱教程,零地址指令的'密度'可以非常高——可以用更少空間放下更多條指令__-dhc滋养化妆水。因此在空間緊缺的環境中__众发彩票平台,零地址指令是種可取的設計-||张柏芝约谈谢霆锋。但零地址指令要完成一件事情|_-莅临参加,一般會比二地址或者三地址指令許多更多條指令_|164期十四场胜负彩开奖。上麵Java字節碼做的加法|-尊龙娱乐人现金,如果用x86指令兩條就能完成了||注册送38彩金APP:

mov eax, 1

add eax, 2

基於棧與基於寄存器結構的區別

保存臨時值的位置不同
  • 基於棧-|陆贞传奇百度影音:將臨時值保存在求值棧上__|角竹光寿。 基於寄存器_|生化危机同人h:將臨時值保存在寄存器中_|-陈文松。 代碼所占體積不同
    • 基於棧美罗城 种子:代碼緊湊_谷子产地,體積小-1288彩票是不是黑平台,但所需要的代碼條件多 基於寄存器|静音飞翼龙:代碼相對大些--198彩票,但所需要的代碼條件少

      基於棧中的'棧'指的是'求值棧'-|_鞍山有线,JVM中'求值棧'被稱為'操作數棧'|_雨小薇。

      棧幀

      棧幀也叫過程活動記錄-|干洗价格,是編譯器用來實現過程/函數調用的一種數據結構-_|自制豆汁。從邏輯上講_|-南平市立医院,棧幀就是一個函數執行的環境||4466k最近10天更新:函數參數||_土元养殖加盟骗局、函數的局部變量_-盈彩娱乐是骗局吗、函數執行完後返回到哪裏等等---注册送彩金APP。

      藍圖虛擬機的實現

      前麵我們已經簡單得介紹了虛擬機的相關術語-_11选5走势图软件,接下來我們來具體講解下虛幻4中藍圖虛擬機的實現---0x00070001。

      字節碼

      虛擬機的字節碼在Script.h文件中__土左旗吧,這裏我們把它全部列出來|-妖魔项链,因為是專用的腳本語言诺基亚cdma手机大全,所以它裏麵會有一些特殊的字節碼||-四川特色文化,如代理相關的代碼(EX_BindDelegate-摩托车驾驶证查询、EX_AddMulticastDelegate)_-金立gn380刷机,當然常用的語句也是有的_|_众赢彩票是正规平台吗,比如賦值_--meyeeka、無條件跳轉指令-唐人街导航、條件跳轉指令||掌游彩趣味台球、switch等__陈梓嘉。

        1 //
        2 
        3 // Evaluatable expression item types.
        4 
        5 //
        6 
        7 enum EExprToken
        8 
        9 {
       10 
       11     // Variable references.
       12 
       13     EX_LocalVariable        = 0x00,    // A local variable.
       14 
       15     EX_InstanceVariable        = 0x01,    // An object variable.
       16 
       17     EX_DefaultVariable        = 0x02, // Default variable for a class context.
       18 
       19     //                        = 0x03,
       20 
       21     EX_Return                = 0x04,    // Return from function.
       22 
       23     //                        = 0x05,
       24 
       25     EX_Jump                    = 0x06,    // Goto a local address in code.
       26 
       27     EX_JumpIfNot            = 0x07,    // Goto if not expression.
       28 
       29     //                        = 0x08,
       30 
       31     EX_Assert                = 0x09,    // Assertion.
       32 
       33     //                        = 0x0A,
       34 
       35     EX_Nothing                = 0x0B,    // No operation.
       36 
       37     //                        = 0x0C,
       38 
       39     //                        = 0x0D,
       40 
       41     //                        = 0x0E,
       42 
       43     EX_Let                    = 0x0F,    // Assign an arbitrary size value to a variable.
       44 
       45     //                        = 0x10,
       46 
       47     //                        = 0x11,
       48 
       49     EX_ClassContext            = 0x12,    // Class default object context.
       50 
       51     EX_MetaCast = 0x13, // Metaclass cast.
       52 
       53     EX_LetBool                = 0x14, // Let boolean variable.
       54 
       55     EX_EndParmValue            = 0x15,    // end of default value for optional function parameter
       56 
       57     EX_EndFunctionParms        = 0x16,    // End of function call parameters.
       58 
       59     EX_Self                    = 0x17,    // Self object.
       60 
       61     EX_Skip                    = 0x18,    // Skippable expression.
       62 
       63     EX_Context                = 0x19,    // Call a function through an object context.
       64 
       65     EX_Context_FailSilent    = 0x1A, // Call a function through an object context (can fail silently if the context is NULL; only generated for functions that don't have output or return values).
       66 
       67     EX_VirtualFunction        = 0x1B,    // A function call with parameters.
       68 
       69     EX_FinalFunction        = 0x1C,    // A prebound function call with parameters.
       70 
       71     EX_IntConst                = 0x1D,    // Int constant.
       72 
       73     EX_FloatConst            = 0x1E,    // Floating point constant.
       74 
       75     EX_StringConst            = 0x1F,    // String constant.
       76 
       77     EX_ObjectConst         = 0x20,    // An object constant.
       78 
       79     EX_NameConst            = 0x21,    // A name constant.
       80 
       81     EX_RotationConst        = 0x22,    // A rotation constant.
       82 
       83     EX_VectorConst            = 0x23,    // A vector constant.
       84 
       85     EX_ByteConst            = 0x24,    // A byte constant.
       86 
       87     EX_IntZero                = 0x25,    // Zero.
       88 
       89     EX_IntOne                = 0x26,    // One.
       90 
       91     EX_True                    = 0x27,    // Bool True.
       92 
       93     EX_False                = 0x28,    // Bool False.
       94 
       95     EX_TextConst            = 0x29, // FText constant
       96 
       97     EX_NoObject                = 0x2A,    // NoObject.
       98 
       99     EX_TransformConst        = 0x2B, // A transform constant
      100 
      101     EX_IntConstByte            = 0x2C,    // Int constant that requires 1 byte.
      102 
      103     EX_NoInterface            = 0x2D, // A null interface (similar to EX_NoObject, but for interfaces)
      104 
      105     EX_DynamicCast            = 0x2E,    // Safe dynamic class casting.
      106 
      107     EX_StructConst            = 0x2F, // An arbitrary UStruct constant
      108 
      109     EX_EndStructConst        = 0x30, // End of UStruct constant
      110 
      111     EX_SetArray                = 0x31, // Set the value of arbitrary array
      112 
      113     EX_EndArray                = 0x32,
      114 
      115     //                        = 0x33,
      116 
      117     EX_UnicodeStringConst = 0x34, // Unicode string constant.
      118 
      119     EX_Int64Const            = 0x35,    // 64-bit integer constant.
      120 
      121     EX_UInt64Const            = 0x36,    // 64-bit unsigned integer constant.
      122 
      123     //                        = 0x37,
      124 
      125     EX_PrimitiveCast        = 0x38,    // A casting operator for primitives which reads the type as the subsequent byte
      126 
      127     //                        = 0x39,
      128 
      129     //                        = 0x3A,
      130 
      131     //                        = 0x3B,
      132 
      133     //                        = 0x3C,
      134 
      135     //                        = 0x3D,
      136 
      137     //                        = 0x3E,
      138 
      139     //                        = 0x3F,
      140 
      141     //                        = 0x40,
      142 
      143     //                        = 0x41,
      144 
      145     EX_StructMemberContext    = 0x42, // Context expression to address a property within a struct
      146 
      147     EX_LetMulticastDelegate    = 0x43, // Assignment to a multi-cast delegate
      148 
      149     EX_LetDelegate            = 0x44, // Assignment to a delegate
      150 
      151     //                        = 0x45,
      152 
      153     //                        = 0x46, // CST_ObjectToInterface
      154 
      155     //                        = 0x47, // CST_ObjectToBool
      156 
      157     EX_LocalOutVariable        = 0x48, // local out (pass by reference) function parameter
      158 
      159     //                        = 0x49, // CST_InterfaceToBool
      160 
      161     EX_DeprecatedOp4A        = 0x4A,
      162 
      163     EX_InstanceDelegate        = 0x4B,    // const reference to a delegate or normal function object
      164 
      165     EX_PushExecutionFlow    = 0x4C, // push an address on to the execution flow stack for future execution when a EX_PopExecutionFlow is executed. Execution continues on normally and doesn't change to the pushed address.
      166 
      167     EX_PopExecutionFlow        = 0x4D, // continue execution at the last address previously pushed onto the execution flow stack.
      168 
      169     EX_ComputedJump            = 0x4E,    // Goto a local address in code, specified by an integer value.
      170 
      171     EX_PopExecutionFlowIfNot = 0x4F, // continue execution at the last address previously pushed onto the execution flow stack, if the condition is not true.
      172 
      173     EX_Breakpoint            = 0x50, // Breakpoint. Only observed in the editor, otherwise it behaves like EX_Nothing.
      174 
      175     EX_InterfaceContext        = 0x51,    // Call a function through a native interface variable
      176 
      177     EX_ObjToInterfaceCast = 0x52,    // Converting an object reference to native interface variable
      178 
      179     EX_EndOfScript            = 0x53, // Last byte in script code
      180 
      181     EX_CrossInterfaceCast    = 0x54, // Converting an interface variable reference to native interface variable
      182 
      183     EX_InterfaceToObjCast = 0x55, // Converting an interface variable reference to an object
      184 
      185     //                        = 0x56,
      186 
      187     //                        = 0x57,
      188 
      189     //                        = 0x58,
      190 
      191     //                        = 0x59,
      192 
      193     EX_WireTracepoint        = 0x5A, // Trace point. Only observed in the editor, otherwise it behaves like EX_Nothing.
      194 
      195     EX_SkipOffsetConst        = 0x5B, // A CodeSizeSkipOffset constant
      196 
      197     EX_AddMulticastDelegate = 0x5C, // Adds a delegate to a multicast delegate's targets
      198 
      199     EX_ClearMulticastDelegate = 0x5D, // Clears all delegates in a multicast target
      200 
      201     EX_Tracepoint            = 0x5E, // Trace point. Only observed in the editor, otherwise it behaves like EX_Nothing.
      202 
      203     EX_LetObj                = 0x5F,    // assign to any object ref pointer
      204 
      205     EX_LetWeakObjPtr        = 0x60, // assign to a weak object pointer
      206 
      207     EX_BindDelegate            = 0x61, // bind object and name to delegate
      208 
      209     EX_RemoveMulticastDelegate = 0x62, // Remove a delegate from a multicast delegate's targets
      210 
      211     EX_CallMulticastDelegate = 0x63, // Call multicast delegate
      212 
      213     EX_LetValueOnPersistentFrame = 0x64,
      214 
      215     EX_ArrayConst            = 0x65,
      216 
      217     EX_EndArrayConst        = 0x66,
      218 
      219     EX_AssetConst            = 0x67,
      220 
      221     EX_CallMath                = 0x68, // static pure function from on local call space
      222 
      223     EX_SwitchValue            = 0x69,
      224 
      225     EX_InstrumentationEvent    = 0x6A, // Instrumentation event
      226 
      227     EX_ArrayGetByRef        = 0x6B,
      228 
      229     EX_Max                    = 0x100,
      230 
      231 };

      棧幀

      在Stack.h中我們可以找到FFrame的定義-广州世界大观,雖然它定義的是一個結構體_-|谁能百里挑一王可达,但是執行當前代碼的邏輯是封裝在這裏麵的-|_小爸爸李三妹妈妈。下麵讓我們看一下它的數據成員_--易赢在线注册:

       1   // Variables.
       2 
       3     UFunction* Node;
       4 
       5     UObject* Object;
       6 
       7     uint8* Code;
       8 
       9     uint8* Locals;
      10 
      11  
      12 
      13     UProperty* MostRecentProperty;
      14 
      15     uint8* MostRecentPropertyAddress;
      16 
      17  
      18 
      19     /** The execution flow stack for compiled Kismet code */
      20 
      21     FlowStackType FlowStack;
      22 
      23  
      24 
      25     /** Previous frame on the stack */
      26 
      27     FFrame* PreviousFrame;
      28 
      29  
      30 
      31     /** contains information on any out parameters */
      32 
      33     FOutParmRec* OutParms;
      34 
      35  
      36 
      37     /** If a class is compiled in then this is set to the property chain for compiled-in functions. In that case, we follow the links to setup the args instead of executing by code. */
      38 
      39     UField* PropertyChainForCompiledIn;
      40 
      41  
      42 
      43     /** Currently executed native function */
      44 
      45     UFunction* CurrentNativeFunction;
      46 
      47  
      48 
      49     bool bArrayContextFailed;

      我們可以看到___小米3发布会ppt,它裏麵保存了當前執行的腳本函數_-_易玩娱乐平台,執行該腳本的UObject-|91160,當前代碼的執行位置|_96135商旅网,局部變量|_|北京黄标车报废补贴,上一個棧幀|_-约彩彩票注册失败,調用返回的參數(不是返回值)-_|n79论坛,當前執行的原生函數等_|-2019年彩牛网。而調用函數的返回值是放在了函數調用之前保存---跑狼电动车报价,調用結束後再恢複||dnf王者之星多少钱。大致如下所示|_基督教赞美诗歌曲:

      1 uint8 * SaveCode = Stack.Code;
      2 
      3 // Call function
      4 
      5 ….
      6 
      7 Stack.Code = SaveCode

      下麵我們列出FFrame中跟執行相關的重要函數--bt核电站:

        1     // Functions.
        2 
        3     COREUOBJECT_API void Step( UObject* Context, RESULT_DECL );
        4 
        5  
        6 
        7     /** Replacement for Step that uses an explicitly specified property to unpack arguments **/
        8 
        9     COREUOBJECT_API void StepExplicitProperty(void*const Result, UProperty* Property);
       10 
       11  
       12 
       13     /** Replacement for Step that checks the for byte code, and if none exists, then PropertyChainForCompiledIn is used. Also, makes an effort to verify that the params are in the correct order and the types are compatible. **/
       14 
       15     template<class TProperty>
       16 
       17     FORCEINLINE_DEBUGGABLE void StepCompiledIn(void*const Result);
       18 
       19  
       20 
       21     /** Replacement for Step that checks the for byte code, and if none exists, then PropertyChainForCompiledIn is used. Also, makes an effort to verify that the params are in the correct order and the types are compatible. **/
       22 
       23     template<class TProperty, typename TNativeType>
       24 
       25     FORCEINLINE_DEBUGGABLE TNativeType& StepCompiledInRef(void*const TemporaryBuffer);
       26 
       27  
       28 
       29     COREUOBJECT_API virtual void Serialize( const TCHAR* V, ELogVerbosity::Type Verbosity, const class FName& Category ) override;
       30 
       31     
       32 
       33     COREUOBJECT_API static void KismetExecutionMessage(const TCHAR* Message, ELogVerbosity::Type Verbosity, FName WarningId = FName());
       34 
       35  
       36 
       37     /** Returns the current script op code */
       38 
       39     const uint8 PeekCode() const { return *Code; }
       40 
       41  
       42 
       43     /** Skips over the number of op codes specified by NumOps */
       44 
       45     void SkipCode(const int32 NumOps) { Code += NumOps; }
       46 
       47  
       48 
       49     template<typename TNumericType>
       50 
       51     TNumericType ReadInt();
       52 
       53     float ReadFloat();
       54 
       55     FName ReadName();
       56 
       57     UObject* ReadObject();
       58 
       59     int32 ReadWord();
       60 
       61     UProperty* ReadProperty();
       62 
       63  
       64 
       65     /** May return null */
       66 
       67     UProperty* ReadPropertyUnchecked();
       68 
       69  
       70 
       71     /**
       72 
       73      * Reads a value from the bytestream, which represents the number of bytes to advance
       74 
       75      * the code pointer for certain expressions.
       76 
       77      *
       78 
       79      * @param    ExpressionField        receives a pointer to the field representing the expression; used by various execs
       80 
       81      *                                to drive VM logic
       82 
       83      */
       84 
       85     CodeSkipSizeType ReadCodeSkipCount();
       86 
       87  
       88 
       89     /**
       90 
       91      * Reads a value from the bytestream which represents the number of bytes that should be zero'd out if a NULL context
       92 
       93      * is encountered
       94 
       95      *
       96 
       97      * @param    ExpressionField        receives a pointer to the field representing the expression; used by various execs
       98 
       99      *                                to drive VM logic
      100 
      101      */
      102 
      103     VariableSizeType ReadVariableSize(UProperty** ExpressionField);

      像ReadInt()--|祛疤整形医院、ReadFloat()-_康熙与太子妃高h、ReadObject()等這些函數长江电力商务,我們看到它的名字就知道它是做什麼的-|-36选7好彩3复式价格表,就是從代碼中讀取相應的int-|008彩票论坛!、float_-顺丰优选、UObject等|__白洁在亲戚家被陈三日。這裏我們主要說下Step()函數__里程碑3怎么样,它的代碼如下所示-青岛62中:

      1 void FFrame::Step(UObject *Context, RESULT_DECL)
      2 
      3 {
      4 
      5     int32 B = *Code++;
      6 
      7     (Context->*GNatives[B])(*this,RESULT_PARAM);
      8 
      9 }

      可以看到|||许宗衡简历,它的主要作用就是取出指令||索爱w610,然後在原生函數數組中找到對應的函數去執行--|羽毛球陈龙。

      字節碼對應函數

      前麵我們列出了所有的虛擬機的所有字節碼_云樊网络官方业务,那麼對應每個字節碼具體執行部分的代碼在哪裏呢_-陈丽华 前夫,具體可以到ScriptCore.cpp中查找定義|_青岛华臣影院影讯,我們可以看到每個字節碼對應的原生函數都在GNatives和GCasts裏麵|-武汉市新洲区黑社会:

      它們的聲明如下||注册认证赠送彩金:

      1 /** The type of a native function callable by script */
      2 
      3 typedef void (UObject::*Native)( FFrame& TheStack, RESULT_DECL );
      4 
      5 Native GCasts[];
      6 
      7 Native GNatives[EX_Max];

      這樣它都會對每一個原生函數調用一下注冊方法_-|106购彩平台,通過IMPLEMENT_VM_FUNCTION和IMPLEMENT_CAST_FUNCTION宏實現|-何家驹快播。

      具體代碼如下圖所示--_舞空术:

       1 #define IMPLEMENT_FUNCTION(cls,func) 
       2 
       3     static FNativeFunctionRegistrar cls##func##Registar(cls::StaticClass(),#func,(Native)&cls::func);
       4 
       5  
       6 
       7 #define IMPLEMENT_CAST_FUNCTION(cls, CastIndex, func) 
       8 
       9     IMPLEMENT_FUNCTION(cls, func); 
      10 
      11     static uint8 cls##func##CastTemp = GRegisterCast( CastIndex, (Native)&cls::func );
      12 
      13  
      14 
      15 #define IMPLEMENT_VM_FUNCTION(BytecodeIndex, func) 
      16 
      17     IMPLEMENT_FUNCTION(UObject, func) 
      18 
      19     static uint8 UObject##func##BytecodeTemp = GRegisterNative( BytecodeIndex, (Native)&UObject::func );

      可以看到||-云端彩票,它是定義了一個全局靜態對象_-530u3b,這樣就會在程序的main函數執行前就已經把函數放在數組中對應的位置了__立冬立秋诗句,這樣在虛擬機執行時就可以直接調用到對應的原生函數了-_佳佳宠儿。

      執行流程

      我們前麵講藍圖的時候講過藍圖如何跟C++交互-|至尊时时彩票平台,包括藍圖調用C++代碼_-|男士眼霜,以及從C++代碼調用到藍圖裏麵去|雪碧真我篮球六人行。

      C++調用藍圖函數

       1 UFUNCTION(BlueprintImplementableEvent, Category = 'AReflectionStudyGameMode')
       2 
       3 void ImplementableFuncTest();
       4 
       5  
       6 
       7 void AReflectionStudyGameMode::ImplementableFuncTest()
       8 
       9 {
      10 
      11 ProcessEvent(FindFunctionChecked(REFLECTIONSTUDY_ImplementableFuncTest),NULL);
      12 
      13 }

      因為我們這個函數沒有參數_||铜仁市人民政府网,所有ProcessEvent中傳了一個NULL|__阜南教育网,如果是有參數和返回值等|-重庆南滨路渝信川菜,那麼UHT會自動生成一個結構體用於存儲參數和返回值等__-优信彩票快三,這樣當在C++裏麵調用函數時---中国专科学校排名,就會去找REFLECTIONSTUDY_ImplementableFuncTest這個名字對應的藍圖UFunction_|_临沂大学数字化校园,如果找到那麼就會調用ProcessEvent來做進一步的處理-|-小学优秀教师事迹材料。

      ProcessEvent流程

      藍圖調用C++函數

       1 UFUNCTION(BlueprintCallable, Category = 'AReflectionStudyGameMode')
       2 
       3 void CallableFuncTest();
       4 
       5  
       6 
       7 DECLARE_FUNCTION(execCallableFuncTest) 
       8 
       9 { 
      10 
      11 P_FINISH; 
      12 
      13 P_NATIVE_BEGIN; 
      14 
      15 this->CallableFuncTest(); 
      16 
      17 P_NATIVE_END; 
      18 
      19 }

      如果是通過藍圖調用的C++函數___快乐大本营之棒棒堂,那麼UHT會生成如上的代碼|08彩票注册,並且如果有參數的話|-_狩猎狂狮,會調用P_GET_UBOOL等來獲取對應的參數-_|1000彩票,如果有返回值的話也會將返回值賦值-_-3cp彩票首页。

      總結

      至此|--章鱼彩票如何提现,加上前麵我們對藍圖編譯的剖析-|-诺基亚5230pc套件官方下载,加上藍圖虛擬機的講解_--陕西省府谷县,我們已經對藍圖的實現原理有一個比較深入的了解_-_黄金减毒烟嘴,本文並沒有對藍圖的前身unrealscript進行詳細的講解|绍兴特色菜。有了這個比較深入的認識後(如果想要有深刻的認識|--四川特色文化,必須自己去看代碼)|--尼采s3,相信大家在設計藍圖時會更遊刃有餘|--何小萌萌萌新浪微博。當然如果有錯誤的地方也請大家指正|-_乒乓球教学视频下载,歡迎大家踴躍討論-||1分快3是不是正规的。接下來可能會把重心放到虛幻4渲染相關的模塊上-|国培网,包括渲染API跨平台相關-_黑社会砍人,多線程渲染---世界杯草坪多少钱,渲染流程-铁路安全保护条例,以及渲染算法上麵_-阜南教育局,可能中間也會穿插一些其他的模塊(比如動畫-|集芙蓉以为裳、AI等)|采花小绵羊,歡迎大家持續關注|苏州联建科技倒闭,如果你有想提前了解的章節_|闲花弄影结局,也歡迎在下麵留言_艾儿兰德 鲍德温,我可能會根據大家的留言來做優先級調整-_-256手机彩票网网址。

      參考文章

      https://www.usenix.org/legacy/events/vee05/full_papers/p153-yunhe.pdf http://rednaxelafx.iteye.com/blog/492667 http://www.zhihu.com/question/19608553 https://zh.wikipedia.org/wiki/%E8%99%9B%E6%93%AC%E6%A9%9F%E5%99%A8 Java Program in Action 莫樞

延伸閱讀-_|长恨春寻无觅处:

Tag標簽|四川达州洪水: 藍圖   虛幻  
  • 專題推薦

  • Windows7係統入門 優化 技巧技術專題
  • Windows7係統專題 無論是升級操作係統||海葬费用、資料備份_||普陀山旅游线路 同程、加強資料的安全及管...... 詳細
About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
幸运蛋蛋全民彩票幸运蛋蛋众发彩票盛兴彩票秒速赛车

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!