ID を割り当てる効率的な方法:
- 最初に空の構造体を宣言し、次に同様の
FAIBasicCounter
テンプレート構造体から継承します。この構造体はいくつかの条件を満たす必要がある場合があります。
- 累積関数を実装します。
Type GetNextAvailableID() { return NextAvailableID ++;}
- 上限の判定、上限に達した場合の判定方法
- IDを強制的に付与する機能の実装
- IDを格納する変数
- ジェネリックスをサポートしたくない場合は、上記のルールに従って使用する構造体を定義できます。次に行うことは、構造体のメンバー変数と静的 ID 変数を必要なクラスに追加して、現在新しく割り当てられた ID 、将来割り当てられる ID はこの ID を通じて蓄積できます
FAISightQuery
この方法はLiheで採用されFPerceptionListenerID
ましたFAISenseID
FPerceptionListenerID
FAISenseID
(同様に)におけるID生成の考え方template<typename TCounterType> struct FAIBasicCounter { typedef TCounterType Type; protected: Type NextAvailableID; public: FAIBasicCounter() : NextAvailableID(Type(0)) {} Type GetNextAvailableID() { return NextAvailableID++; } uint32 GetSize() const { return uint32(NextAvailableID); } void OnIndexForced(Type ForcedIndex) { NextAvailableID = FMath::Max<Type>(ForcedIndex + 1, NextAvailableID); } };
NextAvailableID
生成される次の有効な ID 値を識別します。
GetNextAvailableID
関数 ID 生成の累積関数は、関数が現在のインデックス ID に強制的に追加されるたびに 1 ビット増加し
OnIndexForced
ます。この ID は、すでに識別されている ID よりも大きいことが保証されている必要があります。そうでない場合、NextAvailableID
元の識別変数は利用されるstruct AIMODULE_API FPerceptionListenerCounter : FAIBasicCounter<uint32>{}; typedef FAIGenericID<FPerceptionListenerCounter> FPerceptionListenerID;
FAIGenericID
これはテンプレート クラスであり、その中で維持されるコア メンバー変数はstatic AIMoudle_API TCounter Counter
生成された量を識別するためのものです。const typename TCounter::Type Index
現在使用されている ID (定数) は、
現在インスタンス化されている ID
FAIGenericID
内の関数が ID内の関数をGetNextID
使用しているが依存していることを示します。この静的メンバー変数に蓄積します。生成されたメソッドは認識システムで呼び出されます。つまり、現在受信しているリスナーが新しいデータの場合、新しい ListenID が生成され、認識システムのリスナー データ構造に保存されます。FAIBasicCounter
GetNextAvailableID
FAIGenericID
Counter
const FPerceptionListenerID NewListenerId = FPerceptionListenerID::GetNextID();
UpdateListener
FAISenseID
ID割り当てとFPerceptionListenerID
ID割り当ての違いは何ですか?
それらは本質的にはすべて同じですが、唯一の矛盾は、使用法で表現される論理的意味が異なることです。前者は感覚の種類と量にインデックスを割り当てるのに対し、後者は知覚コンポーネント自体の保持者にインデックスを割り当てることです。関数ポインタを効率的に記述する方法
const TFunction<void(const FAISightQuery&)>& OnRemoveFunc auto RemoveQuery = [&ListenerId, &OnRemoveFunc](TArray<FAISightQuery&> SightQueries, const int32 QueryIndex)->EReverseForEachResult { ... OnRemoveFunc(SightQuery); ... }
UAISense_Sight::RemoveAllQueriesByListener
この関数は、複数の層の関数ポインターをネストして呼び出します。まず、受信したポインターがOnRemoveFunc
キャプチャとして Lambda 関数に渡されRemoveQuery
、次に関数内で呼び出されます。RemoveQuery
テンプレート関数では、関数はループ内で呼び出されますReverseForEach
が、ReverseForEach
これRemoveQuery
はループ内では呼び出されません。全体的に可読性があまり良くないので、似たような文章を多用するのには向いていません。しかし、いくつかの基本的な汎用関数では、これは特に顕著であり、たとえば、TArray
同様の関数ポインタ呼び出しが
FRotator
宣言と代入の有効な方法を発見する
FRotator ViewRotation(ForceInitToZero)
同様に、FVector もこの操作をサポートしています。ForceInitToZero
これは列挙定義メンバーであり、もう 1 つは列挙定義メンバーです。ForceInitToZero
前提条件を備えた委任されたタスクを作成する
ソースコード
FSimpleDelegateGraphTask::CreateAndDispatchWhenReady( FSimpleDelegateGraphTask::FDelegate::CreateUObject( const_cast<UAIPerceptionComponent* (this),&UAIPerceptionComponent::RemoveDeadData), >>>GET_STATID(STAT_FSimpleDelegateGraphTask_RequestingRemovalOfDeadPerceptionData), NULL, ENamedThreads::GameThread);
認識データ内に無効なデータが見つかった場合に、無効な認識データをタイムリーに削除するためのデリゲートを作成します。このデリゲートは、ゲーム スレッドで呼び出されます。このデリゲートは、パフォーマンス統計分析に Stat メカニズムを使用します。具体的な実装は次のとおりです
。DECLARE_CYCLE_STAT(TEXT("Requesting UAIPerceptionComponent::RemoveDeadData call from within a const function"), STAT_FSimpleDelegateGraphTask_RequestingRemovalOfDeadPerceptionData, STATGROUP_TaskGraphTasks);
STATGROUP_TaskGraphTasks
グループ groupに属する Stat を宣言します。識別子の StatId はGET_STATID
マクロを通じて取得できます。STAT_FSimpleDelegateGraphTask_RequestingRemovalOfDeadPerceptionData
#define DECLARE_CYCLE_STAT(CounterName,StatId,GroupId) \ DECLARE_STAT(CounterName,StatId,GroupId,EStatDataType::ST_int64, EStatFlags::ClearEveryFrame | EStatFlags::CycleStat, >>>FPlatformMemory::MCR_Invalid); \ static DEFINE_STAT(StatId)
DECLARE_STAT は、StatName、StatType、IsClearEveryFrame などの取得関数を含む構造体宣言マクロです。
渡された最初のパラメータはCounterName
、マクロで宣言されたGetDescription
関数の説明テキストとして返され、渡さ
れた 2 番目のパラメータが使用されます。 GetStatNameStatId
Return の文字列として、構造構造内のサフィックス名としても使用されます。
GroupId
これはグローバルに一意の ID です。
最後のいくつかのパラメータは、Stat のデータ型、状態ラベル、および分析メモリ領域を設定するために使用されます、など。DECLARE_STATS_GROUP(TEXT("AI"),STATGROUP_AI, STATCAT_Advanced)
このステートメントは Stats2.h ヘッダー ファイルにあります。ソース コードのコメントでは、これらの GroupID のすべてをこのファイルで定義する必要はないと述べています。必要に応じて独自の Cpp ファイルで定義できますが、グローバルに一意である必要があります。さらに詳しい記事
:Statリフレクションで関数を取得して呼び出す
const UFunction* Function = Object.GetClass()->FindFunctionByName(FuncName); return Function != nullptr;
参考のためのUE AIModuleソースコード解釈(1)
おすすめ
転載: blog.csdn.net/u011047958/article/details/125631046
おすすめ
ランキング