Add even more profiler events

This commit is contained in:
Wojtek Figat
2021-07-07 15:15:33 +02:00
parent afc5bb5731
commit 6938821467
13 changed files with 115 additions and 18 deletions

View File

@@ -37,6 +37,7 @@
#include "Engine/Utilities/Encryption.h" #include "Engine/Utilities/Encryption.h"
#include "Engine/Navigation/Navigation.h" #include "Engine/Navigation/Navigation.h"
#include "Engine/Particles/ParticleEmitter.h" #include "Engine/Particles/ParticleEmitter.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Input/Input.h" #include "Engine/Input/Input.h"
#include "Engine/Input/Mouse.h" #include "Engine/Input/Mouse.h"
#include "Engine/Input/Keyboard.h" #include "Engine/Input/Keyboard.h"
@@ -1007,11 +1008,16 @@ public:
static void DeserializeSceneObject(SceneObject* sceneObject, MonoString* jsonObj) static void DeserializeSceneObject(SceneObject* sceneObject, MonoString* jsonObj)
{ {
PROFILE_CPU_NAMED("DeserializeSceneObject");
StringAnsi json; StringAnsi json;
MUtils::ToString(jsonObj, json); MUtils::ToString(jsonObj, json);
rapidjson_flax::Document document; rapidjson_flax::Document document;
document.Parse(json.Get(), json.Length()); {
PROFILE_CPU_NAMED("Json.Parse");
document.Parse(json.Get(), json.Length());
}
if (document.HasParseError()) if (document.HasParseError())
{ {
Log::JsonParseException(document.GetParseError(), document.GetErrorOffset()); Log::JsonParseException(document.GetParseError(), document.GetErrorOffset());
@@ -1022,7 +1028,10 @@ public:
modifier->EngineBuild = FLAXENGINE_VERSION_BUILD; modifier->EngineBuild = FLAXENGINE_VERSION_BUILD;
Scripting::ObjectsLookupIdMapping.Set(&modifier.Value->IdsMapping); Scripting::ObjectsLookupIdMapping.Set(&modifier.Value->IdsMapping);
sceneObject->Deserialize(document, modifier.Value); {
PROFILE_CPU_NAMED("Deserialize");
sceneObject->Deserialize(document, modifier.Value);
}
} }
static void LoadAsset(Guid* id) static void LoadAsset(Guid* id)

View File

@@ -371,12 +371,14 @@ namespace FlaxEditor.Modules
/// <param name="fullCleanup">True if cleanup all data (including serialized and cached data). Otherwise will just clear living references to the scene objects.</param> /// <param name="fullCleanup">True if cleanup all data (including serialized and cached data). Otherwise will just clear living references to the scene objects.</param>
public void ClearRefsToSceneObjects(bool fullCleanup = false) public void ClearRefsToSceneObjects(bool fullCleanup = false)
{ {
Profiler.BeginEvent("SceneModule.ClearRefsToSceneObjects");
Editor.SceneEditing.Deselect(); Editor.SceneEditing.Deselect();
if (fullCleanup) if (fullCleanup)
{ {
Undo.Clear(); Undo.Clear();
} }
Profiler.EndEvent();
} }
private void OnSceneLoaded(Scene scene, Guid sceneId) private void OnSceneLoaded(Scene scene, Guid sceneId)

View File

@@ -87,15 +87,18 @@ namespace FlaxEditor.States
private void CacheSelection() private void CacheSelection()
{ {
Profiler.BeginEvent("PlayingState.CacheSelection");
_selectedObjects.Clear(); _selectedObjects.Clear();
for (int i = 0; i < Editor.SceneEditing.Selection.Count; i++) for (int i = 0; i < Editor.SceneEditing.Selection.Count; i++)
{ {
_selectedObjects.Add(Editor.SceneEditing.Selection[i].ID); _selectedObjects.Add(Editor.SceneEditing.Selection[i].ID);
} }
Profiler.EndEvent();
} }
private void RestoreSelection() private void RestoreSelection()
{ {
Profiler.BeginEvent("PlayingState.RestoreSelection");
var count = Editor.SceneEditing.Selection.Count; var count = Editor.SceneEditing.Selection.Count;
Editor.SceneEditing.Selection.Clear(); Editor.SceneEditing.Selection.Clear();
for (int i = 0; i < _selectedObjects.Count; i++) for (int i = 0; i < _selectedObjects.Count; i++)
@@ -106,6 +109,7 @@ namespace FlaxEditor.States
} }
if (Editor.SceneEditing.Selection.Count != count) if (Editor.SceneEditing.Selection.Count != count)
Editor.SceneEditing.OnSelectionChanged(); Editor.SceneEditing.OnSelectionChanged();
Profiler.EndEvent();
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -114,6 +118,7 @@ namespace FlaxEditor.States
/// <inheritdoc /> /// <inheritdoc />
public override void OnEnter() public override void OnEnter()
{ {
Profiler.BeginEvent("PlayingState.OnEnter");
Editor.OnPlayBeginning(); Editor.OnPlayBeginning();
CacheSelection(); CacheSelection();
@@ -137,6 +142,7 @@ namespace FlaxEditor.States
RestoreSelection(); RestoreSelection();
Editor.OnPlayBegin(); Editor.OnPlayBegin();
Profiler.EndEvent();
} }
private void SetupEditorEnvOptions() private void SetupEditorEnvOptions()
@@ -156,6 +162,7 @@ namespace FlaxEditor.States
/// <inheritdoc /> /// <inheritdoc />
public override void OnExit(State nextState) public override void OnExit(State nextState)
{ {
Profiler.BeginEvent("PlayingState.OnExit");
IsPaused = true; IsPaused = true;
// Remove references to the scene objects // Remove references to the scene objects
@@ -178,6 +185,7 @@ namespace FlaxEditor.States
RestoreSelection(); RestoreSelection();
Editor.OnPlayEnd(); Editor.OnPlayEnd();
Profiler.EndEvent();
} }
} }
} }

View File

@@ -37,6 +37,7 @@ namespace FlaxEditor.Utilities
{ {
if (HasData) if (HasData)
throw new InvalidOperationException("DuplicateScenes has already gathered scene data."); throw new InvalidOperationException("DuplicateScenes has already gathered scene data.");
Profiler.BeginEvent("DuplicateScenes.GatherSceneData");
Editor.Log("Collecting scene data"); Editor.Log("Collecting scene data");
@@ -44,7 +45,10 @@ namespace FlaxEditor.Utilities
var scenes = Level.Scenes; var scenes = Level.Scenes;
int scenesCount = scenes.Length; int scenesCount = scenes.Length;
if (scenesCount == 0) if (scenesCount == 0)
{
Profiler.EndEvent();
throw new InvalidOperationException("Cannot gather scene data. No scene loaded."); throw new InvalidOperationException("Cannot gather scene data. No scene loaded.");
}
var sceneIds = new Guid[scenesCount]; var sceneIds = new Guid[scenesCount];
for (int i = 0; i < scenesCount; i++) for (int i = 0; i < scenesCount; i++)
{ {
@@ -66,17 +70,24 @@ namespace FlaxEditor.Utilities
// Delete old scenes // Delete old scenes
if (Level.UnloadAllScenes()) if (Level.UnloadAllScenes())
{
Profiler.EndEvent();
throw new FlaxException("Failed to unload scenes."); throw new FlaxException("Failed to unload scenes.");
}
FlaxEngine.Scripting.FlushRemovedObjects(); FlaxEngine.Scripting.FlushRemovedObjects();
// Ensure that old scenes has been unregistered // Ensure that old scenes has been unregistered
{ {
var noScenes = Level.Scenes; var noScenes = Level.Scenes;
if (noScenes != null && noScenes.Length != 0) if (noScenes != null && noScenes.Length != 0)
{
Profiler.EndEvent();
throw new FlaxException("Failed to unload scenes."); throw new FlaxException("Failed to unload scenes.");
}
} }
Editor.Log(string.Format("Gathered {0} scene(s)!", scenesCount)); Editor.Log(string.Format("Gathered {0} scene(s)!", scenesCount));
Profiler.EndEvent();
} }
/// <summary> /// <summary>
@@ -86,6 +97,7 @@ namespace FlaxEditor.Utilities
{ {
if (!HasData) if (!HasData)
throw new InvalidOperationException("DuplicateScenes has not gathered scene data yet."); throw new InvalidOperationException("DuplicateScenes has not gathered scene data yet.");
Profiler.BeginEvent("DuplicateScenes.CreateScenes");
Editor.Log("Creating scenes"); Editor.Log("Creating scenes");
@@ -96,8 +108,13 @@ namespace FlaxEditor.Utilities
var data = _scenesData[i]; var data = _scenesData[i];
var scene = Level.LoadSceneFromBytes(data.Bytes); var scene = Level.LoadSceneFromBytes(data.Bytes);
if (scene == null) if (scene == null)
{
Profiler.EndEvent();
throw new FlaxException("Failed to deserialize scene"); throw new FlaxException("Failed to deserialize scene");
}
} }
Profiler.EndEvent();
} }
/// <summary> /// <summary>
@@ -105,14 +122,19 @@ namespace FlaxEditor.Utilities
/// </summary> /// </summary>
public void DeletedScenes() public void DeletedScenes()
{ {
Profiler.BeginEvent("DuplicateScenes.DeletedScenes");
Editor.Log("Restoring scene data"); Editor.Log("Restoring scene data");
// TODO: here we can keep changes for actors marked to keep their state after simulation // TODO: here we can keep changes for actors marked to keep their state after simulation
// Delete new scenes // Delete new scenes
if (Level.UnloadAllScenes()) if (Level.UnloadAllScenes())
{
Profiler.EndEvent();
throw new FlaxException("Failed to unload scenes."); throw new FlaxException("Failed to unload scenes.");
}
FlaxEngine.Scripting.FlushRemovedObjects(); FlaxEngine.Scripting.FlushRemovedObjects();
Profiler.EndEvent();
} }
/// <summary> /// <summary>
@@ -122,6 +144,7 @@ namespace FlaxEditor.Utilities
{ {
if (!HasData) if (!HasData)
throw new InvalidOperationException("DuplicateScenes has not gathered scene data yet."); throw new InvalidOperationException("DuplicateScenes has not gathered scene data yet.");
Profiler.BeginEvent("DuplicateScenes.RestoreSceneData");
// Deserialize old scenes // Deserialize old scenes
for (int i = 0; i < _scenesData.Count; i++) for (int i = 0; i < _scenesData.Count; i++)
@@ -129,7 +152,10 @@ namespace FlaxEditor.Utilities
var data = _scenesData[i]; var data = _scenesData[i];
var scene = Level.LoadSceneFromBytes(data.Bytes); var scene = Level.LoadSceneFromBytes(data.Bytes);
if (scene == null) if (scene == null)
{
Profiler.EndEvent();
throw new FlaxException("Failed to deserialize scene"); throw new FlaxException("Failed to deserialize scene");
}
// Restore `dirty` state // Restore `dirty` state
if (data.IsDirty) if (data.IsDirty)
@@ -138,6 +164,7 @@ namespace FlaxEditor.Utilities
_scenesData.Clear(); _scenesData.Clear();
Editor.Log("Restored previous scenes"); Editor.Log("Restored previous scenes");
Profiler.EndEvent();
} }
} }
} }

View File

@@ -16,6 +16,7 @@
#include "Engine/Content/Factories/JsonAssetFactory.h" #include "Engine/Content/Factories/JsonAssetFactory.h"
#include "Engine/Core/Cache.h" #include "Engine/Core/Cache.h"
#include "Engine/Debug/Exceptions/JsonParseException.h" #include "Engine/Debug/Exceptions/JsonParseException.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/Scripting.h"
#include "Engine/Utilities/StringConverter.h" #include "Engine/Utilities/StringConverter.h"
@@ -31,6 +32,7 @@ String JsonAssetBase::GetData() const
{ {
if (Data == nullptr) if (Data == nullptr)
return String::Empty; return String::Empty;
PROFILE_CPU_NAMED("JsonAsset.GetData");
// Get serialized data // Get serialized data
rapidjson_flax::StringBuffer buffer; rapidjson_flax::StringBuffer buffer;
@@ -133,7 +135,10 @@ Asset::LoadResult JsonAssetBase::loadAsset()
#endif #endif
// Parse json document // Parse json document
Document.Parse(data.Get<char>(), data.Length()); {
PROFILE_CPU_NAMED("Json.Parse");
Document.Parse(data.Get<char>(), data.Length());
}
if (Document.HasParseError()) if (Document.HasParseError())
{ {
Log::JsonParseException(Document.GetParseError(), Document.GetErrorOffset()); Log::JsonParseException(Document.GetParseError(), Document.GetErrorOffset());

View File

@@ -8,6 +8,7 @@
#include "Engine/Serialization/JsonWriters.h" #include "Engine/Serialization/JsonWriters.h"
#include "Engine/Level/Types.h" #include "Engine/Level/Types.h"
#include "Engine/Debug/Exceptions/JsonParseException.h" #include "Engine/Debug/Exceptions/JsonParseException.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include <ThirdParty/rapidjson/document.h> #include <ThirdParty/rapidjson/document.h>
bool JsonStorageProxy::IsValidExtension(const StringView& extension) bool JsonStorageProxy::IsValidExtension(const StringView& extension)
@@ -17,6 +18,7 @@ bool JsonStorageProxy::IsValidExtension(const StringView& extension)
bool JsonStorageProxy::GetAssetInfo(const StringView& path, Guid& resultId, String& resultDataTypeName) bool JsonStorageProxy::GetAssetInfo(const StringView& path, Guid& resultId, String& resultDataTypeName)
{ {
PROFILE_CPU();
// TODO: we could just open file and start reading until we find 'ID:..' without parsing whole file - could be much more faster // TODO: we could just open file and start reading until we find 'ID:..' without parsing whole file - could be much more faster
// Load file // Load file
@@ -28,7 +30,10 @@ bool JsonStorageProxy::GetAssetInfo(const StringView& path, Guid& resultId, Stri
// Parse data // Parse data
rapidjson_flax::Document document; rapidjson_flax::Document document;
document.Parse((const char*)fileData.Get(), fileData.Count()); {
PROFILE_CPU_NAMED("Json.Parse");
document.Parse((const char*)fileData.Get(), fileData.Count());
}
if (document.HasParseError()) if (document.HasParseError())
{ {
Log::JsonParseException(document.GetParseError(), document.GetErrorOffset(), path); Log::JsonParseException(document.GetParseError(), document.GetErrorOffset(), path);
@@ -81,6 +86,7 @@ void ChangeIds(rapidjson_flax::Value& obj, rapidjson_flax::Document& document, c
bool JsonStorageProxy::ChangeId(const StringView& path, const Guid& newId) bool JsonStorageProxy::ChangeId(const StringView& path, const Guid& newId)
{ {
#if USE_EDITOR #if USE_EDITOR
PROFILE_CPU();
// Load file // Load file
Array<byte> fileData; Array<byte> fileData;
@@ -91,7 +97,10 @@ bool JsonStorageProxy::ChangeId(const StringView& path, const Guid& newId)
// Parse data // Parse data
rapidjson_flax::Document document; rapidjson_flax::Document document;
document.Parse((const char*)fileData.Get(), fileData.Count()); {
PROFILE_CPU_NAMED("Json.Parse");
document.Parse((const char*)fileData.Get(), fileData.Count());
}
if (document.HasParseError()) if (document.HasParseError())
{ {
Log::JsonParseException(document.GetParseError(), document.GetErrorOffset(), path); Log::JsonParseException(document.GetParseError(), document.GetErrorOffset(), path);

View File

@@ -19,6 +19,7 @@
#include "Engine/Content/AssetReference.h" #include "Engine/Content/AssetReference.h"
#include "Engine/Engine/EngineService.h" #include "Engine/Engine/EngineService.h"
#include "Engine/Engine/Globals.h" #include "Engine/Engine/Globals.h"
#include "Engine/Profiler/ProfilerCPU.h"
#include "Engine/Streaming/StreamingSettings.h" #include "Engine/Streaming/StreamingSettings.h"
class GameSettingsService : public EngineService class GameSettingsService : public EngineService
@@ -74,6 +75,7 @@ GameSettings* GameSettings::Get()
{ {
// Load root game settings asset. // Load root game settings asset.
// It may be missing in editor during dev but must be ready in the build game. // It may be missing in editor during dev but must be ready in the build game.
PROFILE_CPU();
const auto assetPath = Globals::ProjectContentFolder / TEXT("GameSettings.json"); const auto assetPath = Globals::ProjectContentFolder / TEXT("GameSettings.json");
GameSettingsAsset = Content::LoadAsync<JsonAsset>(assetPath); GameSettingsAsset = Content::LoadAsync<JsonAsset>(assetPath);
if (GameSettingsAsset == nullptr) if (GameSettingsAsset == nullptr)
@@ -99,6 +101,8 @@ GameSettings* GameSettings::Get()
bool GameSettings::Load() bool GameSettings::Load()
{ {
PROFILE_CPU();
// Load main settings asset // Load main settings asset
auto settings = Get(); auto settings = Get();
if (!settings) if (!settings)
@@ -143,7 +147,7 @@ bool GameSettings::Load()
void GameSettings::Apply() void GameSettings::Apply()
{ {
// TODO: impl this PROFILE_CPU();
#define APPLY_SETTINGS(type) \ #define APPLY_SETTINGS(type) \
{ \ { \
type* obj = type::Get(); \ type* obj = type::Get(); \

View File

@@ -1599,7 +1599,10 @@ bool Actor::FromBytes(const Span<byte>& data, Array<Actor*>& output, ISerializeM
// Load JSON // Load JSON
rapidjson_flax::Document document; rapidjson_flax::Document document;
document.Parse(buffer, bufferSize); {
PROFILE_CPU_NAMED("Json.Parse");
document.Parse(buffer, bufferSize);
}
if (document.HasParseError()) if (document.HasParseError())
{ {
Log::JsonParseException(document.GetParseError(), document.GetErrorOffset()); Log::JsonParseException(document.GetParseError(), document.GetErrorOffset());
@@ -1638,7 +1641,10 @@ bool Actor::FromBytes(const Span<byte>& data, Array<Actor*>& output, ISerializeM
// Load JSON // Load JSON
rapidjson_flax::Document document; rapidjson_flax::Document document;
document.Parse(buffer, bufferSize); {
PROFILE_CPU_NAMED("Json.Parse");
document.Parse(buffer, bufferSize);
}
if (document.HasParseError()) if (document.HasParseError())
{ {
Log::JsonParseException(document.GetParseError(), document.GetErrorOffset()); Log::JsonParseException(document.GetParseError(), document.GetErrorOffset());
@@ -1763,7 +1769,10 @@ void Actor::FromJson(const StringAnsiView& json)
// Load JSON // Load JSON
rapidjson_flax::Document document; rapidjson_flax::Document document;
document.Parse(json.Get(), json.Length()); {
PROFILE_CPU_NAMED("Json.Parse");
document.Parse(json.Get(), json.Length());
}
if (document.HasParseError()) if (document.HasParseError())
{ {
Log::JsonParseException(document.GetParseError(), document.GetErrorOffset()); Log::JsonParseException(document.GetParseError(), document.GetErrorOffset());

View File

@@ -496,6 +496,7 @@ public:
// - load scenes (from temporary files) // - load scenes (from temporary files)
// Note: we don't want to override original scene files // Note: we don't want to override original scene files
PROFILE_CPU_NAMED("Level.ReloadScripts");
LOG(Info, "Scripts reloading start"); LOG(Info, "Scripts reloading start");
const auto startTime = DateTime::NowUTC(); const auto startTime = DateTime::NowUTC();
@@ -565,7 +566,10 @@ public:
// Parse json // Parse json
const auto& sceneData = scenes[i].Data; const auto& sceneData = scenes[i].Data;
ISerializable::SerializeDocument document; ISerializable::SerializeDocument document;
document.Parse(sceneData.GetString(), sceneData.GetSize()); {
PROFILE_CPU_NAMED("Json.Parse");
document.Parse(sceneData.GetString(), sceneData.GetSize());
}
if (document.HasParseError()) if (document.HasParseError())
{ {
LOG(Error, "Failed to deserialize scene {0}. Result: {1}", scenes[i].Name, GetParseError_En(document.GetParseError())); LOG(Error, "Failed to deserialize scene {0}. Result: {1}", scenes[i].Name, GetParseError_En(document.GetParseError()));
@@ -851,7 +855,10 @@ bool Level::loadScene(const BytesContainer& sceneData, bool autoInitialize, Scen
// Parse scene JSON file // Parse scene JSON file
rapidjson_flax::Document document; rapidjson_flax::Document document;
document.Parse(sceneData.Get<char>(), sceneData.Length()); {
PROFILE_CPU_NAMED("Json.Parse");
document.Parse(sceneData.Get<char>(), sceneData.Length());
}
if (document.HasParseError()) if (document.HasParseError())
{ {
Log::JsonParseException(document.GetParseError(), document.GetErrorOffset()); Log::JsonParseException(document.GetParseError(), document.GetErrorOffset());
@@ -869,9 +876,7 @@ bool Level::loadScene(rapidjson_flax::Document& document, bool autoInitialize, S
LOG(Error, "Missing Data member."); LOG(Error, "Missing Data member.");
return true; return true;
} }
const int32 saveEngineBuild = JsonTools::GetInt(document, "EngineBuild", 0); const int32 saveEngineBuild = JsonTools::GetInt(document, "EngineBuild", 0);
return loadScene(data->value, saveEngineBuild, autoInitialize, outScene); return loadScene(data->value, saveEngineBuild, autoInitialize, outScene);
} }

View File

@@ -217,7 +217,10 @@ void PrefabInstanceData::SerializePrefabInstances(Array<PrefabInstanceData>& pre
writer.EndArray(); writer.EndArray();
// Parse json to get DOM // Parse json to get DOM
instance.Data.Parse(tmpBuffer.GetString(), tmpBuffer.GetSize()); {
PROFILE_CPU_NAMED("Json.Parse");
instance.Data.Parse(tmpBuffer.GetString(), tmpBuffer.GetSize());
}
if (instance.Data.HasParseError()) if (instance.Data.HasParseError())
{ {
LOG(Warning, "Failed to parse serialized scene objects data."); LOG(Warning, "Failed to parse serialized scene objects data.");
@@ -462,7 +465,10 @@ bool PrefabInstanceData::SynchronizePrefabInstances(Array<PrefabInstanceData>& p
writer.EndArray(); writer.EndArray();
// Parse json to get DOM // Parse json to get DOM
defaultInstanceData.Parse(tmpBuffer.GetString(), tmpBuffer.GetSize()); {
PROFILE_CPU_NAMED("Json.Parse");
defaultInstanceData.Parse(tmpBuffer.GetString(), tmpBuffer.GetSize());
}
if (defaultInstanceData.HasParseError()) if (defaultInstanceData.HasParseError())
{ {
LOG(Warning, "Failed to parse serialized scene objects data."); LOG(Warning, "Failed to parse serialized scene objects data.");
@@ -666,7 +672,10 @@ bool Prefab::ApplyAllInternal(Actor* targetActor, bool linkTargetActorObjectToPr
newPrefabInstanceIdToDataIndex.EnsureCapacity(ObjectsCount * 4); newPrefabInstanceIdToDataIndex.EnsureCapacity(ObjectsCount * 4);
{ {
// Parse json to DOM document // Parse json to DOM document
diffDataDocument.Parse(dataBuffer.GetString(), dataBuffer.GetSize()); {
PROFILE_CPU_NAMED("Json.Parse");
diffDataDocument.Parse(dataBuffer.GetString(), dataBuffer.GetSize());
}
if (diffDataDocument.HasParseError()) if (diffDataDocument.HasParseError())
{ {
LOG(Warning, "Failed to parse serialized scene objects data."); LOG(Warning, "Failed to parse serialized scene objects data.");

View File

@@ -372,7 +372,10 @@ bool PrefabManager::CreatePrefab(Actor* targetActor, const StringView& outputPat
{ {
// Parse json to DOM document // Parse json to DOM document
rapidjson_flax::Document doc; rapidjson_flax::Document doc;
doc.Parse(actorsDataBuffer.GetString(), actorsDataBuffer.GetSize()); {
PROFILE_CPU_NAMED("Json.Parse");
doc.Parse(actorsDataBuffer.GetString(), actorsDataBuffer.GetSize());
}
if (doc.HasParseError()) if (doc.HasParseError())
{ {
LOG(Warning, "Failed to parse serialized actors data."); LOG(Warning, "Failed to parse serialized actors data.");

View File

@@ -85,18 +85,22 @@ namespace FlaxEngine
#if FLAX_EDITOR #if FLAX_EDITOR
internal static void InitializeGamePlugins() internal static void InitializeGamePlugins()
{ {
Profiler.BeginEvent("PluginManager.InitializeGamePlugins");
for (var i = 0; i < _gamePlugins.Count; i++) for (var i = 0; i < _gamePlugins.Count; i++)
{ {
InvokeInitialize(_gamePlugins[i]); InvokeInitialize(_gamePlugins[i]);
} }
Profiler.EndEvent();
} }
internal static void DeinitializeGamePlugins() internal static void DeinitializeGamePlugins()
{ {
Profiler.BeginEvent("PluginManager.DeinitializeGamePlugins");
for (var i = _gamePlugins.Count - 1; i >= 0; i--) for (var i = _gamePlugins.Count - 1; i >= 0; i--)
{ {
InvokeDeinitialize(_gamePlugins[i]); InvokeDeinitialize(_gamePlugins[i]);
} }
Profiler.EndEvent();
} }
#endif #endif

View File

@@ -259,7 +259,10 @@ bool Scripting::LoadBinaryModules(const String& path, const String& projectFolde
// Parse Json data // Parse Json data
rapidjson_flax::Document document; rapidjson_flax::Document document;
document.Parse((char*)fileData.Get(), fileData.Count()); {
PROFILE_CPU_NAMED("Json.Parse");
document.Parse((char*)fileData.Get(), fileData.Count());
}
if (document.HasParseError()) if (document.HasParseError())
{ {
LOG(Error, "Failed to file contents."); LOG(Error, "Failed to file contents.");