首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UE4的TArray(二)

和STL的vector类似,TArray在构造完成之后,是可以动态增加和删除,调整内部的内容。...1 查询: vector的at, []运算符,在TArray中对应的也是[]运算符,但是UE4会根据Allocator的参数做范围检查,当越界时会触发check(系统的assert)崩溃。...在做一些特殊逻辑时,比如想做UE4的ECS框架,去实现Component结构,在不清楚业务的如何定义元素类型时,可以结合使用这两个函数间接得到类型的大小和内存容量。...超过ArrayMax时扩容,最后返回扩容前的大小,也就是第一个新增加的未初始化元素的Index 对应的,如果想增加用默认无参数的构造函数创建的元素,或者直接以0作为参数增加元素,TArray也提供了这样的版本...UE4的容器迭代器版本的移除直接使用迭代器的RemoveCurrent函数,封装在了迭代器内部,而且相对于STL,不用担心遍历中删除的问题,从易用性来说要更好一些。

1.6K30

UE4的TSparseArray

UE4里也有一个这样的容器,但是内部实现却跟安卓的版本完全不同,我个人觉得UE4版本的实现,才是名副其实的SparseArray,而谷歌的版本从功能上来说叫SparseMap可能更合适。...其实并不是这样的,只要你在写UE4程序,那么这个容器你就基本上一直在用,因为他是TMap和TSet内元素的容器,你使用TSet和TMap时数据实际就存在内部的TSparseArray中,UE4的TMap...这里中转定义了一遍,具体原因是TSparseArray本身并不关心实际元素是什么,只需要大小和对齐值就可以了,这样蓝图定义的类型,或运行时定义的类型,在C++编译期即使不知道定义,只要清楚了元素内存和对齐值就能使用这个容器...如果链表里有空闲元素,只要找空闲元素,并把这个元素从链表中删除即可。...因为这里是union的原因,下面的结构大小是8字节,所以我们可以想到,无论我们设定的元素有多小(比如int32是4字节),每个元素实际也都至少占用8字节 这里简单用一个例子来说明内部具体实现。

1.5K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    UE4的TArray(一)

    TArray,是UE4的可动态扩容数组容器,是UE4里最常见,也是用的最多的一种容器,类似于STL中的vector,除了数组的基本功能外,还有一些从性能上来考虑的设计很有亮点,我觉得可能更适合游戏使用吧...Allocator中的ElementType类型。...TArrayView类似于动态span,而span使用默认STL需要开启C++20,ue4默认是C++14的,这里也是UE4比较有优势的一点。...其中这个拷贝构造函数还支持在数组尾部额外分配内存,这样可以做到一次性就分配好所需要的内存大小,对于性能会更友好。...在大部分业务逻辑中,包括UE4自己的引擎内部实现,在给渲染线程的提交队列lambda函数传递渲染数据时,大部分情况都是直接在游戏线程new一段内存,在渲染线程delete内存,这样的方式在逻辑复杂度很高的时候

    2.9K10

    UE4的TArray(三)

    UE4已经封装好了这3个基本操作,如上面代码所示。...HeapSiftDown:代码如上,简单说,就是自顶向下,将数组调整为小根堆。从某个节点开始,比较他和他的两个子节点大小,如果他大于任何一个子节点,就把最小的那个子节点和父节点交换,否则停止。...之后将堆顶和最后一个元素交换,那么可想而知,最后一个元素是最大的。然后堆的大小减1,这时因为堆顶是交换来的最后一个元素,所以SiftDown还原为堆。...TArray是UE4最简单也是最常用的一个容器,能在自己的代码里用对TArray,就相当于是写对了大部分的逻辑。...当然UE4除了TArray外,还有许多容器,许多数据结构和类,比如TSparseArray,TMap, TTripleBuffer等,在仔细研究源码后,一样能找出很多非常精彩的设计和深不见底的坑点,等后续有空了也会记录下来

    1.5K21

    【技术总结】UE4中的Subsystem

    在4.22版本发布了之后,我们可以直接将工具写在Subsystem中,让引擎帮我们自动管理工具类的生命周期,不再需要自己维护工具的生命周期或者修改引擎的类(如GameInstance)。...所以官方推出了Subsystem,并自己用在了UE4的部分组件的开发中(如VaRest,官方用Subsystem制作了REST API插件),方便引擎开发、客户端开发人员对引擎或者游戏做扩展、插件,同时不用自己操心生命周期的问题...Subsystem能够暴露接口给蓝图和Python使用,不需要修改或者继承引擎的类(如GameInstance)。...这里是TArray的原因是我们的模块可能会依赖多个DynamicSubsystem子类,模块所有要用到的DynamicSubsystem子类模版类都会保存在TArray中。...Map中的Subsystem对象判定为PendingKill,并且开始GC销毁这些Subsystem对象(另外提一嘴,实际上UE4也是这么处理创建的Widget的,所以不建议手动销毁,直接不引用,让GC

    5.9K71

    【虚幻引擎|UE】TArray在C++中的使用

    简介 TArray 类似于STL的vector,可以自动扩容,因为提供了相关操作函数,所以当作队列、栈、堆来使用也很方便,是UE4中最常用的容器类。其速度快、内存消耗小、安全性高。...值 //Init(const ElementType& Element, SizeType Number) IntArray.Init(10, 5); 增删改查 注意:成员函数通常都有多个重载,代码中我仅列举部分常用的重载函数原型...Args) InitArray.Emplace(3); 两者区别 多数效果相同,细微区别: Add(或 Push)将元素类型的实例复制(或移动)到数组中。...(20) //原{1,20,3,20} 新{1,3,20} RemoveAt 删除指定索引处元素 如传递无效索引将引发运行时错误 IntArray.RemoveAt(2)...在FString中,此为忽略大小写的词典编纂比较。 稳定排序。 可自定义比较器。

    93030

    【虚幻引擎|UE4】TArray在C++中的使用

    简介TArray 类似于STL的vector,可以自动扩容,因为提供了相关操作函数,所以当作队列、栈、堆来使用也很方便,是UE4中最常用的容器类。其速度快、内存消耗小、安全性高。...Element值//Init(const ElementType& Element, SizeType Number)IntArray.Init(10, 5);图片增删改查注意:成员函数通常都有多个重载,代码中我仅列举部分常用的重载函数原型...Args)InitArray.Emplace(3);两者区别多数效果相同,细微区别:Add(或 Push)将元素类型的实例复制(或移动)到数组中。Emplace 使用给定参数构建元素类型的新实例。.../原{1,20,3,20} 新{1,3,20}RemoveAt删除指定索引处元素如传递无效索引将引发运行时错误IntArray.RemoveAt(2)//原{1,20,3,20} 新{1,20,20...在FString中,此为忽略大小写的词典编纂比较。稳定排序。可自定义比较器。

    81200

    Unreal学习笔记2-绘制简单三角形

    概述 之所以写这个绘制简单三角形的实例其实是想知道如何在Unreal中通过代码绘制自定义Mesh,如果你会绘制一个三角形,那么自然就会绘制复杂的Mesh了。所以这是很多图形工作者的第一课。 2....代码实现 Actor是Unreal的基本显示对象,有点类似于Unity中的GameObject或者OSG中的Node。...这里组件初始化是在BeginPlay()中创建的,如果在构造函数中创建,那么就不能使用NewObject,而应该使用如下方法: // Sets default values ACustomMeshActor...最开始我参考的就是参考文献1中的代码,代码中设置成双面,但是我自己的材质蓝图中用的单面,程序启动直接崩溃了。...参考 UE4绘制简单三角形(二) UE4之坐标系 [UE4 C++]三种方式绘制三角形 Building a StaticMesh in C++ during runtime Build static

    93420

    UE运行时动态生成自定义物理形状碰撞检测

    游戏物理引擎中,对于简单的几何体(如球体、胶囊体、立方体)的相交检测,都会将逻辑进行简化。复杂是由简单演化来的,正如几何中的点构成线,线构成面;一维变二维,二维变三维一样。...BodySetup中配置的物理形状。...2.1 Physx引擎实现  对于默认使用Physx物理引擎的UE4,参考引擎上层提供的几个相交检测接口(如SphereOverlapActors()),具体方法就是根据传入的参数(如球形接口的球心坐标和半径...由于凸包比基础形状要更复杂,生成过程会有一定的消耗,我们也可以将这些生成后的对象直接缓存起来供后续调用。  生成自定义物理几何对象后,我们就可以参考UE4实现写出对应的相交检测方法。...UE源码中对于UBodySetup对象中物理数据的初始化过程)。

    3.6K30

    UE4 Slate三 SlateUI代码讲解

    ,如何在这个插件里面将SMainSlate显示到我们的插件面板内 因为我们是基于UE4 Plugin创建了一个Editor Standlone Window, 在这个插件代码中(test5_EditorStandlonWindow.cpp...,剖析代码 可以看到,我们的UMG最上层有一个Canvas Panel(UCanvasPanel类型),那么我们在代码中最开也去创建一个Canvas Panel(用它的主要目的是为了调整坐标方便)...一般我们会使用(下面这句代码) 的方式做为添加子控件的开始 + SConstraintCanvas::Slot() 然后直接通过.点出来一些属性,调整我们这个控件的属性, + SConstraintCanvas...绑定 我一共创建了三个CheckBox,并通过SAssignNew在链式编程里面将返回值放到了我们TArray数组中, 这个就是要用SAssignNew的情况。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1.8K10

    在Lua中实现对UE4 C++代码的自动补全

    我们项目接入的是slua-unreal,可以提供UE4中进行Lua开发的基础支持。 不过,如何能够保证在UE4中进行Lua开发的效率?Lua能够像C++或者C#一样支持代码补全和跳转吗?...总结Unity的Lua补全原理其实就是两条: 通过反射获取类信息 生成Emmylua格式的注释 UE4中Lua自动补全的实现原理 了解了Unity的补全原理,这套机制是不是可以用在UE4上呢?...例如,我如果调用: TArray ClassArray; GetObjectsOfClass(UStruct::StaticClass(), ClassArray); 那么我可以获取到所有继承自...笔者在这里使用了临时结构,构造了非常多的TSet来进行过滤。最终文件大小减小了70%。...于是最终的流程为: 将UE4的反射信息生成.json文件。 用python对.json文件中的数据进行一层加工(为了简化模板代码的逻辑) 按照加工后的的数据格式,写模板代码。 调用模板引擎生成代码。

    6.3K32

    UE5的World Partition

    可以类比TArray和TSet的区别:在一维的情况下如果用TArray存储格子x坐标,0~100放到元素0,101~200坐标放到元素1,依次放下去,那么整个场景的Actor都可以放到指定的一个格子里。...游戏里可以点击Preview Grids去看当前加载的格子,下面Cell Size可以调整Level 0的格子大小,Level 1的格子默认就是0格子的2倍,从下图就可以看到当前加载的格子。...在这个阶段,最重要的事情就是对所有的Actor做空间划分,每个Actor都会根据自己所在的位置以及包围盒大小放到实际的Cell中,如果多个Actor有引用关系,那么有引用关系的Actor会被打到同一个Cluster...中。...具体可以参考下面这个函数的算法: DataLayer 虚幻引擎中的世界分区 - 数据层 | 虚幻引擎5.3文档 (unrealengine.com) datalayer,其实就是取代ue4的layer功能的

    2.7K20

    UE4中的单映射:TMap容器

    一、TMap是么 TMap是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系。因此你可以通过键名来快速查找到值。此外,单映射要求每个键都是唯一的。类似C++中的Map....; }  注意的是,迭代器指向了单映射的每一个元素时,可以用key来取得元素的键,用Value来取得元素的值。 运行后可以看到输出结果: ?...//第二个参数是字体大小,第三个参数是字体颜色,第四个参数是要打印的字符串,这里用FromInt函数将Int转换FString。...; } } }  现在我们学了最常用的三种容器,动态数组容器——TArray,集合容器——TSet还有单映射——TMap。当然还有各种各样的容器,它们的操作都是大同小异的。...C++的泛型编程的优点也在于此,它们提供了相似的接口使得我们非常容易精通各种各样高效的容器。在游戏开发中,我们很少会重新写基本的数据结构类型,因为游戏引擎已经为我们提供好了大多数的数据结构。

    1.9K90

    UE4 反射系统详细剖析

    使用UE4的同学一定对"*.generated.h"这个名字不陌生。蓝图、HotReload等功能都依赖于反射机制。本文会从生成代码分析UE4的反射系统是如何实现的。...而菱形继承 会大大扩张虚表的大小,而且会造成二义性,调用基类的函数需要显示声明,这肯定是不现实的。 这个时候,UINTERFACE用两个类来实现,就可以避免菱形继承的问题。...总结 本文从常用的反射实现方法入手,详细分析了UE4通过宏定义生成反射信息的机制,并详细分析了UE4各类型的反射生成代码,以及UE4内部是如何使用反射信息的。...对UE4反射信息机制的了解,有助于我们对UE4的特化C++有更深的认识。 笔者在项目中也通过UE4的反射系统,搭配Emmylua语法,实现了Lua中的UE4函数自动补全。...有兴趣的同学可以参考这篇文章: 在Lua中实现对UE4 C++代码的自动补全 附录:展开生成代码 这里隐藏了所有#pragma warning的代码。所有宏替换为了展开代码。

    11K30

    UE5的StructUtils

    等,可以很大程度增强引擎的UStruct功能,又因为这个插件本身没有过多依赖,所以移植到UE4使用也不难。...和TArray区别是,FInstancedStructArray中的元素,在内存上是连续的,每个元素类型是有可能不同的,大小也是不一样的,下图就是这两种容器的内存分布情况...FInstancedStructStream,FChunkedStructBuffer 这两个类就不细说了,也是混合结构体的容器,相比于FInstancedStructArray或者TArray中的StateTree的参数就是使用PropertyBag来实现的: 在编辑器中可以看到,支持添加任意类型,保存StateTree时,Parameters数据也能正常保存。...整个实现其实没什么特别的,就是将两层指针改为了一层指针,关键点就是内存实际大小是这个结构后续的部分,这里用uint8 StructMemory[0],手动Malloc实际的内存来使用,自定义了智能指针的

    2.2K10

    Unreal 基于 PoseAsset 捏人

    而这个能力也非常适合用于进行游戏中常见的捏人操作,在本文中我们将会讨论如何在 UE 中使用 PoseAsset 实现捏人功能,并进一步优化工作流。...,此时可以随意调整其数值预览它产生的效果,例如下图中将「upperLegStrong_L」的值改到 1,就看到模型左腿上部变粗了: 图片 这些 pose 的名字也绑定于对应的动画曲线名,在「Anim Curves...从上面的案例中也能看出,我们需要在蓝图和动画蓝图中定义一堆对应的变量,而且还需要手动连接非常多的引脚,这不仅麻烦而且没法配置化,我们在实际应用的时候一般希望能通过一个配置文件指定有哪些曲线可以编辑,然后在代码中按名字修改其数据...TArray CurveModifyData; }; 其中,主要逻辑实现在 Evaluate_AnyThread 中,同样,设置曲线值的逻辑也可以参考 FAnimNode_ModifyCurve...TArray GetPoseCurves(); private: TArray PoseCurves; bool

    84940

    UE4: 学习虚幻引擎4的16条准则

    3D建模:高多边形网格或低多边形网格 低多边形纹理 低多边形光照映射 优化低多边形(减面,即减少多边形中面的数量,建立平滑组) 处理高多边形,使其变成低多边形(继续减面,面数决定了模型文件的大小) 如果需要的话...,处理其他纹理 建立细节层次 建立个性化的碰撞 从3D模型包输出 向UE4输入静态网格 创建/涂刷纹理 向UE4中输出/输入所有纹理 在UE4中创建材质 在UE4中完成所以静态网格和材质 在UE4中用BSP...您的目标是学习UE4功能,使用游戏引擎的基本原理和准则。 所以,首先推荐的项目,初学者应该首先用初学者包,开始创建一个小的环境,如单人房,走廊或外部区域。 ?...在这些项目中,你需要学习3D建模软件,如Maya LT,Maya,3dsMax,Modo或Blender。然后,模型,UV,纹理,光线,创建材质和把这一切导出/导入UE4环境中。...你不必掌握它们,但需要知道如何在你需要的时候使用3D建模,这是一个伟大的技能。这是只有你知道如何使用3D软件的好处。学习它所需的时间是一种投资,它使你作为一个创作者更有价值。

    3.5K62
    领券