大家好,我是刘茗,这次带来的是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(); }以上就是目前整理的大部分优化方法了,多数经验来自网络和实践,后续优化待补充,感谢大家的支持,谢谢!