BlueRose
文章97
标签28
分类7
MeshDraw渲染流程学习笔记

MeshDraw渲染流程学习笔记

前言

MeshDraw是UE4用于渲染Mesh相关Pass的框架,他主要用于将Mesh渲染到RT上,之后在RDG中进行进一步的渲染。

使用引擎版本:源码版4.27.0

参考Yivanlee的MeshDraw系列文章。

提升FastBuild编译UnrealEngine的速度

提升FastBuild编译UnrealEngine的速度

在上一篇文章之后我进行了进一步测试,下面是结果。

测试结果

测试配置
i7-8700 3.2Ghz 12线程
16GB内存
WDC PC SN730 SDBQNTY-256G-1001 固态硬盘
ST1000DM003-1SB102 机械硬盘

服务器配置
Inter Xeon Silver 4114 2.2GHz (2处理器)40线程
64GB内存

引擎版本4.27.0 Release
网络:百兆网络

使用Fastbuild加快UnrealEngine编译速度

使用Fastbuild加快UnrealEngine编译速度

如果你有多台电脑或者服务器就可以使用FastBuild提高编译速度。虽然最后测试法线,i7-7700+一台几年前的e5 40核心服务器依然比不过今年买的枪神5笔记本。

如果你完全按照 https://zhuanlan.zhihu.com/p/158400394 的教程来操作,那你就被坑了。目前Fastbuild的最新版本与UE是不兼容的。很可能会出现寻找的目录与FastBuild创建的目录不一致的问题。以下是本人的log:

已启动生成…
1>------ 已启动生成: 项目: UE4, 配置: Development_Editor x64 ------
1>Building UE4Editor and ShaderCompileWorker...
1>Using Visual Studio 2019 14.29.30136 toolchain (D:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133) and Windows 10.0.19041.0 SDK (D:\Windows Kits\10).
1>Detected build type as Windows from 'D:\UnrealEngine\UnrealEngine4.27\Engine\Build\Windows\cl-filter\cl-filter.exe' using search term 'Windows'
1>Using path : {D:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC/Redist/MSVC\14.29.30133} for vccorlib_.dll (MSVC redist)...
1>    ...Add an entry for MsvcCRTRedistVersion in BuildConfiguration.xml to specify a version number
1>FBuild Command Line Arguments: '-monitor -summary -dist -cacheread -ide -clean -config "D:\UnrealEngine\UnrealEngine4.27\Engine\Intermediate\Build\fbuild.bff" -nostoponerror
1>BFF file 'D:\UnrealEngine\UnrealEngine4.27\Engine\Intermediate\Build\fbuild.bff' has changed (reparsing will occur).
1>Using brokerage folder
1>No workers found in '\\DESKTOP-QI1GP15\FastBuildBroker\main\20.windows\'
1>No workers available - Distributed compilation disabled

操作步骤

上述问题是因为当前使用的FastBuild协议版本与UE4所需的不同造成的,所以你需要使用EPIC定制的FastBuild。本人使用Win10与UnrelEngine4.27.0源码版目前正确的操作步骤如下:

  1. 使用源码目录Engine\Extras\ThirdPartyNotUE\FASTBuild\Win64\下的FastBuild。指定一个不含用中文路径的目录。
  2. 在该目录中再新建一个名为FBuild的文件夹,并将3个文件复制进去。这一步是可选步骤,是为了兼容FBDashboard.exe。你可以去FastBuild官网下载,并且指定目录下。(只需要复制FBDashboard.exe,放在FBuild外面)
  3. 创建共享文件夹。添加当前用户与Everyone用户权限为读/写。之后再用其他电脑访问一次,能进入并且写文件就完成了。(只需要其中一台电脑or服务器创建共享文件夹即可,其他所有机器都会使用这个共享文件夹)
  4. 添加环境变量FASTBUILD_BROKERAGE_PATH,内容为共享文件夹的网络路径,比如\\DESKTOP-QI1GP15\FastBuildBroker;Path变量添加FBuild.exe所在目录,之后在CMD中输入FBuild,运行后提示Failed to open BFF 'fbuild.bff'就代表添加成功了。
  5. 在其他电脑与服务器上执行上述步骤。
  6. 添加编译配置。给Engine\Saved\UnrealBuildTool\BuildConfiguration.xml添加bAllowFASTBuild配置为true。

比如这样:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
    <BuildConfiguration>
        <bAllowFASTBuild>true</bAllowFASTBuild>
    </BuildConfiguration>
</Configuration>

共享问题

你很可能会遇到无法打开共享或是网络发现的功能,下面我分享以下解决方法。测试系统:win10、win2012 r2。

  1. 关闭win防火墙。
  2. 在控制面板-程序-启动或者关闭服务器功能中,确保安装了SMB 1.0/CIFS 文件共享支持下的所有功能。
  3. 运行services.msc,启动Computer Browser服务并将启动方式设置为自动。将下列服务启动并将启动方式设置为自动(延迟启动):Function Discovery Provider Host、Function Discovery Resource Publication、Network Connections、UPnP Device Host。

其他注意点

江湖小辈教程中使用FastBuild源码版是为了做测试以及通过修改源代码来实现通过Ip来代替计算机名来寻找共享。如果你想使用最新版本就需要修改FastBuild源码中的distributed protocol version。本人没有试过,但应该是这样没错。

对于团队来说添加DCC、Shader编译也许必须的,所以还可能修改UBT代码。但记住在修改完UBT代码后,需要重新编译UBT。
调试UBT的话,需要在UBT工程上右键-属性-调试页面中,将配置设为Debug,之后添加命行参数,之后在Debug模式下就可以命中断点了。编译UE4源码命令行如下:

UE4Editor Win64 Development -Quiet -WaitMutex -FromMsBuild

编译配置

是一个名为BuildConfiguration.xml的xml文件,用于控制编译。除了可以在项目Config/UnrealBuildTool中添加外。UBT还会从以下位置(Windows系统)的XML配置文件读取设置:

  • Engine/Saved/UnrealBuildTool/BuildConfiguration.xml - 针对特定引擎版本。
  • User Folder/AppData/Roaming/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml
  • My Documents/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml - 适用于所有已安装的引擎版本。

除了上文中说到的bAllowFASTBuild外,因为本人使用附带git信息的引擎源码,编译时UBT会先去读取git信息,但因为源码git信息量太大,非常浪费时间。这里可以添加

<SourceFileWorkingSet> 
    <Provider>None</Provider> 
    <RepositoryPath></RepositoryPath> 
    <GitPath></GitPath> 
</SourceFileWorkingSet>

起到让UBT禁用“使用 ‘git status’ 来确定AdaptiveUnityBuild。下面介绍一下其他参数,完整参数请去官方文档参考。

LocalExecutor

  • ProcessorCountMultiplier:本地执行的处理器计数乘数。设为小于1可为其他任务保留CPU。使用本地执行器(非XGE)时,在每个CPU核心上运行单一操作。注意: 可将该属性设为较大的值,在多数情况下可稍微提高编译速度,但电脑在编译期间的响应速度将变慢。
  • MaxProcessorCount:本地执行的最大处理器数量。

ParallelExecutor

  • MaxProcessorCount:本地执行的最大处理器数量。
  • ProcessorCountMultiplier:本地执行的处理器计数乘数。设为小于1可为其他任务保留CPU。
  • bStopCompilationAfterErrors:启用时,将在发生编译错误后停止编译目标。

我在查看了AnswerHUB看到有人分享了自己的配置:

查阅代码之后发现,这些配置选项要去看 BuildConfigProperties.INT.udn 里的参数,ProcessorCountMultiplier 是在 ParallelExecutor 下的,所以改成以下配置:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
  <ParallelExecutor>
    <ProcessorCountMultiplier>7</ProcessorCountMultiplier>
    <MaxProcessorCount>7</MaxProcessorCount>
    <bStopCompilationAfterErrors>true</bStopCompilationAfterErrors>
  </ParallelExecutor>
</Configuration>

目前我使用的完整配置:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
  <BuildConfiguration>
    <ProcessorCountMultiplier>7</ProcessorCountMultiplier>
    <MaxParallelActions>7</MaxParallelActions>
    <bAllowParallelExecutor>true</bAllowParallelExecutor>
  </BuildConfiguration>
  <SNDBS>
    <ProcessorCountMultiplier>4</ProcessorCountMultiplier>
    <MaxProcessorCount>4</MaxProcessorCount>
  </SNDBS>
  <ParallelExecutor>
    <ProcessorCountMultiplier>7</ProcessorCountMultiplier>
    <MaxProcessorCount>7</MaxProcessorCount>
    <bStopCompilationAfterErrors>true</bStopCompilationAfterErrors>
  </ParallelExecutor>
</Configuration>

FASTBuild

  • FBuildExecutablePath:用于指定 fbuild.exe 的位置(如果发布的二进制文件未使用)
  • bEnableDistribution:控制网络构建分布(network build distribution)
  • FBuildBrokeragePath:用于指定中间件的位置。如为null,则FASTBuild退回检查FASTBUILD_BROKERAGE_PATH
  • bEnableCaching:控制是否使用缓存。仅当该选项启用后,CachePath和FASTCacheMode才会相关。
  • CacheMode:缓存访问模式 - 仅当bEnableCaching为真时相关;
  • FBuildCachePath:用于指定缓存的位置。如为null,FASTBuild会退回检查FASTBUILD_CACHE_PATH
  • bForceRemote:是否强制远程
  • bStopOnError:是否在错误上停止
  • MsvcCRTRedistVersion:使用哪个MSVC CRT Redist版本

UnityBuild

  • bUseAdaptiveUnityBuild:使用启发式方法来确定哪些文件目前正在被迭代,并将它们从unity blobs中排除,从而加快增量编译的时间。目前的实现使用只读标志来区分工作集,假设文件正在被修改,源码控制系统将使其可写。这对Perforce是正确的,但对Git不是。
GAS的TargetData与TargetActor相关机制

GAS的TargetData与TargetActor相关机制

前言

TargetActor是GAS用于获取场景中物体、空间、位移等数据的机制,同时也可以用于制作可视化debug工具。,所以非常有必要掌握它。

一般流程为:使用WaitTargetData_AbilityTask生成TargetActor,之后通过TargetActor的内部函数或者射线获取场景信息,最后通过委托传递携带这些信息构建的FGameplayAbilityTargetDataHandle。

本文部分描述摘自GASDocumentation_Chinese,翻译的还不错,也请大家给此项目点赞。

GAS AbilityTask节点功能整理

GAS AbilityTask节点功能整理

前言

整理了一下GameplayTasks节点,在此分享给大家。

GAS中的传递数据与解耦方法

GAS中的传递数据与解耦方法

一种将所有逻辑都写进Ability的GAS Combo方案

一种将所有逻辑都写进Ability的GAS Combo方案

前言

使用GAS实现Combo技能,本人所知道的有两种思路:

第一种:为每一段Combo创建一个单独的Ability;定制自定义Asset与编辑器,之后再通过自定义编辑器进行编辑。

  • 优点:最高的自由度,不容易出问题。
  • 缺点:如果有大量多段或者派生复杂的Combo,那工作量将会相当爆炸。可以说除了工程量大,管理麻烦没有别的缺点。

第二种:根据GameplayEvent直接在Ability里直接实现Combo切换逻辑

https://zhuanlan.zhihu.com/p/131381892

在此文中,我分析了ActionRPG的攻击逻辑的同时自己也提出一种通过GameplayEvent实现Combat的方法。这个方法理论上没问题,但实际落地的时候发现存在一个问题:里面使用的PlayMontageAndWaitEvent是GameplayTasks是异步运行的,而通过AnimNotify发送的SendGameplayEvent的函数确是同步函数。所以会导致PlayMontageAndWaitEvent节点接收不到任何事件的问题。经过一段事件的探索,本人摸索到了另一种方案:

  • 优点:一个起点(这个Combo树)一个Ability,方便管理。可以尽可能地把Combo相关的逻辑都整合到一个Ability里。
  • 缺点:自由度会有一定的限制;因为采用异步函数来管理事件,会导致一定的延迟。不适于格斗游戏这种对低延迟要求比较高项目。

2021.7.30更新

如果你使用GAS的输入绑定系统,即在GiveAbility()注册时进行输入绑定(参考GASDocument的4.6.2章节)。可将后面介绍的ListenPlayerInputAction节点换成GAS自带的WaitInputPress或WaitInputRelease。

在联机项目中使用GAS的注意点

在联机项目中使用GAS的注意点

前言

大多数人应该是会通过学习UE4的ActionRPG项目来入门GAS框架的。但在最近自己做Demo的过程中才发现里面的部分不适用网络联机。比如ActionRPG将Character与Controller的指针存在GameMode,因为Server与Client只有一个GameMode的关系,就不符合多人联机游戏的规则。所以在经过实践之后这里我分享一些要点仅供抛砖引玉。这里我再推荐各位读者去看一下GASDocument以及附带的工程,它展现了正确的设计思路。

Slate学习笔记(一):Slate动态控制与其他技巧

Slate学习笔记(一):Slate动态控制与其他技巧

前言

最近在写MessageBox控件,想兼容UMG与c++中调用Slate。略有心得,遂有此文。

为Qt中的SQLite添加密码并加密

为Qt中的SQLite添加密码并加密

前言

因为Sqlite的源代码中只提供了Sqlite3_key()的接口,没有实现。所以Qt中的Sqlite没有密码功能。于是我找了一下资料,,并且总结一下思路。现成的方法在最后。