From 5e31a678bd678def61c3c9db527f157c719c7fbb Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 5 May 2023 10:49:07 +0200 Subject: [PATCH] Improve C# Object comparison by using native pointer compare #1061 #713 #795 --- .../CustomEditors/Values/ValueContainer.cs | 2 +- .../Editor/GUI/Timeline/Tracks/ActorTrack.cs | 2 +- Source/Engine/Scripting/Object.cs | 18 +++++++++++++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Source/Editor/CustomEditors/Values/ValueContainer.cs b/Source/Editor/CustomEditors/Values/ValueContainer.cs index 61c223835..53af4387f 100644 --- a/Source/Editor/CustomEditors/Values/ValueContainer.cs +++ b/Source/Editor/CustomEditors/Values/ValueContainer.cs @@ -187,7 +187,7 @@ namespace FlaxEditor.CustomEditors { for (int i = 0; i < Count; i++) { - if (this[i] == referenceSceneObject) + if ((SceneObject)this[i] == referenceSceneObject) continue; if (this[i] == null || (this[i] is SceneObject valueSceneObject && valueSceneObject && valueSceneObject.PrefabObjectID != referenceSceneObject.PrefabObjectID)) diff --git a/Source/Editor/GUI/Timeline/Tracks/ActorTrack.cs b/Source/Editor/GUI/Timeline/Tracks/ActorTrack.cs index 9e51cc21a..eb3fa39b6 100644 --- a/Source/Editor/GUI/Timeline/Tracks/ActorTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/ActorTrack.cs @@ -174,7 +174,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks continue; // Prevent from adding the same track twice - if (SubTracks.Any(x => x is IObjectTrack y && y.Object == script)) + if (SubTracks.Any(x => x is IObjectTrack y && y.Object as SceneObject == script)) continue; var name = Utilities.Utils.GetPropertyNameUI(script.GetType().Name); diff --git a/Source/Engine/Scripting/Object.cs b/Source/Engine/Scripting/Object.cs index ce7846d73..bc1a4b1b5 100644 --- a/Source/Engine/Scripting/Object.cs +++ b/Source/Engine/Scripting/Object.cs @@ -212,9 +212,11 @@ namespace FlaxEngine /// /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool operator == (Object left, Object right) + public static bool operator ==(Object left, Object right) { - return Object.Equals(left, right); + IntPtr leftPtr = (object)left != null ? left.__unmanagedPtr : IntPtr.Zero; + IntPtr rightPtr = (object)right != null ? right.__unmanagedPtr : IntPtr.Zero; + return leftPtr == rightPtr; } /// @@ -226,7 +228,17 @@ namespace FlaxEngine [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool operator !=(Object left, Object right) { - return !Object.Equals(left, right); + IntPtr leftPtr = (object)left != null ? left.__unmanagedPtr : IntPtr.Zero; + IntPtr rightPtr = (object)right != null ? right.__unmanagedPtr : IntPtr.Zero; + return leftPtr != rightPtr; + } + + /// + public override bool Equals(object obj) + { + if (obj is FlaxEngine.Object o) + return o.__unmanagedPtr == __unmanagedPtr; + return false; } ///