【antivc源码】【热血仙境源码】【仿全景源码】Ue4 材质系统源码_ue4材质代码

时间:2024-11-17 13:49:13 编辑:约车源码 来源:his商业源码

1.UE4源码剖析——异步与并行 中篇 之 Thread
2.UE4源码剖析:MallocBinned(上)
3.UE4源码剖析——Actor蓝图之CDO与SCS
4.UE入门笔记(1):编译UE4源码 + apk打包
5.图解UE4源码 其三(一)行为树系统执行任务的材质材质流程 发起执行请求
6.UE4学习笔记(1):UE源码下载编译+安卓打包

Ue4 材质系统源码_ue4材质代码

UE4源码剖析——异步与并行 中篇 之 Thread

       我们知道UE中的异步框架分为TaskGraph与Thread两种,上篇教程我们学习了TaskGraph,系统它擅长处理有依赖关系的源码短任务;本篇教程我们将学习Thread,它与TaskGraph相反,代码它更擅长于处理长任务。材质材质而下一篇文章,系统antivc源码我们则会承接Thread,源码去学习一下引擎中一些重要的代码线程。

       Thread擅长处理长任务,材质材质从长任务生命周期这个层面来看,系统我们可以先把长任务分为两类:常驻型长任务与非常驻型长任务。源码

       常驻型长任务侧重于并行,代码通常用于监听式服务,材质材质例如网络传输,系统使用单独的源码线程对网络进行监听,每当有网络数据包到达时,线程接收并处理后,不会立即结束,而是重置部分状态,继续监听,等待下一轮数据包。

       非常驻型长任务侧重于异步,通常用于数据处理,例如主线程为了提高性能,避免卡顿,会将一些重负载的运算任务分发给分线程处理,可能分批给多条分线程,主线程继续运行其他逻辑。任务处理完成后,将结果返回给主线程,分线程可销毁。

       接下来,我们通过两个例子学习Thread的使用。

       计算由N到M(N和M为大数字)所有数字的和。使用Thread异步调用,将计算操作交由分线程执行,计算完成后再通知主线程结果,代码实现如下:

       逻辑分为两部分:启动分线程计算数字和,使用Async函数,热血仙境源码参数为EAsyncExecution::Thread,创建新线程执行。学习Async函数用法,该函数返回TFuture对象,代表未来状态,当前无法获取结果,但在未来某个时刻状态变为Ready,此时可通过TFuture获取结果。

       主线程注册回调,等待分线程计算完成,使用TFuture的Then函数,完成时触发注册的回调,也可使用Wait系列函数等待计算完成。

       接下来学习常驻型任务使用。

       定义玩家血量上限点,当前点,当血量未满时,每0.2秒恢复1点血量。代码实现分为创建生命治疗仪FRunnable对象、重写Run函数、创建FRunnableThread线程、测试恢复功能和释放线程资源。

       生命治疗仪创建与测试完整代码如下,可验证生命恢复功能和暂停与恢复。

       UE4中的FRunnable与FRunnableThread提供创建常驻型任务所需接口。无论是常驻型还是非常驻型,底层实现相同,都是使用FRunnableThread线程。

       FRunnableThread线程结构包含标识符、逻辑功能、效率与性能、辅助调试字段。线程创建与生命周期分为创建FRunnable类对象、创建FRunnableThread对象两步,通过FRunnable的生命周期管理实现线程运行与停止。

       UE4线程管理流程包括继承并创建FRunnable类对象、创建FRunnableThread对象,生命治疗仪线程创建代码。仿全景源码

       UE4中的几种异步方式底层使用线程实现,学习了线程类型、创建、生命周期、销毁方法,为下篇学习引擎特殊线程打下基础。

UE4源码剖析:MallocBinned(上)

       近期着手UE4项目开发,对UnrealEngine已久仰慕,终于得此机会深入探索。鉴于项目内存性能问题,决定从内存分配器着手,深入研读UE4源码。虽个人水平有限,尚不能全面理解,但愿借此机会揭开源码神秘面纱,让新手朋友们不再感到陌生。

       UE4内存分配器位于硬件抽象层HAL(Hardware Abstraction Layer)中。具体装箱内存分配器代码位于VS项目目录:UE4/Source/Runtime/Core/Private/HAL/MallocBinned。

       分析从ApplePlatformMemory::BaseAllocator开始,可发现Mac平台的默认分配器为MallocBinned,iOS的默认分配器为MallocAnsi。以下将重点分析MallocBinned。

       一、确定对齐方式

       FScopeLock用于局部线程锁,确保线程同步。关于Alignment的确定,通常使用默认值。默认值取决于内存对齐方式,此处默认对齐为8字节。

       二、确定有足够空间来内存对齐

       代码中,SpareBytesCount用于确认空间足够。若分配内存小于8字节,则按Alignment大小匹配箱体;若大于8字节,则按Size + Alignment - sizeof(FFreeMem)匹配箱体。

       三、确定箱体大小

       根据Size的大小,有三种不同的获取软件源码处理方式。k以下的内存分配采用装箱分配,PoolTable中包含个不同大小的池子。

       四、初始化内存池

       分析内存池初始化过程,主要工作包括:确定内存大小,分配内存块,设置内存池基本信息。

       五、内存装箱

       AllocateBlockFromPool从内存池中分配一个Block,实现内存装箱过程。

UE4源码剖析——Actor蓝图之CDO与SCS

       在UE的日常使用中,蓝图(UBlueprint)是我们接触最多的资产类型。每个蓝图在创建时需要选择一个父类,这决定了蓝图的类型,比如Actor蓝图、Component蓝图、Widget蓝图、动作蓝图等。以Actor蓝图为例,本文将深入探讨蓝图的基础架构,并学习如何通过代码读取蓝图资产在蓝图编辑器中的属性值。此外,本文还将重点介绍如何利用SCS框架管理新组件,并在运行时加载这些组件。

       在实际开发中,我们经常需要对蓝图进行处理,例如在大型项目中,制定一套资源规范并开发一套资源检测工具。这些工具往往需要遍历特定目录下的蓝图并执行某些条件判断和处理。本文将帮助大家了解如何实现这些功能。

       **实战需求**:

       1. **例1**:要求所有放置在“Buildings”文件夹下的蓝图必须包含`StaticMeshComponent`组件,且`StaticMesh`字段不能为空。

       2. **例2**:要求“Cars”文件夹下的所有蓝图的`SceneComponent`组件移动性必需为`Movable`。

       **蓝图的父类与Actor蓝图**:

       1. **蓝图的父类**:创建蓝图时,编辑器面板中选择的父类决定蓝图的类型,例如`TestActorChild2`的父类为`TestActorChild1`,而`TestActorChild1`的父类为`TestBlueprintActor`。

       2. **Actor蓝图**:若蓝图的在线定制源码父类层级链最顶层是`Actor 类`,则该蓝图为`Actor蓝图`。

       **蓝图产生类**:蓝图的`_C`后缀代表蓝图产生类,它用于在编译时生成C++类,包含蓝图中的信息。

       **蓝图类(UBlueprint)**:加载蓝图包时,通过`LoadObject`函数获取到的是`UBlueprint`类。

       **蓝图骨骼类(SkeletonGeneratedClass)**:以`SKEL_`前缀和`_C`后缀加载,表示蓝图的基础信息,通常在编辑器中修改时会重新生成。

       **蓝图产生类(GeneratedClass)**:仅以`_C`为后缀加载,用于在运行时创建蓝图对象。

       **前后缀声明**:`UBlueprint.h`中的`GetBlueprintClassNames`函数定义了这些前缀。

       **Actor蓝图产生类的实例化与阶段拆分**:

       1. **CDO的构建**:`ClassDefaultObject`是每个类的默认对象,用于提供默认属性值和行为。

       2. **SCS组件附加**:通过蓝图编辑器的组件面板添加组件,这些组件存储在`SimpleConstructionScript`中,用于在运行时添加组件。

       **CDO与SCS**:

       - **CDO**:存储默认属性值与行为,节省数据传输和存储,支持配置化。

       - **SCS**:简化组件添加过程,通过蓝图编辑器直观操作组件。

       **需求回顾与实现**:通过遍历CDO和SCS,判断组件属性值,实现特定条件的检测,如`StaticMeshComponent`的`StaticMesh`字段是否为空。

       本文从实际需求出发,全面介绍了蓝图的基本概念、内部分类、构建流程以及如何利用SCS管理组件。希望本文内容能帮助开发者更深入地理解蓝图的工作原理,提高资源管理与组件处理的效率。

UE入门笔记(1):编译UE4源码 + apk打包

       实验环境:win / VS专业版 / UE4..

       准备工作①获取UE4源码:按照官方教程,完成邮件确认后即可下载 UE4..2源码。

       记得下载Commit.gitdeps.xml文件,后续会用到。

       ②VS安装工具包:打开Visual Studio Installer,选中并安装

       2、编译

       下面操作均基于UE4源码文件夹

       ①执行bat文件

       a)运行setup.bat,如出现下面错误,则需要替换Commit.gitdeps.xml文件

       b)运行GenerateProjectFiles.bat,如出现下面错误,则将文件路径改短

       ②编译

       打开UE4.sln,右键UE4选“生成”,编译过程多分钟

       ③UE4,启动!

       编译完成后,打开Engine\Binaries\Win,找到UE4Editor.exe,即可启动。

       3、安卓环境配置

       下载Android Studio并在UE4部署安卓:参考官方教程以及UE部署到Android以及杂症的解决,配置过程较为复杂,一步步来不要跳步。

       4、打包并测试

       打包过程报错:

       ①packagingresults: error: failed to build "uattempproj.proj"

       解决:打开项目.sln,重新生成AutomationTool

       ②找不到dx文件

       解决:打开C:\Users\Administrator\AppData\Local\Android\Sdk\build-tools,将或版本文件夹中的dx.bat 和 lib 文件夹中的 dx.jar 复制到 .0.0 版本文件夹的对应位置。(build-tools从版本之后把dx的方式去掉了,而UE需要这个,没有的话会发布失败)

       手机测试报错:

       ①No Google Play Store Key

       解决:UE项目设置->Android中勾选“将游戏数据打包至.apk中”,重新打包

       参考链接

       ① UE部署到Android以及杂症的解决

       ② UE4学习笔记(1):UE源码下载编译+安卓打包

       ③ 油管教程《Unreal Engine 4..2 Packaging For Android | Unreal Engine 4..2 Export Android Project》

图解UE4源码 其三(一)行为树系统执行任务的流程 发起执行请求

       本文探讨UE4源码中的行为树系统执行任务流程,重点解析了发起执行请求的机制。在UE4中,行为树系统负责执行特定任务,而请求执行的关键代码在于调用`UBehaviorTreeComponent::RequestExecution()`函数。本文将分别从行为树加载后执行、任务执行完毕后搜索下一个任务、以及由Decorator引发的Abort请求三种情境出发,详细解析RequestExecution函数的内部逻辑。

       ### 引子一:已加载行为树的执行

       行为树加载完毕后,执行的关键代码就是发起执行请求。`RequestExecution()`函数的执行,实质上是开始执行行为树内的任务。在行为树加载后,调用此函数启动执行流程,开始搜索并执行任务。

       ### 引子二:任务执行完毕

       任务执行完成后,行为树会自动发起搜索和执行下一个任务的请求。这同样依赖于`RequestExecution()`函数,但调用方式不同,需要传入任务执行的结果作为参数。

       ### 引子三:TimeLimit修饰器

       UE4自带的`BTDecorator_TimeLimit`修饰器用于限制任务执行时间。当时间超过设定值,该修饰器会触发任务的Abort。分析其内部逻辑时,我们发现它通过调整时间计数器来控制任务执行时间,而不是通过直接中断任务。

       ### 发起执行请求的关键信息

       请求执行的过程涉及多个关键信息的传递,包括搜索的起始点和结束点、要执行的节点、上一次任务的结果、是否尝试执行下一个子节点等。这些信息构成`ExecutionRequest`结构体,由`RequestExecution()`函数生成。

       ### 新手难度:从行为树加载后讲起

       从行为树加载后执行为例,`RequestExecution()`函数仅做了初始化标志位、确定搜索范围、设定请求执行节点等基础操作。这些步骤为后续的执行流程做好准备。

       ### 中级难度:任务执行完毕后搜索下一个任务

       在任务执行完毕后,调用`RequestExecution()`以自动搜索下一个任务。此时,函数逻辑主要围绕上一次任务的结果,决定是否切换到更高优先级的任务。

       ### 终极难度:Decorator的Abort

       当Decorator引发任务中断时,`RequestExecution()`需要处理更复杂的逻辑,包括调整搜索范围、确保请求执行的节点符合特定条件。这涉及到更深入地理解行为树的结构和Decorator的工作机制。

       ### 应用——追查Decorator Abort记录

       通过分析`RequestExecution()`函数的调用记录,可以追踪行为树运行过程中由Decorator引发的中断事件,有助于深入了解行为树的执行流程和异常情况。

       本文通过对UE4源码中的`RequestExecution()`函数的深入分析,揭示了行为树系统执行任务流程中的关键机制,为理解和优化行为树的运行提供了理论基础和实践指导。

UE4学习笔记(1):UE源码下载编译+安卓打包

       注:该笔记以UE4..2在windows平台为例,vs版本为

       1.关联github和Epic账户

       要在github上获取UE4源码需要先关联账户,否则找不到源码,网页

       按照官网提供流程即可完成 GitHub上的虚幻引擎 - Unreal Engine

       记得确认邮件,否则还是(当初就是忘记了,卡了好一会儿)

       2.下载UE4源码

       在 Releases · EpicGames/UnrealEngine (github.com)中选择自己需要的版本(我使用的是4..2),这步很简单,但需要注意的是还需要将Commit.gitdeps.xml文件也一并下载,用于替换同名文件(有些版本则没有这样的文件),不替换的话后续会报错(之后步骤中会提到)

       解压后目录如下:

       3.执行bat文件

       (1)点击运行setup.bat,没有替换Commit.gitdeps.xml文件可能会出现如下问题:

       (2)点击运行GenerateProjectFiles.bat,此过程可能会出现如下问题:

       未找到框架 .NETFramework Version=v4.6.2

       只需要在VS Installer中选中安装就行:

       完成后会生成UE4.sln文件

       4.生成

       VS打开UE4.sln,开始生成:

       但是生成过程中我出现了这样的问题:

       UE4 fatal error C: 编译器限制: 达到内部堆限制

       error C: 超过了 PCH 的虚拟内存范围问题解决

       我出现这样问题的原因是我的C盘空间不够大(分区的时候给的比较少),托管系统设置在C盘,导致无法分配足够的虚拟内存,设置为空间足够的盘即可。

       步骤:电脑->属性->高级系统设置->高级->性能设置->高级->更改

       OK,成功编译完成

       5.安卓打包

       该过程有官方文档,并且比较繁琐,直接给出链接:

       设置虚幻的Android SDK和NDK | 虚幻引擎文档 (unrealengine.com)

       UE部署到Android以及杂症的解决 - 知乎 (zhihu.com)

       我就提一下自己遇到的问题,在UE4中进行安卓打包的时候遇到了这样的问题:

       原因在于SetupAndroid.bat中,SDK Platform的版本选择是,而在UE项目设置->平台 - Android SDK中的SDK API Levle默认选择latest。但是我安装AS的时候默认给我安装了最新的Android API (此时latest指向的是版本),导致冲突。解决方法是UE项目设置中手动设置指定版本,或者在AS中卸载高于版本的Android API。

       OK,打包成功!!!

       6.打开游戏

       但是,是的,还有但是(都最后一步了,还有问题OVO!!!),在手机上下载安装,打开后是这样的:

       原来是因为打包除了生成apk文件还生成了obb,至于Google Play Store Key应该就是一个密钥了。

       解决方法是在UE项目设置->Android中勾选“将游戏数据打包至.apk中”,我们可以看到对这个勾选项的解释:

       行,勾选后重新打包,成功运行:

UE4 LevelSequence源码剖析(一)

       UE4的LevelSequence源码解析系列将分四部分探讨,本篇聚焦Runtime部分。Runtime代码主要位于UnrealEngine\Engine\Source\Runtime\MovieScene目录,结构上主要包括Channels、Evaluation、Sections和Tracks等核心模块。

       ALevelSequenceActor是Runtime的核心,负责逐帧更新,它包含UMovieSceneSequence和ULevelSequencePlayer。ALevelSequenceActor独立于GameThread更新,并且在Actor和ActorComponent更新之前,确保其在RuntTickGroup之前执行。

       IMovieScenePlaybackClient的关键接口用于绑定,编辑器通过IMovieSceneBindingOwnerInterface提供直观的蓝图绑定机制。UMovieSceneSequence是LevelSequence资源实例,它支持SpawnableObject和PossessableObject,便于控制对象的拥有和分离。

       ULevelSequencePlayer作为播放控制器,由ALevelSequenceActor的Tick更新,具有指定对象在World和Sublevel中的功能,还包含用于时间控制的FMovieSceneTimeController。UMovieSceneTrack作为底层架构,由UMovieSceneSections组成,每个Section封装了Section的帧范围和对应Channel的数据。

       序列的Eval过程涉及EvalTemplate和ExecutionTokens,它们协同工作模拟Track。FMovieSceneEvaluationTemplate定义了Track的模拟行为,而ExecutionTokens则是模拟过程中的最小单元。真正的模拟操作在FMovieSceneExecutionTokens的Apply函数中执行,通过BlendingAccumulator进行结果融合。

       自定义UMovieSceneTrack需要定义自己的EvaluationTemplate,这部分将在编辑器拓展部分详细讲解。序列的Runtime部分展示了如何在GameThread中高效管理和模拟场景变化,为后续的解析奠定了基础。

UE4:源码编译与编辑器生成项目的区别

       UE4源码编译与编辑器生成项目的区别主要体现在 uproject和sln文件上。

       首先,编辑器生成的项目文件(uproject)会使用版本号来明确关联使用的引擎版本,这种关联方式直观且易于识别。例如,文件名会包含版本号,如"Project_v1.0.0.uproject",这样可以轻松知道项目的引擎对应版本。

       相反,源代码编译的项目文件使用的是全局唯一标识符(GUID),以表示本地引擎的版本。这意味着在不同的PC上,即使使用相同的引擎,生成的uproject文件的GUID也会不同,这是为了区分本地环境的差异。

       其次,sln文件(解决方案文件)之间的差异主要在于其中包含的UE4解决方案的绝对路径。这部分内容是编辑器生成的,而源码编译项目则不会包含这些特定的路径信息,因为它们是由开发人员手动构建的。

       总结来说,编辑器生成的项目文件更侧重于版本管理和引擎关联,而源码编译则更注重项目的自定义和跨平台一致性。两者在结构和内容上有所不同,以满足不同开发阶段的需求。