UE5/UE4 C++で配列の領域をあらかじめ確保(事前割り当て)した状態で扱う(Reserve、Reset、Empty、Shrink、Compact)
C++で配列の領域をあらかじめ確保(事前割り当て)した状態で扱う方法です。
こちらを参考にさせていただきました。
・パフォーマンスを高めるために TArray の使用を最適化する
https://www.unrealengine.com/ja/blog/optimizing-tarray-usage-for-performance?sessionInvalidated=true
公式ドキュメントはこちら。
・TMap
https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TMap/
上記ドキュメントの「スラック(Slack)」と呼ばれる部分が上記に該当するようです。
領域の確保には「Reserve」関数を使います。
この確保された状態で「Empty」関数を実行してしまうと確保したものがすべて削除されてしまいます。
確保した領域を保持したまま要素をすべて削除する場合は「Reset」関数を使います。
「Reserve」関数で設定したサイズ以外で要素を削除したい場合は
「Empty」関数に引数を指定することでも制御することができます。
確保した領域を削除したい場合は「Empty」関数を使うか、
「Compact」関数と「Shrink」を組み合わせることで制御することができます。
詳しくは公式ドキュメントの挙動を見てもらったほうが良いと思います。
なるべく効率よくゲームが作れるようこういったテクニックも覚えておきたいですね。
こちらを参考にさせていただきました。
・パフォーマンスを高めるために TArray の使用を最適化する
https://www.unrealengine.com/ja/blog/optimizing-tarray-usage-for-performance?sessionInvalidated=true
公式ドキュメントはこちら。
・TMap
https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TMap/
上記ドキュメントの「スラック(Slack)」と呼ばれる部分が上記に該当するようです。
領域の確保には「Reserve」関数を使います。
これで16個分の配列の領域が確保されるようです。// 領域確保
TArray< FName> aNameList;
aNameList.Reserve(16);
この確保された状態で「Empty」関数を実行してしまうと確保したものがすべて削除されてしまいます。
確保した領域を保持したまま要素をすべて削除する場合は「Reset」関数を使います。
// 領域を確保したまま要素をすべて削除
TArray< FName> aNameList;
aNameList.Reset();
「Reserve」関数で設定したサイズ以外で要素を削除したい場合は
「Empty」関数に引数を指定することでも制御することができます。
ここらへんですね。Reset を呼び出すか、0 ではないスラック パラメータを指定して Empty を呼び出すことで、使用中のメモリの割り当てを解除することなく要素を削除することができます。
確保した領域を削除したい場合は「Empty」関数を使うか、
「Compact」関数と「Shrink」を組み合わせることで制御することができます。
上記の使い方をどこでするかはあまり想定できないのですが、すべてのスラックを削除するには、Shrink を実行する準備のために、まず Compact 関数を呼び出して、空いたスペースをまとめます。
詳しくは公式ドキュメントの挙動を見てもらったほうが良いと思います。
なるべく効率よくゲームが作れるようこういったテクニックも覚えておきたいですね。
| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑