【转载】UE4 TArray 的快速优化

630 阅读2分钟

原文链接:UE4[C++]TArray的快速优化 | 大侠刘茗

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

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

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

优化零

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

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

如果不存在,则添加

优化一

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

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

优化二

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

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

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

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

优化三

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

  1. 使用 RemoveAt

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

  1. 使用 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();
}

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