这里以下面这部分代码为示例进行分析,在虚幻之后的版本中可能改变但大同小异。 FORCEINLINE void AddSharedReference() { SharedReferenceCount.FetchAdd(1, EMemoryOrder::Relaxed); } void ReleaseSharedReference() { RefCounter::ValueType OldSharedReferenceCount = SharedReferenceCount.FetchSub(1,
分类: Unreal Engine
中国区技术总监的演讲,这里做一下笔记。
问题 使用 UE4.23(最后一个支持 HTML5 平台的版本) 打包 HTML5 并部署到 Apache 服务器上,基本设置完成后出现错误,页面报错如下。 Uncaught TypeError: Cannot read properties of null (reading 'toLowerCase') Uncaught TypeError: Cannot read properties of null (reading 'toLowerCase') U
资源 通用 资源类型 前缀 后缀 Level / Map Level (Persistent) _P Level (Audio) _Audio Level (Lighting) _Lighting Level (Geometry) _Geo Level (Gameplay) _Gameplay Blueprint BP_ Material M_ Static Mesh SM_ Skeletal Mesh SK_ Texture T_ _* Particle System PS_ Widget B
问题 众所周知 UE 的 HTML5 平台默认显示如下。 这存在如下几个问题。 Canvas 只在中间显示。 下面有多余的按钮。 解决 将 Canvas 设置为自适应分辨率。 将 Project Settings > Platforms > HTML5 > Canvas Scaling Mode 设置为 Stretch 。 将 Canvas Wrapper 设置为自适应分辨率。 修改 .css 文件中如下一段。 .wrapper { position: relative; ma
虚幻引擎打包时,将在根目录中创建 BootstrapPackagedGame 启动 EXE 文件,并在 Binaries/Win64 中放置真正的 UE4 游戏 EXE 文件。 它通过以下过程创建: 将 引擎/Binaries/[平台]/BootstrapPackagedGame-[平台]-Shipping.exe 文件复制到根目录 更新 Build/Windows/Application.ico 图标 更新要执行的游戏 EXE 文件相对路径参数 更新游戏的基本参数 BootstrapPacka
class FTestTask { public: FTestTask(const FString& InTaskName) : TaskName(InTaskName) { } TStatId GetStatId() { RETURN_QUICK_DECLARE_CYCLE_STAT(TestTask, STATGROUP_TaskGraphTasks); } ENamedThreads::Type GetDesiredThread() { return ENamedThreads::
众所周知,UE 没有提供优先队列这一常用容器。 但是在 TArray 中有一些堆函数,可以实现优先队列的操作。 这里提供一个简单封装,其中 Priority 值越小优先级越高。 template<typename ElementType, typename ArrayAllocator = FDefaultAllocator> class TRFurPriorityQueue { public: FORCEINLINE TRFurPriorityQueue() = default;
引擎: UE4.26.2 构建版本 事情的起因是写体素构建器的时候,想生成个球,就想到抄材质的 SphereMask 节点。 这里以 SphereMask 节点为例,分析材质蓝图节点的定义。 UMaterialExpression 材质节点的 C++ 父类为 UMaterialExpression ,定义在 MaterialExpression.h 头文件中,所有原生材质节点均为此类的子类,此类主要成员如下。 virtual int32 Compile(class FMaterialCompil
问题 在从 UE4.24 升级到 UE4.26 后,想打包安卓,删除了以前的 NDK 然后根据官网指示安装新的 NDK ,在打包时提示打包失败,Log 关键内容如下。 UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): ====2021-08-09 14:35:59====PERFORMING FINAL APK PACKAGE OPERATION=====-armv7====================================
假设我们有一个带 USTRUCT 宏的结构体,我们希望在蓝图中可以以自己的方式 Make 或者 Break ,这个需求通常是因为我们在结构体里用了 C++ 中不支持反射的成员。 USTRUCT(BlueprintType, Meta = (HasNativeMake, HasNativeBreak)) struct FMeshVertex { GENERATED_BODY() UPROPERTY(EditAnywhere) FVector Position; UPROPERTY(EditAnyw
Lengyel-VoxelTerrain.pdf
ParallelFor 是 UE 内置的支持多线程并行处理任务的 For 循环,在渲染系统中应用得相当普遍。 调用方式 函数签名 void ParallelFor(int32 Num, TFunctionRef<void(int32)> Body, bool bForceSingleThread, bool bPumpRenderingThread = false); void ParallelFor(int32 Num, TFunctionRef<void(int32)>
UFUNCTION() virtual void FunctionName(…) PURE_VIRTUAL(ClassName::FunctionName, … );
引擎: UE4.26.2 构建版本 StaticMesh 简称 SM ,表示引擎中的 静态网格体 ,在新版本的引擎中, SM 也被允许在运行时构建,渲染一个 SM 需要 SMC 的支持, SMC 使用 静态/动态渲染路径 ,在允许的情况下优先使用 静态渲染路径 ,会缓存所有渲染命令。 类图 UStaticMesh 类图 classDiagram IInterface_AssetUserData <|.. UStaticMesh Interface_CollisionDataProvider
引擎: UE4.26.2 构建版本 ProceduralMeshComponent 简称 PMC ,提供一个程序化网格组件,可以通过自定义的三角形制作可渲染网格,使用动态渲染路径,在每帧收集渲染数据,没有任何数据缓存。 类结构 游戏 类图 classDiagram Interface_CollisionDataProvider <|.. UProceduralMeshComponent FPrimitiveSceneProxy <|– FProceduralMeshScenePro
众所周知 UE4 把 RTTI 给禁止了,这导致 dynamic_cast 的支持是不完全的,也就是说不支持从基类转换到子类,但是在阅读 TSoftObjectPtr (SoftObjectPtr.h) 代码时却看到: /** * Dereference the soft pointer. * * @return nullptr if this object is gone or the lazy pointer was null, otherwise a valid UObject point
开始记录状态到文件 stat startfile 停止记录状态到文件 stat stopfile 便捷作用域计时器 可以直接使用 QUICK_SCOPE_CYCLE_COUNTER(STAT_ClassName_FunctionName); 声明状态组 DECLARE_STATS_GROUP(TEXT("Group Name"), STATGROUP_GroupName, STATCAT_Advanced); 声明计数器 DECLARE_DWORD_ACCUMULATOR_S
成果 引擎版本 4.26.2 实现一个 UTexture2DArray 包裹器。 支持在 Runtime 的纹理数组创建与修改。 支持纹理数组 MipMap (官方实现只有第0层Mip)。 效果图 此纹理数组共5个元素,5个 Mip 层级。 其中,横向为元素,纵向为 Mip 层级。 代码 Texture2DArrayWrapper.h #pragma once #include "CoreMinimal.h" #include "UObject/Object.h&q
N 北 X+ S 南 X- E 东 Y+ W 西 Y- T 上 Z+ B 下 Z-
表现 Assertion failed: !FPaths::IsRelative(Dir) [File:/Engine/Source/Runtime/Projects/Private/ProjectDescriptor.cpp] [Line: 337] ../../../UGCExample/../RemappedPlugins/ is not an absolute path 解决方案 将 ProjectDescriptor.cpp 第 143 行处修改: // If this is a pa
void AsyncTask(ENamedThreads::Type Thread, TUniqueFunction<void()> Function); 一般任务线程: ENamedThreads::AnyHiPriThreadNormalTask 一般回调线程: ENamedThreads::GameThread
PRAGMA_DISABLE_OPTIMIZATION // Code PRAGMA_ENABLE_OPTIMIZATION
原文传送门 FRunnable & FRunnableThread FRunnable提供了最为原始的线程支持,类似std::Thread,虽然没那么优雅,但是功能略多于std::Thread FRunnable—-承载业务逻辑 +[f] Init : 初始化,可以失败 +[f] Run : 线程运行函数,返回退出代码 +[f] Stop : 提前终止这个线程 +[f] Exit : 进行退出前的清理 +[f] GetSingleThreadInterface : 平台不支持
硬获取 UObjectLibrary* ObjectLibrary = UObjectLibrary::CreateLibrary(UUserDefinedStruct::StaticClass(), false, GIsEditor); ObjectLibrary->LoadAssetDataFromPath(TEXT("/Game")); TArray<FAssetData> AssetDatas; ObjectLibrary->GetAssetD
r.VolumetricFog.GridPixelSize 体积雾像素大小 r.VolumetricFog.GridSizeZ 体积雾Z深度 r.VolumetricFog.TemporalReprojection 时间效果累加 r.VolumetricFog.HistoryWeight 时间效果累加长度[帧] r.VolumetricFog.Jitter 抖动累计