diff --git a/Source/Engine/Engine/Engine.cpp b/Source/Engine/Engine/Engine.cpp index e3ab1f940..62ebec5a8 100644 --- a/Source/Engine/Engine/Engine.cpp +++ b/Source/Engine/Engine/Engine.cpp @@ -588,6 +588,7 @@ void EngineImpl::InitMainWindow() return; } #endif + PROFILE_CPU_NAMED("Engine::InitMainWindow"); // Create window Engine::MainWindow = Application::CreateMainWindow(); diff --git a/Source/Engine/Foliage/Foliage.cpp b/Source/Engine/Foliage/Foliage.cpp index c3941edc5..ba84723f6 100644 --- a/Source/Engine/Foliage/Foliage.cpp +++ b/Source/Engine/Foliage/Foliage.cpp @@ -328,6 +328,8 @@ FoliageType* Foliage::GetFoliageType(int32 index) void Foliage::AddFoliageType(Model* model) { + PROFILE_CPU(); + // Ensure to have unique model CHECK(model); for (int32 i = 0; i < FoliageTypes.Count(); i++) @@ -352,6 +354,8 @@ void Foliage::AddFoliageType(Model* model) void Foliage::RemoveFoliageType(int32 index) { + PROFILE_CPU(); + // Remove instances using this foliage type if (FoliageTypes.Count() != 1) { diff --git a/Source/Engine/Scripting/BinaryModule.cpp b/Source/Engine/Scripting/BinaryModule.cpp index be5a356d2..cb4b20e76 100644 --- a/Source/Engine/Scripting/BinaryModule.cpp +++ b/Source/Engine/Scripting/BinaryModule.cpp @@ -4,6 +4,7 @@ #include "ScriptingObject.h" #include "Engine/Core/Log.h" #include "Engine/Threading/Threading.h" +#include "Engine/Profiler/ProfilerCPU.h" #include "ManagedCLR/MAssembly.h" #include "ManagedCLR/MClass.h" #include "ManagedCLR/MType.h" @@ -589,6 +590,7 @@ MMethod* ManagedBinaryModule::FindMethod(MClass* mclass, const ScriptingTypeMeth void ManagedBinaryModule::OnLoading(MAssembly* assembly) { + PROFILE_CPU(); for (ScriptingType& type : Types) { type.InitRuntime(); @@ -597,6 +599,7 @@ void ManagedBinaryModule::OnLoading(MAssembly* assembly) void ManagedBinaryModule::OnLoaded(MAssembly* assembly) { + PROFILE_CPU(); ASSERT(ClassToTypeIndex.IsEmpty()); const auto& classes = assembly->GetClasses(); @@ -750,6 +753,8 @@ void ManagedBinaryModule::OnLoaded(MAssembly* assembly) void ManagedBinaryModule::OnUnloading(MAssembly* assembly) { + PROFILE_CPU(); + // Clear managed-only types for (int32 i = _firstManagedTypeIndex; i < Types.Count(); i++) { diff --git a/Source/Engine/Scripting/ManagedCLR/MAssembly.Mono.cpp b/Source/Engine/Scripting/ManagedCLR/MAssembly.Mono.cpp index 32ae90870..4d6c0c5ec 100644 --- a/Source/Engine/Scripting/ManagedCLR/MAssembly.Mono.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MAssembly.Mono.cpp @@ -17,6 +17,7 @@ #include "Engine/Scripting/Scripting.h" #include "Engine/Platform/StringUtils.h" #include "Engine/Platform/File.h" +#include "Engine/Profiler/ProfilerCPU.h" #include "Engine/Threading/Threading.h" #include #include @@ -49,9 +50,10 @@ String MAssembly::ToString() const bool MAssembly::Load(const String& assemblyPath) { - // Skip if already loaded if (IsLoaded()) return false; + PROFILE_CPU(); + ZoneText(*assemblyPath, assemblyPath.Length()); // Check file path if (!FileSystem::FileExists(assemblyPath)) @@ -83,9 +85,13 @@ bool MAssembly::Load(const String& assemblyPath) bool MAssembly::Load(MonoImage* monoImage) { - // Skip if already loaded if (IsLoaded()) return false; + PROFILE_CPU(); +#if TRACY_ENABLE + const StringAnsiView monoImageName(mono_image_get_name(monoImage)); + ZoneText(*monoImageName, monoImageName.Length()); +#endif // Ensure to be unloaded Unload(); @@ -114,6 +120,7 @@ void MAssembly::Unload(bool isReloading) { if (!IsLoaded()) return; + PROFILE_CPU(); Unloading(this); @@ -223,6 +230,11 @@ const MAssembly::ClassesDictionary& MAssembly::GetClasses() const { if (_hasCachedClasses || !IsLoaded()) return _classes; + PROFILE_CPU(); +#if TRACY_ENABLE + const StringAnsiView monoImageName(mono_image_get_name(_monoImage)); + ZoneText(*monoImageName, monoImageName.Length()); +#endif ScopeLock lock(_locker); if (_hasCachedClasses) return _classes; diff --git a/Source/Engine/Scripting/ManagedCLR/MCore.Mono.cpp b/Source/Engine/Scripting/ManagedCLR/MCore.Mono.cpp index 839e2a1f2..cb8157e49 100644 --- a/Source/Engine/Scripting/ManagedCLR/MCore.Mono.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MCore.Mono.cpp @@ -342,6 +342,7 @@ static void* OnMonoLinuxDlSym(void* handle, const char* name, char** err, void* bool MCore::LoadEngine() { + PROFILE_CPU(); ASSERT(Globals::MonoPath.IsANSI()); #if 0 @@ -609,16 +610,19 @@ void MCore::ExitThread() void MCore::GC::Collect() { + PROFILE_CPU(); mono_gc_collect(mono_gc_max_generation()); } void MCore::GC::Collect(int32 generation) { + PROFILE_CPU(); mono_gc_collect(generation); } void MCore::GC::WaitForPendingFinalizers() { + PROFILE_CPU(); if (mono_gc_pending_finalizers()) { mono_gc_finalize_notify(); diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index 55a60f799..715c1caf6 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -409,6 +409,7 @@ bool Scripting::LoadBinaryModules(const String& path, const String& projectFolde bool Scripting::Load() { + PROFILE_CPU(); // Note: this action can be called from main thread (due to Mono problems with assemblies actions from other threads) ASSERT(IsInMainThread()); @@ -472,6 +473,7 @@ bool Scripting::Load() void Scripting::Release() { + PROFILE_CPU(); // Note: this action can be called from main thread (due to Mono problems with assemblies actions from other threads) ASSERT(IsInMainThread()); @@ -718,7 +720,6 @@ ScriptingObject* Scripting::FindObject(Guid id, MClass* type) { if (!id.IsValid()) return nullptr; - PROFILE_CPU(); // Try to map object id @@ -798,7 +799,6 @@ ScriptingObject* Scripting::FindObject(const MonoObject* managedInstance) { if (managedInstance == nullptr) return nullptr; - PROFILE_CPU(); // TODO: optimize it by reading the unmanagedPtr or _internalId from managed Object property diff --git a/Source/ThirdParty/tracy/client/TracyScoped.hpp b/Source/ThirdParty/tracy/client/TracyScoped.hpp index fa6a52808..cb448293e 100644 --- a/Source/ThirdParty/tracy/client/TracyScoped.hpp +++ b/Source/ThirdParty/tracy/client/TracyScoped.hpp @@ -112,6 +112,22 @@ inline void ScopedZone::Text( const char* txt, size_t size ) TracyLfqCommit; } +inline void ScopedZone::Text(const Char* txt, size_t size) +{ + assert( size < std::numeric_limits::max() ); + if( !m_active ) return; +#ifdef TRACY_ON_DEMAND + if( GetProfiler().ConnectionId() != m_connectionId ) return; +#endif + auto ptr = (char*)tracy_malloc( size ); + for( int i = 0; i < size; i++) + ptr[i] = (char)txt[i]; + TracyLfqPrepare( QueueType::ZoneText ); + MemWrite( &item->zoneTextFat.text, (uint64_t)ptr ); + MemWrite( &item->zoneTextFat.size, (uint16_t)size ); + TracyLfqCommit; +} + inline void ScopedZone::Name( const char* txt, size_t size ) { assert( size < std::numeric_limits::max() ); diff --git a/Source/ThirdParty/tracy/common/TracySystem.hpp b/Source/ThirdParty/tracy/common/TracySystem.hpp index f285b762a..0c9ca6394 100644 --- a/Source/ThirdParty/tracy/common/TracySystem.hpp +++ b/Source/ThirdParty/tracy/common/TracySystem.hpp @@ -59,6 +59,7 @@ public: ~ScopedZone(); void Text( const char* txt, size_t size ); + void Text( const Char* txt, size_t size ); void Name( const char* txt, size_t size ); void Name( const Char* txt, size_t size ); void Color( uint32_t color );