农村嫖妓一区二区三区,成人H无码动漫超W网站,国产精精品级毛片老码老,成人WWW色情在线观看

UE4[C++]TArray的快速優(yōu)化
作者:翔天盛世
發(fā)布時間:2022-02-23 12:00
瀏覽數(shù):2179

大家好,我是劉茗,這次帶來的是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)化待補充,感謝大家的支持,謝謝!

地址:北京珠江摩爾國際大廈
電話:18516882688
郵箱:xcni@qq.com
關(guān)注我們
Copyright @ 2010 - 2022 京ICP備11047770號-8 京公網(wǎng)安備11011402012373號