UE4[C++]TArray的快速优化
作者:翔天盛世
发布时间:2022-02-23 12:00
浏览数:2099

大家好,我是刘茗,这次带来的是UE4 TArray的部分优化技巧。

在UE4中,TArray是一种动态大小的数组,是虚幻引擎中最常用的容器类。

灵活使用TArray可以得到效率的提升。

优化零:

如果我们想要添加独有的元素,可以使用AddUnique这个函数添加。

如果元素存在,返回数组下标。

如果不存在,则添加

优化一:

如果实现知道数组中有多少元素,或者上限,可以事先预留内存空间

使用Reserve函数,可以确保在这个函数内最多只进行一次配置

优化二:

使用TArray作为函数参数使用时,使用它的引用。

void AppendMyArray(int32 N, TArray<AActor*> _Char);

如果直接传递数值,函数会在数组传递给AppendMyArray之前,制作数组的拷贝,会很占用系统性能。

void AppendMyArray(int32 N, TArray<AActor*>& _Char);

优化三:

默认情况下,TArray会根据用户的删减来重新排列存储空间,这同样会有效率问题。

使用RemoveAt

此函数会移除该索引的元素,并将之后的元素重新排列。

2. 使用RemoveAtSwap

如果对数组的顺序没有要求的话,使用RemoveAtSwap函数会在移除该索引的元素之后,将最后一个元素移动到移除后的空间里,而非移动所有元素。

优化四:

因为TArray是动态数组,所以我们可以使用TInlineAllocator。

第一个参数,内联元素的数量,这个分配器保留了分配器被实例化的存储空间。当这个空间被用尽时,分配器会移动元素到由第二分配器创建的溢出空间中。对于TArray来说,这意味着在栈上声明的数组将会对这些元素直接在栈上保留空间。作为类或结构体的一部分声明的TArray将会把内联分配存储为该类或结构体的一部分,对作为该数组一部分添加的前N个元素将不会进行动态分配。

我们可以把

TArray<AActor*> MyArray;

改为:

TArray<AActor*, TInlineAllocator<32>> MyAllocatedArray;

这样,我们就不用对前32个被添加到数组的元素进行任何动态分配,因为它们正好能填入作为TInlineAllocator一部分的栈的区域。在33个元素之后,所有元素都被移动到第二分配器存储。

优化五:

在优化四的结尾处,MyAllocatedArray的类型名显得有些长了,因此可以声明我们的数组类型。

使用typedef

typedef TArray<AActor*, TInlineAllocator<32>> AllocateArrayType; AllocateArrayType MyArray; //迭代 for (AllocateArrayType::TIterator Iter(MyArray); Iter; ++Iter) { AActor* MyActor = *Iter; MyActor->YourFunction(); }

以上就是目前整理的大部分优化方法了,多数经验来自网络和实践,后续优化待补充,感谢大家的支持,谢谢!

地址:北京珠江摩尔国际大厦
电话:18516882688
邮箱:xcni@qq.com
关注我们
Copyright @ 2010 - 2022 京ICP备11047770号-8 京公网安备11011402012373号