参考のためのUE AIModuleソースコード解釈(1)

ID を割り当てる効率的な方法:

  1. 最初に空の構造体を宣言し、次に同様のFAIBasicCounterテンプレート構造体から継承します。この構造体はいくつかの条件を満たす必要がある場合があります。
  • 累積関数を実装します。Type GetNextAvailableID() { return NextAvailableID ++;}
  • 上限の判定、上限に達した場合の判定方法
  • IDを強制的に付与する機能の実装
  • IDを格納する変数
  1. ジェネリックスをサポートしたくない場合は、上記のルールに従って使用する構造体を定義できます。次に行うことは、構造体のメンバー変数と静的 ID 変数を必要なクラスに追加して、現在新しく割り当てられた ID 、将来割り当てられる ID はこの ID を通じて蓄積できます
  2. FAISightQueryこの方法はLihe採用されFPerceptionListenerIDましたFAISenseID
  3. FPerceptionListenerIDFAISenseID(同様に)における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 が生成され、認識システムのリスナー データ構造に保存されます。FAIBasicCounterGetNextAvailableIDFAIGenericIDCounter
const FPerceptionListenerID NewListenerId = FPerceptionListenerID::GetNextID();UpdateListener

  1. FAISenseIDID割り当てとFPerceptionListenerIDID割り当ての違いは何ですか?
    それらは本質的にはすべて同じですが、唯一の矛盾は、使用法で表現される論理的意味が異なることです。前者は感覚の種類と量にインデックスを割り当てるのに対し、後者は知覚コンポーネント自体の保持者にインデックスを割り当てることです。

関数ポインタを効率的に記述する方法

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 番目のパラメータが使用されます。 GetStatName StatIdReturn の文字列として、構造構造内のサフィックス名としても使用されます。
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;

おすすめ

転載: blog.csdn.net/u011047958/article/details/125631046