Skip to content

Commit 5a9bb75

Browse files
committed
低版本v8,ScriptObject或者Delegate引用的js对象不释放的问题,原因是v8::Persistent析构不会自动Reset,改为v8::Global可以解决问题
1 parent 6995da0 commit 5a9bb75

2 files changed

Lines changed: 61 additions & 2 deletions

File tree

‎unity/native/papi-v8/source/PesapiV8Impl.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct pesapi_env_ref__
3030
{
3131
}
3232

33-
v8::Persistent<v8::Context> context_persistent;
33+
v8::Global<v8::Context> context_persistent;
3434
v8::Isolate* const isolate;
3535
int ref_count;
3636
std::weak_ptr<int> env_life_cycle_tracker;
@@ -43,7 +43,7 @@ struct pesapi_value_ref__ : pesapi_env_ref__
4343
{
4444
}
4545

46-
v8::Persistent<v8::Value> value_persistent;
46+
v8::Global<v8::Value> value_persistent;
4747
uint32_t internal_field_count;
4848
void* internal_fields[0];
4949
};

‎unity/test/Src/Cases/Javascript/CrossLang/CrossLangTest.cs‎

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3114,5 +3114,64 @@ public void TestInOutStringRefParam()
31143114
");
31153115
}
31163116

3117+
3118+
public void CreateJsObjects()
3119+
{
3120+
var jsEnv = UnitTestEnv.GetEnv();
3121+
jsEnv.Eval("global.__weak_ref_arr = []");
3122+
3123+
for (int i = 0; i < 10; i++)
3124+
{
3125+
jsEnv.Eval<ScriptObject>(@"
3126+
var test_val_weak = new WeakRef({a:1});
3127+
global.__weak_ref_arr.push(test_val_weak)
3128+
test_val_weak.deref();");
3129+
}
3130+
}
3131+
3132+
[Test]
3133+
public void JsObjectCollectTest()
3134+
{
3135+
CreateJsObjects();
3136+
3137+
GC.Collect();
3138+
GC.WaitForPendingFinalizers();
3139+
3140+
var jsEnv = UnitTestEnv.GetEnv();
3141+
jsEnv.Tick();
3142+
jsEnv.Backend.LowMemoryNotification();
3143+
3144+
Assert.AreNotEqual(0, jsEnv.Eval<int>("global.__weak_ref_arr.filter(e => e.deref() === undefined).length"));
3145+
}
3146+
3147+
public void CreateDelegate()
3148+
{
3149+
var jsEnv = UnitTestEnv.GetEnv();
3150+
jsEnv.Eval("global.__weak_ref_arr = []");
3151+
3152+
for (int i = 0; i < 10; i++)
3153+
{
3154+
jsEnv.Eval<Action>(@"
3155+
var test_val_weak = new WeakRef(() => {});
3156+
global.__weak_ref_arr.push(test_val_weak)
3157+
test_val_weak.deref();");
3158+
}
3159+
}
3160+
3161+
[Test]
3162+
public void DelegateCollectTest()
3163+
{
3164+
CreateDelegate();
3165+
3166+
GC.Collect();
3167+
GC.WaitForPendingFinalizers();
3168+
3169+
var jsEnv = UnitTestEnv.GetEnv();
3170+
jsEnv.Tick();
3171+
jsEnv.Backend.LowMemoryNotification();
3172+
3173+
Assert.AreNotEqual(0, jsEnv.Eval<int>("global.__weak_ref_arr.filter(e => e.deref() === undefined).length"));
3174+
}
3175+
31173176
}
31183177
}

0 commit comments

Comments
 (0)