UE5/UE4 C++でメモリに優しい方法でアクター(Actor)が持っているコンポーネント(Component)をクラスを指定して複数取得する(Get Components、TInlineComponentArray)
こちらのツイートを参考にやってみました。
AActor::GetComponents()のメモリに優しい書き方(C++)
— K.Y. (@KumasanDebug) April 14, 2022
TArray<UHogeComponent*> Components;
Actor->GetComponents<UHogeComponent>(Components);
↓ TInlineComponentArray を使用
TInlineComponentArray<UHogeComponent*> Components(Actor);
// 後は TArray と同じように扱ってOK#UE4Study
これはどういうことかというと。
こういうことだそうです。TArray だとヒープ領域を無駄に予約して取ってしまう場合がある
— K.Y. (@KumasanDebug) April 14, 2022
それに対して TInlineComponentArray だと取得するコンポーネント数に合わせて要素を確保するのでメモリに優しいとのこと
(文字数抑えるのに必死で「なんで?」の部分を補足できてなかった...)
「TArray」の代わりに「TInlineComponentArray」を使ってあげればよいみたいですね。
公式ドキュメントはこちら。
・AActor::GetComponents
https://docs.unrealengine.com/5.0/en-US/API/Runtime/Engine/GameFramework/AActor/GetComponents/2/
・TInlineComponentArray
https://docs.unrealengine.com/4.26/en-US/API/Runtime/Engine/GameFramework/TInlineComponentArray/
というわけでやってみました。
普通に「TArray」を使って記述するとこんな感じになります。
// 取得したいコンポーネントを持つアクター
AActor* aActor;
// 取得したコンポーネントを格納する配列
TArray< UActorComponent* > aActorComponents;
// アクターが持つコンポーネントを複数取得
aActor->GetComponents< UActorComponent >(aActorComponents);
// 取得したコンポーネントを処理
for(auto aComponent : aActorComponents){
// 何か処理}
「TInlineComponentArray」を使って記述するとこんなかんじになります。
配列の宣言部分以外は特に処理の流れは変わらないので問題なければこちらを使ってもよさそうですね。// 取得したいコンポーネントを持つアクター
AActor* aActor;
// 取得したコンポーネントを格納する配列
TInlineComponentArray< UActorComponent* > aActorComponents(aActor);
// アクターが持つコンポーネントを複数取得
aActor->GetComponents< UActorComponent >(aActorComponents);
// 取得したコンポーネントを処理
for(auto aComponent : aActorComponents){
// 何か処理}
| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑