大家好,我是劉茗,這次帶來的是UE4 TArray的部分優(yōu)化技巧。
在UE4中,TArray是一種動態(tài)大小的數(shù)組,是虛幻引擎中最常用的容器類。
靈活使用TArray可以得到效率的提升。
優(yōu)化零:
如果我們想要添加獨有的元素,可以使用AddUnique這個函數(shù)添加。
如果元素存在,返回數(shù)組下標(biāo)。
如果不存在,則添加
優(yōu)化一:
如果實現(xiàn)知道數(shù)組中有多少元素,或者上限,可以事先預(yù)留內(nèi)存空間
使用Reserve函數(shù),可以確保在這個函數(shù)內(nèi)最多只進(jìn)行一次配置
優(yōu)化二:
使用TArray作為函數(shù)參數(shù)使用時,使用它的引用。
void AppendMyArray(int32 N, TArray<AActor*> _Char);如果直接傳遞數(shù)值,函數(shù)會在數(shù)組傳遞給AppendMyArray之前,制作數(shù)組的拷貝,會很占用系統(tǒng)性能。
void AppendMyArray(int32 N, TArray<AActor*>& _Char);優(yōu)化三:
默認(rèn)情況下,TArray會根據(jù)用戶的刪減來重新排列存儲空間,這同樣會有效率問題。
使用RemoveAt此函數(shù)會移除該索引的元素,并將之后的元素重新排列。
2. 使用RemoveAtSwap
如果對數(shù)組的順序沒有要求的話,使用RemoveAtSwap函數(shù)會在移除該索引的元素之后,將最后一個元素移動到移除后的空間里,而非移動所有元素。
優(yōu)化四:
因為TArray是動態(tài)數(shù)組,所以我們可以使用TInlineAllocator。
第一個參數(shù),內(nèi)聯(lián)元素的數(shù)量,這個分配器保留了分配器被實例化的存儲空間。當(dāng)這個空間被用盡時,分配器會移動元素到由第二分配器創(chuàng)建的溢出空間中。對于TArray來說,這意味著在棧上聲明的數(shù)組將會對這些元素直接在棧上保留空間。作為類或結(jié)構(gòu)體的一部分聲明的TArray將會把內(nèi)聯(lián)分配存儲為該類或結(jié)構(gòu)體的一部分,對作為該數(shù)組一部分添加的前N個元素將不會進(jìn)行動態(tài)分配。
我們可以把
TArray<AActor*> MyArray;
改為:
TArray<AActor*, TInlineAllocator<32>> MyAllocatedArray;
這樣,我們就不用對前32個被添加到數(shù)組的元素進(jìn)行任何動態(tài)分配,因為它們正好能填入作為TInlineAllocator一部分的棧的區(qū)域。在33個元素之后,所有元素都被移動到第二分配器存儲。
優(yōu)化五:
在優(yōu)化四的結(jié)尾處,MyAllocatedArray的類型名顯得有些長了,因此可以聲明我們的數(shù)組類型。
使用typedef
typedef TArray<AActor*, TInlineAllocator<32>> AllocateArrayType; AllocateArrayType MyArray; //迭代 for (AllocateArrayType::TIterator Iter(MyArray); Iter; ++Iter) { AActor* MyActor = *Iter; MyActor->YourFunction(); }以上就是目前整理的大部分優(yōu)化方法了,多數(shù)經(jīng)驗來自網(wǎng)絡(luò)和實踐,后續(xù)優(yōu)化待補充,感謝大家的支持,謝謝!