Skip to content

Commit e76e73c

Browse files
committed
回收逻辑
1 parent a55a34c commit e76e73c

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
lines changed

unity/Assets/core/upm/Runtime/Src/IL2Cpp/Native/NativeAPI.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ public static void SetLogCallback(LogCallback log, LogCallback logWarning, LogCa
731731
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || PUERTS_GENERAL || (UNITY_WSA && !UNITY_EDITOR)
732732
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
733733
#endif
734-
public delegate IntPtr pesapi_get_ref_internal_fields_func(IntPtr value_ref, ref uint pinternal_field_count);
734+
public delegate IntPtr pesapi_get_ref_internal_fields_func(IntPtr value_ref, out uint pinternal_field_count);
735735

736736
#if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN || PUERTS_GENERAL || (UNITY_WSA && !UNITY_EDITOR)
737737
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]

unity/Assets/core/upm/Runtime/Src/PInvoke/JSType/JSObject.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ public T Get<T>(string key)
5454
lock(jsEnv)
5555
{
5656
#endif
57-
UnityEngine.Debug.Log("~JSObject~JSObject~JSObject");
5857
var envRef = NativeAPI.pesapi_get_ref_associated_env(apis, objRef);
5958
if (!NativeAPI.pesapi_env_ref_is_valid(apis, envRef))
6059
{

unity/Assets/core/upm/Runtime/Src/PInvoke/JsEnv.cs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -379,12 +379,17 @@ public void UsingFunc<T1, T2, T3, T4, TResult>()
379379
#endif
380380
}
381381

382+
public Action TickHandler;
383+
382384
public void Tick()
383385
{
384386
#if THREAD_SAFE
385387
lock(this) {
386388
#endif
387-
// TODO
389+
cleanupPendingKillScriptObjects();
390+
PuertsDLL.InspectorTick(isolate);
391+
PuertsDLL.LogicTick(isolate);
392+
if (TickHandler != null) TickHandler();
388393
#if THREAD_SAFE
389394
}
390395
#endif
@@ -447,11 +452,12 @@ public static void LogErrorCallback(string msg)
447452

448453
List<IntPtr> pendingKillScriptObjectRefs = new List<IntPtr>();
449454

450-
internal void addPendingKillScriptObjects(IntPtr envRef)
455+
internal void addPendingKillScriptObjects(IntPtr objRef)
451456
{
452457
lock (pendingKillScriptObjectRefs)
453458
{
454-
pendingKillScriptObjectRefs.Add(envRef);
459+
pendingKillScriptObjectRefs.Add(objRef);
460+
//UnityEngine.Debug.Log($"addPendingKillScriptObjects {objRef}");
455461
}
456462
}
457463

@@ -470,6 +476,26 @@ internal void cleanupPendingKillScriptObjects()
470476
var objRef = pendingKillScriptObjectRefs[lastIndex];
471477
pendingKillScriptObjectRefs.RemoveAt(lastIndex);
472478

479+
uint internal_field_count = 0;
480+
IntPtr weakHandlePtr = apis.get_ref_internal_fields(objRef, out internal_field_count);
481+
if (internal_field_count != 1)
482+
{
483+
throw new InvalidProgramException($"invalud internal fields count {internal_field_count}!");
484+
}
485+
486+
IntPtr weakHandle = Marshal.PtrToStructure<IntPtr>(weakHandlePtr);
487+
488+
if (weakHandle != IntPtr.Zero)
489+
{
490+
var handle = GCHandle.FromIntPtr(weakHandle);
491+
if (handle.Target == null)
492+
{
493+
var obj = apis.get_value_from_ref(env, objRef);
494+
apis.set_private(env, obj, IntPtr.Zero);
495+
//UnityEngine.Debug.Log($"cleanupPendingKillScriptObjects {objRef}");
496+
apis.release_value_ref(objRef);
497+
}
498+
}
473499
}
474500
}
475501
finally

0 commit comments

Comments
 (0)