2018-10-19 01:30:00 u012614151 阅读数 5
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2377 人正在学习 去看看 杨石兴

(原、整) 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:

 

总结

 

2018-10-19 23:12:00 u012614151 阅读数 4
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2377 人正在学习 去看看 杨石兴

@author:白袍小道

说明

1、由于小道就三境武夫而已,而UE渲染部分不仅管理挺大,而且牵扯技术和内容驳杂,所以才有这篇梳理。

2、尽量会按书籍和资料,源码,小模块的调试和搬山(就是敲键盘)。。等来求个明白清楚,为此感谢有这些良田美玉。

老规矩先有规则,后实践,颠颠撞撞总能摸得(至于理解结果各不同)

前言:

UE这部分,主要涉及到的模块有Render,RenderCore,RHI,Core。

关于UE渲染的模块和框架设计是放到最后统一来分析,前面一般都是源码说明,资料,实现,结论的穿插。

   

正文

这里先把后续目录和简要列出(目录基本综合了几本书、资料、UE渲染管理来),后续是杂说但都是按这个结构。

目的是分析和对照实验(对比以前的才有伤害和回忆)

   

1、渲染管线和UE渲染模块

1.1 管线说明

1.2 UE渲染模块简单说明

1.3 程序和场景查询

1.4 几何

1.5 光栅

1.6 缓冲区

1.7 合并和呈现

1.8 UE流程

   

2、UE渲染有关资源

2.1、模型

2.2、纹理

2.3、材质

   

3、着色器

3.1 边界和域着色

3.2 几何着色

3,3 细分曲面

3,4 像素着色

   

4、视觉外观

4.1 光照和材质

4.2 UE的材质系统

4.3 着色

4.4 锯齿

4.5 透明

4.6 颜射空间

4.7 矫正

4.8 总结

   

5、纹理技术

5.1 Texture Pipeline

5.2 CubeMap, VolumnTexture

5.3 TextureCache, TextureStream

5.4 压缩和维护

5.5 程序纹理

5.8 NormalMap,AO/Mate/Rou几个简单说明

5.9 总结

   

6、着色技术

1、物理渲染的基础

2、分类

3、UE中物理渲染部分

4、UE高级着色部分

   

7、渲染方式

6.1 顶点逐像素

6.2 前向渲染(人话码:对每个物体逐像素计算光(几个)的累积效果的过程)

6.3 延时渲染 (人话码:先把最后的呈现(还没逐像素计算光)的效果得到(Gbuffer),最后再来逐像素计算光))

6.4 分块延时渲染,以及几个渲染路径

6.5 环境映射

   

8、全局光照

8.1 几种技术(光线,路径)

8.2 光遮挡

8.3 结果

   

9、图像的渲染技术

1、Spectrum, SkyBox

2、光彩

3、精灵和UI

4、公告板

5、UE ParticleSystem

6、颜色矫正和色调的映射

7、后期的Bloom,LensFlare, HDR

8、DOF和模糊

9、体渲染

   

10、NPR着色

1、卡通和轮廓

2、其他

   

11、渲染加速和优化

1、空间数据和裁剪

2、背面裁剪、层次视锥、入口裁剪

3、细节和遮挡

4、LOD

5、Point Render

   

12、UE渲染框架总说

1、Render框架和流程

2、渲染加速和渲染RHICommand封装部分

3、渲染线程

   

12、基础渲染的优化Policy和Detail

   

13、特殊效果

2016-11-14 08:29:18 wangnan8015 阅读数 3677
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2377 人正在学习 去看看 杨石兴

虚幻引擎源码分析(1)

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

2016-11-15 21:31:38 wangnan8015 阅读数 1822
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2377 人正在学习 去看看 杨石兴

虚幻引擎源码分析(4)

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

2011-03-14 22:05:00 pizi0475 阅读数 2733
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2377 人正在学习 去看看 杨石兴

Unreal3(以下简称U3)是一个以脚本为主体的游戏引擎,所有代码几乎都为脚本服务,意味着所有源码都会提供相应的脚本函数在脚本中使用。
UObject是U3中很重要的一个基类,所有由UObject派生的类都可以导出到脚本中(不从UObject派生行不行?不知道呢),但我对U3的脚本不熟。暂且从C++角度来分析下UObject是如何实现的。
UObject顾名思义是一个“基本对象”,材质、mesh、文件、玩家等等都是从这个UObject继承而来,这个类做了很多事情:

1、属性的统一访问接口,脚本中就可以通过这个接口来访问属性了;
2、成员函数的统一访问接口,脚本中可以通过这些接口来调用UObject或其派生类的成员函数;
3、串行化的统一接口,实现了一个保存所有对象的UPackage包管理器,从而做到保存到二进制文件、从二进制文件读取,这样做的好处是持久化对象(比如游戏中的材质列表)的载入非常快速,由于是二进制格式,不需要任何字符串数据转换;
4、提供对象的垃圾回收功能;
5、提供编辑器的相应功能,如:对象的“属性”有各种编辑器所需的标记(是否可编辑CPF_Edit等)、对象在编辑器中的渲染DrawThumbnail、对象描述GetThumbnailDesc、对象选择IsSelected、是否更改了包MarkPackageDirty等等;
6、提供一个对象的管理器,这个对象管理器是通过UObject中的一堆静态函数来实现的,如:从管理器中查找一个对象StaticFindObject、分配一个对象StaticAllocateObject、从包中载入一个对象StaticLoadObject、根据类型来遍历管理器中的所有对象FObjectIterator/TObjectIterator、遍历所有选择了的对象TSelectedObjectIterator(编辑器使用)
7、提供配置管理器,通过UObject中的LoadConfig、SaveConfig实现
8、提供类描述信息,描述了这个类从哪个类派生、有什么属性、每个属性的访问方式、有什么函数,从而实现了动态类型判断、脚本属性访问、脚本函数访问、属性串行化等等
9、其他。。。。

简单分析下UObject中的各个成员变量的意义:
Index,用来记录这个UObject在所有UObject列表GObjObjects中的唯一索引
HashNext,用来记录全局UObject Hash表GObjHash中跟这个UObject 的Hash值相同的下一个UObject的指针,用来配合全局Hash表GObjHash通过StaticFindObject函数快速搜索一个指定名称的UObject
StateFrame,脚本相关的咚咚,还没看
_Linker,通过在包文件中载入时的载入器
_LinkerIndex,通过包文件载入时的UPackage包对象在GObjObjects中的唯一索引,相当于Outer->Index
Outer,这个对象所属的包
ObjectFlags,这个对象的一些标记,具体参见EObjectFlags枚举,不同标记来决定这个对象的一些行为,比如是否可以保存、是否可见等等
Name,对象名称,通过一个FName来实现,这个FName可是个好东西哦,字符串比较变成了一个Hash值比较
Class,用来描述这个类,就是以上第1、2、8点说到的。这个Class在调用UObject::StaticClass或派生类的StaticClass静态函数时会一次性初始化,意味着即使创建多少个UObject,但Class只会有一个实例,我们通过这个类,可以使用TFieldIterator的统一方式来遍历这个类的所有属性、函数。

UObject的静态变量,这些静态变量其实就是UObject对象管理器使用的变量,如果用Ogre的设计方法来做,就相当于另外一个class UObjectManager : public Singleton<UObjectManager>,然后在里面把这些静态变量拿到UObjectManager中去。简要分析下静态变量的意义:
GObjInitialized,对象管理器是否已经初始化,全局对象管理器只需要初始化一次就够了;
GObjNoRegister,调用StaticInit时会设置成1;
GObjBeginLoadCount,有多少个对象被BeginLoad了;
GObjRegisterCount,ProcessRegistrants中使用
GImportCount,还没细看哦
GObjHash,通过每个UObject的Name的Hash值取低12位作为索引值保存在GObjHash表中,Hash值的低12位相同的,只记录第一个在GObjHash表中,其他的通过链表方式使用UObject的HashNext来链接起来
GAutoRegister,自动注册的对象列表
GObjRoot,对象树种的顶层对象
GObjObjects,所有对象的列表

先说这么多了,继续学习。

没有更多推荐了,返回首页