(原、整) Unreal源码 CoreUbject- Uobject

类别                    [随笔分类]Unreal源码搬山

@author:白袍小道

随缘那啥

这里还是属于UE的源码解析(大言不惭,应该叫学习嘿嘿)目录。

说明

1、按引擎分层,这里应该属于Core后,引擎支撑中上层(还没到Core)

(额外说下分析UE的症状:

核心层[Core]是颤抖+苦笑

数据模型层[CoreUObject]头皮发麻+谄笑

引擎层1[Rneder,RHI,Physical,Anim。几个] 是头晕+呆笑

引擎层2[Render,Phy.Ani算法实现], 是难受+傻笑

引擎游戏性[Gameplay部分,接入蓝图虚拟机哪些]  绕绕绕+冲动

引擎的编辑器,工具,脚本【蓝图】材质特效,的实现是烦躁+开心

游戏部分,翻白+汗流浃背+开心。

2、因为GoreUObject起到承上启下的作用,灰常重要。所以得分很多目测30小部分来悄悄。而且这部分分析和总结的大神和经典文章也可以看到许多。这里小道主要按源码,图,文章,分析整理总结一二而得。

3、什么?如何做? 到为什么?然后反复几次,这是后面的写法。

关键词

Unreal:模版类型,类型系统,结构,UHT,反射,序列化,Meta(元数据),GC,

默认Object,属性集、引擎的内存管理(不是底层:页,双端,内存查找那些那啥),编辑器调整数据(EditorVisiable),

平衡和权衡

前言

首先先理解一些名称,有句话叫做 一个事物可以用一个名称+动词 去表述的话,就很舒服了,但理解和深入部分可以不断去整。

为何要看看?因为这些经常用到,能帮助我们偷懒和降低复杂度。

反射

程序在运行时进行自检的一种能力,是一种属性系统的控制。(自检:能检查出自己的组成或属性部分,但不能提前知道自己是啥)如:能列举出所有属性(属性本身也是个抽象封装),通过这封装知道属性是啥或者属于啥。

for (TFieldIterator<UProperty> PropIt(GetClass()); PropIt; ++PropIt)

{

UProperty* Property = *PropIt;

}

来自 <http://www.cnblogs.com/ghl_carmack/p/5698438.html>

注解和标记

一种代码级别的说明信息标识。UE这里就是一个宏,用来封装了由Unreal头文件工具解析的元数据,当然在c++编译器编译包含它们的代码时被忽略(因为最后用来编译的C++部分,是生成的啊)

UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Material, meta = (DisplayName = "Subsurface Profile"))

class USubsurfaceProfile* SubsurfaceProfile;

Local:    CoreUObject/Public/Uobject/ObjectMacros,UObjectMarks,

UBT和UHT:

UBT属性可以通过扫描头文件,记录任何至少有一个反射类型的头文件的模块,并且生成包含反射数据的C++代码(XXXmodule.generated.cpp中去)。如果任意一个比较上一次编译结果发生了变化,那么它会利用UHT更新反射数据。

(用生成的C++代码来存储反射数据的一个最大好处就是,它可以保证跟二进制做到同步。你永远也不会加载陈旧或者过时的反射数据,因为它是跟引擎的其它代码同时编译的,并且它会在程序启动的时候使用C++表达式来计算成员偏移等,而不是通过针对特定平台/编译器/优化的组合中进行逆向工程。UHT避免了所属关系导致的先后生成的问题,因为UHT作为一个单独的不使用任何生成头文件的程序来构建

来自 <http://www.cnblogs.com/ghl_carmack/p/5698438.html>

序列化

一个把对象的变量(应该叫属性),存储(传输也是一个存储)的过程。反之就反序列化。

Local:    Runtime/CoreUObject/Serialization/

默认Object

可以通过类获得默认对象,具体略

属性集

如C#的Assembly,命名空间等(一些抽象封装):如this.GetType().Assembly; 通过反射可以获得Type然后巴拉巴拉。

(C#元: class MemberInfo : ICustomAttributeProvider)原生C++莫有,那自己整整?。

编辑器编辑数据

能反射或列举就可以那啥了,

GC

引用计数,标记待清理,Link方式(Root配 Node这种),目的就是能适当的自动回收无用对象和避免回收了有用对象。

模版类型

略,模版、元什么的 小道不敢说,这个部分资料和代码也很多,各位看官那啥。(在CoreTemple 中倒是可以肤浅说丢丢)

听说UE3后期orUE4 :一为了跨平台和稳得住,二来为了迭代技术,三是历史原因(这什么产品和技术或者理论感觉都是有历史的部分因数的)

【这里扯淡,勿当真】

好多要整啊,那么。。。

1、但如果每个都单独整下就会很累,所以是不是有个不大不小,能恰当复合了部分组成一个模式让我们更简单的使用,但同时不会让这个太过庞大影响性能和掌控(单一的粒度)。

2、能不能有个辅助的工具,帮助我们更简单快速的黑箱制造过程。(工具

针对以上会得到几个想法前(憋住),我们先看UE的CoreUObject中UObject及其相关。

(以下尽量图为主,一来能看官可以对着源码或者调试时候那啥,二来一图胜许多节约能量)

(未完待续。。。。)

What:

从上图基本是

1、能看到UOBJECT作为一个基础,一来包含了常用的Object需要的行为及其为此提供的必要数据(序列化,反射,类型,回收等)

2、抽出了许多UXXX(定义),将属性抽象。

3、Unreal类型的含义:

派生自 Object 的类前缀为 U

Enums 的前缀为 E

Template 类的前缀为 T

其余类的前缀均为 字母 F 

HOW:(待续)

1、反射如何做到的?

2、序列化如何做到的?

3、回收和分配如何做到的?

4、查询和管理?

Why:

What:

How:

Why:

总结

(原、整)Unreal源码 CoreUbject- Uobject的更多相关文章

  1. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  2. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  3. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  4. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  5. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  6. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  7. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

  8. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  9. 【原】AFNetworking源码阅读(一)

    [原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...

随机推荐

  1. Gym 100090D Insomnia

    从 n 变到 1,有多少种方案? 打表记忆化. #include <bits/stdc++.h> using namespace std; int n; ]; int dfs(int n) ...

  2. vue中动画的封装

    <style> .v-enter,.v-leave-to{ opacity: 0; } .v-enter-active,.v-leave-active{ transition:opacit ...

  3. iOS 有些库只能在真机上运行,不能在模拟器上运行的解决方式

    在开发中,多少肯定会用到第三方的东西,或许大家也和我一样遇到到这样的情况,有些库正好适合自己的需求,但是这个库却只支持真机上运行,在模拟器上编译却不通过, 一般情况下,.a静态包,你刚刚导入的时候,不 ...

  4. 阅读detection

    关于detecion的几篇文章,感觉有必要系统学习一下,并记录一下了,最近看书比较多,文章看得少,赶紧看看吧. FPN:Feature Pyramid Networks for Object Dete ...

  5. python main

    python中的main函数,总体来说就是,main比较适合写test测试,有点类似于java中的testcase,就是程序单独运行时是运行main的,但是当被调用时就不会运行main了.具体可以参考 ...

  6. 1.Spring Cloud初相识--------简单项目搭建

    开发工具:STS 代码下载链接:GitHub管理项目 前言: Springcloud 算是当前比较火的技术,一套微服务架构的技术. 我个人对微服务的理解为: 服务可以代表service,微服务就是小的 ...

  7. 【经典问题】bzoj2957: 楼房重建

    经典问题:动态维护上升子序列长度 进阶问题:[经典问题]#176. 栈 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无 ...

  8. Spring Boot Common application properties(转载)

    转自官方文档:http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.h ...

  9. Linux新建用户后的必要设置

    系统:ubnutu 18.04  x64 以下操作全在root下 准备工作: 新建用户  useradd  -m  tom 初始化密码  passwd  tom 1. tab按键 不能自动单词不全 # ...

  10. 百度MIP校验错误整理与解决方法

    MIP校验工具地址: https://www.mipengine.org/validator/validate 1.强制性标签缺失或错误 错误提示:line 1,col 1: 强制性标签'<sc ...