Files
UnrealEngineUWP/Engine/Plugins/Runtime/Metasound/Source/MetasoundFrontend/Private/MetasoundFrontendSearchEngine.cpp
phil popp d4af456a9c Metasound Frontend Perf Tuneup
- Added frontend search engine to cache frontend queries
- Allowing frontend queries to be updated in place.
- Tracking node registration transactions to allow incremental runtime checks of newly registered nodes.
- Create public RegistryContainer interface and hide implementation to allow for further optimizations without changing public headers
#jira UEAU-749
#rb Max.Hayes, Jimmy.Smith
#preflight 606399a6e05c4e0001a0d173

#ROBOMERGE-SOURCE: CL 15868737 in //UE5/Release-5.0-EarlyAccess/...
#ROBOMERGE-BOT: STARSHIP (Release-5.0-EarlyAccess -> Main) (v786-15839533)

[CL 15868744 by phil popp in ue5-main branch]
2021-03-30 18:22:10 -04:00

102 lines
2.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "MetasoundFrontendSearchEngine.h"
#include "MetasoundFrontendQuery.h"
#include "MetasoundFrontendQuerySteps.h"
namespace Metasound
{
namespace Frontend
{
class FSearchEngine : public ISearchEngine
{
FSearchEngine(const FSearchEngine&) = delete;
FSearchEngine(FSearchEngine&&) = delete;
FSearchEngine& operator=(const FSearchEngine&) = delete;
FSearchEngine& operator=(FSearchEngine&&) = delete;
public:
FSearchEngine() = default;
virtual ~FSearchEngine() = default;
TArray<FMetasoundFrontendClass> FindClassesWithClassName(const FNodeClassName& InName) override;
private:
FFrontendQuery* FindQuery(const FString& InQueryName);
FFrontendQuery* AddQuery(const FString& InQueryName, TUniquePtr<FFrontendQuery>&& InQuery);
// Store queries. Index them by unique strings.
TMap<FString, TUniquePtr<FFrontendQuery>> QueryCache;
};
ISearchEngine& ISearchEngine::Get()
{
static FSearchEngine SearchEngine;
return SearchEngine;
}
TArray<FMetasoundFrontendClass> FSearchEngine::FindClassesWithClassName(const FNodeClassName& InName)
{
// Unique string for query with given parameter name.
FString QueryName = FString(TEXT("FindClassesWithClassName")) + InName.GetFullName().ToString();
FFrontendQuery* Query = FindQuery(QueryName);
if (nullptr == Query)
{
// If the query doesn't exist, it needs to be created.
TUniquePtr<FFrontendQuery> NewQuery = MakeUnique<FFrontendQuery>();
// Note: Initial query step is FGenerateNewlyAvailableNodeClasses, which does not run query against already examined node classes.
NewQuery->AddStep<FGenerateNewlyAvailableNodeClasses>()
.AddStep<FFilterClassesByClassName>(InName);
Query = AddQuery(QueryName, MoveTemp(NewQuery));
}
TArray<FMetasoundFrontendClass> Result;
if (ensure(nullptr != Query))
{
// Execute the query again and append the results. (Note: Initial query
// step is FGenerateNewlyAvailableNodeClasses, which does not run query
// against already examined node classes.)
FFrontendQuerySelectionView Selection = Query->ExecuteQueryAndAppend();
TArrayView<const FFrontendQueryEntry* const> Entries = Selection.GetSelection();
// Copy result to array
for (const FFrontendQueryEntry* Entry : Selection.GetSelection())
{
check(Entry->Value.IsType<FMetasoundFrontendClass>());
Result.Add(Entry->Value.Get<FMetasoundFrontendClass>());
}
}
return Result;
}
FFrontendQuery* FSearchEngine::FindQuery(const FString& InQueryName)
{
if (TUniquePtr<FFrontendQuery>* QueryUPtr = QueryCache.Find(InQueryName))
{
return QueryUPtr->Get();
}
return nullptr;
}
FFrontendQuery* FSearchEngine::AddQuery(const FString& InQueryName, TUniquePtr<FFrontendQuery>&& InQuery)
{
FFrontendQuery* QueryPtr = InQuery.Get();
QueryCache.Add(InQueryName, MoveTemp(InQuery));
return QueryPtr;
}
}
}