From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- Runtime/Serialize/AwakeFromLoadQueue.cpp | 395 +++++++++++++++++++++++++++++++ 1 file changed, 395 insertions(+) create mode 100644 Runtime/Serialize/AwakeFromLoadQueue.cpp (limited to 'Runtime/Serialize/AwakeFromLoadQueue.cpp') diff --git a/Runtime/Serialize/AwakeFromLoadQueue.cpp b/Runtime/Serialize/AwakeFromLoadQueue.cpp new file mode 100644 index 0000000..fdb31de --- /dev/null +++ b/Runtime/Serialize/AwakeFromLoadQueue.cpp @@ -0,0 +1,395 @@ +#include "UnityPrefix.h" +#include "AwakeFromLoadQueue.h" +#include "Runtime/Profiler/Profiler.h" +#include "Runtime/Mono/MonoBehaviour.h" +#include "Runtime/Mono/MonoScript.h" +#include "Runtime/Misc/BuildSettings.h" +#if UNITY_EDITOR +#include "Editor/Src/Prefabs/PrefabBackwardsCompatibility.h" +#endif + +PROFILER_INFORMATION(gAwakeFromLoadQueue, "Loading.AwakeFromLoad", kProfilerLoading) + +AwakeFromLoadQueue::AwakeFromLoadQueue (MemLabelRef label) +{ + for(int i=0;i(target.GetInstanceID())) + return true; + } + + return false; +} + + +void AwakeFromLoadQueue::Add (Object& target, TypeTree* oldType, bool safeBinaryLoaded, AwakeFromLoadMode awakeOverride) +{ + Item item; + item.registerObjectPtr = ⌖ + item.objectPPtr = ⌖ + item.classID = target.GetClassID(); + #if UNITY_EDITOR + item.oldType = oldType; + item.safeBinaryLoaded = safeBinaryLoaded; + item.awakeModeOverride = awakeOverride; + #else + Assert(awakeOverride == -1); + #endif + + int queueIndex = DetermineQueueIndex(item.classID); + + m_ItemArrays[queueIndex].push_back(item); +} + +bool SortItemByInstanceID (const AwakeFromLoadQueue::Item& lhs, const AwakeFromLoadQueue::Item& rhs) +{ + return lhs.objectPPtr.GetInstanceID() < rhs.objectPPtr.GetInstanceID(); +} + +static int GetScriptExecutionOrder (int instanceID) +{ + #if ENABLE_SCRIPTING + MonoBehaviour* behaviour = dynamic_instanceID_cast (instanceID); + if (behaviour != NULL) + { + MonoScript* script = behaviour->GetScript(); + if (script) + return script->GetExecutionOrder(); + } + #endif + return 0; +} + +bool AwakeFromLoadQueue::SortBehaviourByExecutionOrderAndInstanceID (int lhs, int rhs) +{ + int lhsExecutionOrder = GetScriptExecutionOrder(lhs); + int rhsExecutionOrder = GetScriptExecutionOrder(rhs); + + if (lhsExecutionOrder != rhsExecutionOrder) + return lhsExecutionOrder < rhsExecutionOrder; + else + return lhs < rhs; +} + +bool SortBehaviourByExecutionOrderAndReverseInstanceID (int lhs, int rhs) +{ + int lhsExecutionOrder = GetScriptExecutionOrder(lhs); + int rhsExecutionOrder = GetScriptExecutionOrder(rhs); + + if (lhsExecutionOrder != rhsExecutionOrder) + return lhsExecutionOrder < rhsExecutionOrder; + else + return lhs > rhs; +} + +static bool SortBehaviourItemByExecutionOrderAndInstanceID (const AwakeFromLoadQueue::Item& lhs, const AwakeFromLoadQueue::Item& rhs) +{ + return AwakeFromLoadQueue::SortBehaviourByExecutionOrderAndInstanceID(lhs.objectPPtr.GetInstanceID(), rhs.objectPPtr.GetInstanceID()); +} + +static bool SortBehaviourItemByExecutionOrderAndReverseInstanceID (const AwakeFromLoadQueue::Item& lhs, const AwakeFromLoadQueue::Item& rhs) +{ + return SortBehaviourByExecutionOrderAndReverseInstanceID(lhs.objectPPtr.GetInstanceID(), rhs.objectPPtr.GetInstanceID()); +} + +///@TODO: Should check consistency always be called immediately before calling Awake??? + +void AwakeFromLoadQueue::PersistentManagerAwakeFromLoad (AwakeFromLoadMode mode, SafeBinaryReadCallbackFunction* safeBinaryCallback) +{ + for (int i=0;i= oldDstSize || dst[d].objectPPtr.GetInstanceID() != src[i].objectPPtr.GetInstanceID()) + { + dst.push_back(src[i]); + } + // else -> The object is in the destination array already. + } +} + +void AwakeFromLoadQueue::InsertAwakeFromLoadQueue (AwakeFromLoadQueue& awakeFromLoadQueue, AwakeFromLoadMode awakeOverride) +{ + for (int i=0;i (ptr); + if (prefab) + prefab->PatchPrefabBackwardsCompatibility(); + + EditorExtension* extension = dynamic_pptr_cast (ptr); + if (extension) + extension->PatchPrefabBackwardsCompatibility(); + } + } + } +} +#endif + + +void AwakeFromLoadQueue::InvokePersistentManagerAwake (Item* objects, unsigned size, AwakeFromLoadMode awakeMode, SafeBinaryReadCallbackFunction* safeBinaryCallback) +{ + #if DEBUGMODE + int previousInstanceID = 0; + #endif + + for (int i=0;iCheckConsistency (); + + #endif + + AwakeFromLoadMode objectAwakeMode = awakeMode; + #if UNITY_EDITOR + if (objects[i].awakeModeOverride != kDefaultAwakeFromLoadInvalid) + objectAwakeMode = objects[i].awakeModeOverride; + #endif + + ptr->AwakeFromLoad (objectAwakeMode); + ptr->ClearPersistentDirty (); + } +} + +void AwakeFromLoadQueue::PersistentManagerAwakeSingleObject (Object& o, TypeTree* oldType, AwakeFromLoadMode awakeMode, bool safeBinaryLoaded, SafeBinaryReadCallbackFunction* safeBinaryCallback) +{ + PROFILER_AUTO(gAwakeFromLoadQueue, &o) + + #if UNITY_EDITOR + // Loaded with SafeBinaryRead thus needs the callback + if (safeBinaryLoaded && safeBinaryCallback != NULL) + safeBinaryCallback (o, *oldType); + o.CheckConsistency (); + #endif + + o.AwakeFromLoad (awakeMode); + o.ClearPersistentDirty (); +} + +void AwakeFromLoadQueue::InvokeAwakeFromLoad (Item* objects, unsigned size, AwakeFromLoadMode mode) +{ + for (int i=0;iAwakeFromLoad(objects[i].awakeModeOverride); + continue; + } + + #endif + + + ptr->AwakeFromLoad(mode); + } + } +} + +void AwakeFromLoadQueue::InvokeCheckConsistency (Item* objects, unsigned size) +{ + for (int i=0;iCheckConsistency(); + } +} + +void AwakeFromLoadQueue::ExtractAllObjects (dynamic_array >& outObjects) +{ + Assert(outObjects.empty()); + + int count = 0; + for (int q=0;q