浏览代码

Fixed an issue where managed resource deserialization was creating a new managed instance instead of populating an existing one

BearishSun 10 年之前
父节点
当前提交
5e8883741e
共有 4 个文件被更改,包括 24 次插入4 次删除
  1. 4 0
      MBansheeEditor/EditorApplication.cs
  2. 11 1
      MBansheeEngine/ScriptObject.cs
  3. 7 3
      SBansheeEngine/Source/BsManagedResource.cpp
  4. 2 0
      TODO.txt

+ 4 - 0
MBansheeEditor/EditorApplication.cs

@@ -274,6 +274,10 @@ namespace BansheeEditor
                 return;
             }
 
+            Debug.Log("PRE COLLECT 0");
+            GC.Collect();
+            Debug.Log("POST COLLECT 0");
+
             string projectPath = ProjectPath;
 
             RecentProject[] recentProjects = EditorSettings.RecentProjects;

+ 11 - 1
MBansheeEngine/ScriptObject.cs

@@ -9,7 +9,17 @@ namespace BansheeEngine
 
         ~ScriptObject()
         {
-            Internal_ManagedInstanceDeleted(mCachedPtr);
+            if (mCachedPtr == IntPtr.Zero)
+            {
+                Debug.LogError("Script object is being finalized but doesn't have a pointer to its interop object. Type: " + GetType());
+
+#if DEBUG
+                // This will cause a crash, so we ignore it in release mode hoping all it causes is a memory leak.
+                Internal_ManagedInstanceDeleted(mCachedPtr);
+#endif
+            }
+            else
+                Internal_ManagedInstanceDeleted(mCachedPtr);
         }
 
         internal IntPtr GetCachedPtr()

+ 7 - 3
SBansheeEngine/Source/BsManagedResource.cpp

@@ -9,6 +9,7 @@
 #include "BsMemorySerializer.h"
 #include "BsScriptResourceManager.h"
 #include "BsMonoUtil.h"
+#include "BsScriptAssemblyManager.h"
 #include "BsDebug.h"
 
 namespace BansheeEngine
@@ -23,8 +24,6 @@ namespace BansheeEngine
 		ManagedResourceMetaDataPtr metaData = bs_shared_ptr_new<ManagedResourceMetaData>();
 		mMetaData = metaData;
 
-		String elementNs;
-		String elementTypeName;
 		MonoUtil::getClassName(managedInstance, metaData->typeNamespace, metaData->typeName);
 
 		MonoClass* managedClass = MonoManager::instance().findClass(metaData->typeNamespace, metaData->typeName);
@@ -78,7 +77,12 @@ namespace BansheeEngine
 			{
 				MemorySerializer ms;
 				ManagedSerializableObjectPtr serializableObject = std::static_pointer_cast<ManagedSerializableObject>(ms.decode(data.data, data.size));
-				serializableObject->deserialize();
+				
+				ManagedResourceMetaDataPtr managedResMetaData = std::static_pointer_cast<ManagedResourceMetaData>(mMetaData);
+				ManagedSerializableObjectInfoPtr currentObjInfo = nullptr;
+
+				if (ScriptAssemblyManager::instance().getSerializableObjectInfo(managedResMetaData->typeNamespace, managedResMetaData->typeName, currentObjInfo))
+					serializableObject->deserialize(mManagedInstance, currentObjInfo);
 			}
 		}
 		else

+ 2 - 0
TODO.txt

@@ -65,6 +65,8 @@ Move data folder within current repo
  - Finally test if opening/creating a project while another one is open is possible
   - Also test save project
 
+Test and fix project unload
+
 Ribek use:
  - Hook up color picker to guicolor field
  - When starting drag from hierarchy tree view it tends to select another object (can't repro)