// Use this for initialization void Start() { LuaEnv luaenv = new LuaEnv(); HotfixCalc calc = new HotfixCalc(); NoHotfixCalc ordinaryCalc = new NoHotfixCalc(); int CALL_TIME = 100 * 1000 * 1000; var start = DateTimeUtil.NowDateTime(); for (int i = 0; i < CALL_TIME; i++) { calc.Add(2, 1); } var d1 = (DateTimeUtil.NowDateTime() - start).TotalMilliseconds; Debug.Log("Hotfix using:" + d1); start = DateTimeUtil.NowDateTime(); for (int i = 0; i < CALL_TIME; i++) { ordinaryCalc.Add(2, 1); } var d2 = (DateTimeUtil.NowDateTime() - start).TotalMilliseconds; Debug.Log("No Hotfix using:" + d2); Debug.Log("drop:" + ((d1 - d2) / d1)); Debug.Log("Before Fix: 2 + 1 = " + calc.Add(2, 1)); Debug.Log("Before Fix: Vector3(2, 3, 4) + Vector3(1, 2, 3) = " + calc.Add(new Vector3(2, 3, 4), new Vector3(1, 2, 3))); luaenv.DoString(@" xlua.hotfix(CS.XLuaTest.HotfixCalc, 'Add', function(self, a, b) return a + b end) "); Debug.Log("After Fix: 2 + 1 = " + calc.Add(2, 1)); Debug.Log("After Fix: Vector3(2, 3, 4) + Vector3(1, 2, 3) = " + calc.Add(new Vector3(2, 3, 4), new Vector3(1, 2, 3))); double num; string str = "hehe"; int ret = calc.TestOut(100, out num, ref str); Debug.Log("ret = " + ret + ", num = " + num + ", str = " + str); luaenv.DoString(@" xlua.hotfix(CS.XLuaTest.HotfixCalc, 'TestOut', function(self, a, c, go) print('TestOut', self, a, c, go) if go then error('test error') end return a + 10, a + 20, 'right version' end) "); str = "hehe"; ret = calc.TestOut(100, out num, ref str); Debug.Log("ret = " + ret + ", num = " + num + ", str = " + str); luaenv.DoString(@" xlua.hotfix(CS.XLuaTest.HotfixCalc, { Test1 = function(self) print('Test1', self) return 1 end; Test2 = function(self, a, b) print('Test1', self, a, b) return a + 10, 1024, b end; Test3 = function(a) print(a) return 10 end; Test4 = function(a) print(a) end; Test5 = function(self, a, ...) print('Test4', self, a, ...) end }) "); int r1 = calc.Test1 <int>(); double r2 = calc.Test1 <double>(); Debug.Log("r1:" + r1 + ",r2:" + r2); string ss = "heihei"; int r3 = calc.Test2(r1, out r2, ref ss); Debug.Log("r1:" + r1 + ",r2:" + r2 + ",r3:" + r3 + ",ss:" + ss); r3 = HotfixCalc.Test3("test3"); r3 = HotfixCalc.Test3(2); r3 = HotfixCalc.Test3(this); Debug.Log("r3:" + r3); HotfixCalc.Test4(this); HotfixCalc.Test4(2); calc.Test5(10, "a", "b", "c"); calc.Test5(10, 1, 3, 5); Debug.Log("----------------------before------------------------"); TestStateful(); System.GC.Collect(); System.GC.WaitForPendingFinalizers(); luaenv.DoString(@" local util = require 'xlua.util' xlua.hotfix(CS.XLuaTest.StatefullTest, { ['.ctor'] = function(csobj) util.state(csobj, {evt = {}, start = 0, prop = 0}) end; set_AProp = function(self, v) print('set_AProp', v) self.prop = v end; get_AProp = function(self) return self.prop end; get_Item = function(self, k) print('get_Item', k) return 1024 end; set_Item = function(self, k, v) print('set_Item', k, v) end; add_AEvent = function(self, cb) print('add_AEvent', cb) table.insert(self.evt, cb) end; remove_AEvent = function(self, cb) print('remove_AEvent', cb) for i, v in ipairs(self.evt) do if v == cb then table.remove(self.evt, i) break end end end; Start = function(self) print('Start') for _, cb in ipairs(self.evt) do cb(self.start, 2) end self.start = self.start + 1 end; StaticFunc = function(a, b, c) print(a, b, c) end; GenericTest = function(self, a) print(self, a) end; Finalize = function(self) print('Finalize', self) end }) "); Debug.Log("----------------------after------------------------"); TestStateful(); luaenv.FullGc(); System.GC.Collect(); System.GC.WaitForPendingFinalizers(); var genericObj = new GenericClass <double>(1.1); genericObj.Func1(); Debug.Log(genericObj.Func2()); luaenv.DoString(@" xlua.hotfix(CS.XLuaTest.GenericClass(CS.System.Double), { ['.ctor'] = function(obj, a) print('GenericClass<double>', obj, a) end; Func1 = function(obj) print('GenericClass<double>.Func1', obj) end; Func2 = function(obj) print('GenericClass<double>.Func2', obj) return 1314 end }) "); genericObj = new GenericClass <double>(1.1); genericObj.Func1(); Debug.Log(genericObj.Func2()); InnerTypeTest itt = new InnerTypeTest(); itt.Foo(); luaenv.DoString(@" xlua.hotfix(CS.XLuaTest.InnerTypeTest, 'Bar', function(obj) print('lua Bar', obj) return {x = 10, y = 20} end) "); itt.Foo(); StructTest st = new StructTest(gameObject); Debug.Log("go=" + st.GetGo(123, "john")); luaenv.DoString(@" xlua.hotfix(CS.XLuaTest.StructTest, 'GetGo', function(self, a, b) print('GetGo', self, a, b) return nil end) "); Debug.Log("go=" + st.GetGo(123, "john")); GenericStruct <int> gs = new GenericStruct <int>(1); Debug.Log("gs.GetA()=" + gs.GetA(123)); luaenv.DoString(@" xlua.hotfix(CS.XLuaTest.GenericStruct(CS.System.Int32), 'GetA', function(self, a) print('GetA',self, a) return 789 end) "); Debug.Log("gs.GetA()=" + gs.GetA(123)); try { calc.TestOut(100, out num, ref str, gameObject); } catch (LuaException e) { Debug.Log("throw in lua an catch in c# ok, e.Message:" + e.Message); } BaseTestBase <InnerTypeTest> bt = new BaseTest(); bt.Foo(1); Debug.Log(bt); luaenv.DoString(@" xlua.hotfix(CS.XLuaTest.BaseTest, 'Foo', function(self, p) print('BaseTest', p) end) xlua.hotfix(CS.XLuaTest.BaseTest, 'ToString', function(self) return '>>>' .. base(self):ToString() end) "); bt.Foo(2); Debug.Log(bt); }
void Start() { LuaEnv luaenv = new LuaEnv(); HotfixCalc calc = new HotfixCalc(); NoHotfixCalc ordinaryCalc = new NoHotfixCalc(); #region 使用or不使用热更新性能对比 //int CALL_TIME = 100 * 1000 * 1000; //var start = System.DateTime.Now; //for (int i = 0; i < CALL_TIME; i++) //{ // calc.Add(2, 1); //} //var d1 = (System.DateTime.Now - start).TotalMilliseconds; //Debug.Log("Hotfix using:" + d1); //start = System.DateTime.Now; //for (int i = 0; i < CALL_TIME; i++) //{ // ordinaryCalc.Add(2, 1); //} //var d2 = (System.DateTime.Now - start).TotalMilliseconds; //Debug.Log("No Hotfix using:" + d2); //Debug.Log("drop:" + ((d1 - d2) / d1)); #endregion #region 热更修复HotfixCalc Add方法 支持重载 // Debug.Log("Before Fix: 2 + 1 = " + calc.Add(2, 1)); // Debug.Log("Before Fix: Vector3(2, 3, 4) + Vector3(1, 2, 3) = " + calc.Add(new Vector3(2, 3, 4), new Vector3(1, 2, 3))); // luaenv.DoString(@" // xlua.hotfix(CS.XLuaTest.HotfixCalc, 'Add', function(self, a, b) // return a + b // end) //"); // Debug.Log("After Fix: 2 + 1 = " + calc.Add(2, 1)); // Debug.Log("After Fix: Vector3(2, 3, 4) + Vector3(1, 2, 3) = " + calc.Add(new Vector3(2, 3, 4), new Vector3(1, 2, 3))); #endregion #region 热更修复HotfixCalc TestOut方法 函数返回值 ref out参数 double num; string str = "hehe"; // int ret = calc.TestOut(100, out num, ref str); // Debug.Log("ret = " + ret + ", num = " + num + ", str = " + str); // luaenv.DoString(@" // xlua.hotfix(CS.XLuaTest.HotfixCalc, 'TestOut', function(self, a, c, go) // print('TestOut', self, a, c, go) // if go then error('test error') end // return a + 10, a + 20, 'right version' // end) //"); // str = "hehe"; // ret = calc.TestOut(100, out num, ref str); // Debug.Log("ret = " + ret + ", num = " + num + ", str = " + str); #endregion #region 热更修复HotfixCalc table提供一组函数 多个函数一起修复 // luaenv.DoString(@" // xlua.hotfix(CS.XLuaTest.HotfixCalc, { // Test1 = function(self) // print('Test1', self) // return 1 // end; // Test2 = function(self, a, b) // print('Test2 a:', a ) // print('Test2 b:', b) // return a + 10, 1024, 'this is third args' // end; // Test3 = function(a) // print(a) // return 10 // end; // Test4 = function(a) // print(a) // end; // Test5 = function(self, a, ...) // print('Test4', self, a, ...) // end // }) //"); // int r1 = calc.Test1<int>(); // double r2 = calc.Test1<double>(); // Debug.Log("r1:" + r1 + ",r2:" + r2); // string ss = "heihei"; // r2 = 2; // int r3 = calc.Test2(r1,out r2, ref ss); // Debug.Log("r1:" + r1 + ",r2:" + r2 + ",r3:" + r3 + ",ss:" + ss); // r3 = HotfixCalc.Test3("test3"); // r3 = HotfixCalc.Test3(2); // r3 = HotfixCalc.Test3(this); // Debug.Log("r3:" + r3); // HotfixCalc.Test4(this); // HotfixCalc.Test4(2); // calc.Test5(10, "a", "b", "c");//不定参数 // calc.Test5(10, 1, 3, 5); #endregion #region 热更修复StatefullTest 【类全部重构】 构造函数、属性、索引器、事件、费静态方法、静态方法、泛型方法、析构函数 /* * Debug.Log("----------------------before------------------------"); * TestStateful(); * System.GC.Collect();//手动GC 强制垃圾回收 * System.GC.WaitForPendingFinalizers();//等待所有终结器完成后再继续 * luaenv.DoString(@" * local util = require 'xlua.util' * xlua.hotfix(CS.XLuaTest.StatefullTest, { * --构造函数 * ['.ctor'] = function(csobj) * util.state(csobj, {evt = {}, start = 0, prop = 0}) * end; * * --属性 * set_AProp = function(self, v) * print('set_AProp', v) * self.prop = v * end; * get_AProp = function(self) * return self.prop * end; * * --索引器 * get_Item = function(self, k) * print('get_Item', k) * return 1024 * end; * set_Item = function(self, k, v) * print('set_Item', k, v) * end; * * --event 事件 * add_AEvent = function(self, cb) * print('add_AEvent', cb) * table.insert(self.evt, cb) * end; * remove_AEvent = function(self, cb) * print('remove_AEvent', cb) * for i, v in ipairs(self.evt) do * if v == cb then * table.remove(self.evt, i) * break * end * end * end; * * --非静态方法 * Start = function(self) * print('Start') * for _, cb in ipairs(self.evt) do * cb(self.start, 2) * end * self.start = self.start + 1 * end; * * --静态方法 * StaticFunc = function(a, b, c) * print(a, b, c) * end; * * --泛型方法 * GenericTest = function(self, a) * print(self, a) * end; * * --析构函数 * Finalize = function(self) * print('Finalize', self) * end * }) * "); * Debug.Log("----------------------after------------------------"); * TestStateful(); * luaenv.FullGc();//lua GC、lua垃圾回收 * System.GC.Collect(); * System.GC.WaitForPendingFinalizers(); */ #endregion #region 热更修复 泛型类 var genericObj = new GenericClass <double>(1.1); // genericObj.Func1(); // Debug.Log(genericObj.Func2()); // luaenv.DoString(@" // xlua.hotfix(CS.XLuaTest.GenericClass(CS.System.Double), { // ['.ctor'] = function(obj, a) // print('GenericClass<double>', obj, a) // end; // Func1 = function(obj) // print('GenericClass<double>.Func1', obj) // end; // Func2 = function(obj) // print('GenericClass<double>.Func2', obj) // return 1314 // end // }) //"); // genericObj = new GenericClass<double>(1.1); // genericObj.Func1(); // Debug.Log(genericObj.Func2()); #endregion #region 热更修复 内置类型 结构体 // InnerTypeTest itt = new InnerTypeTest(); // itt.Foo(); // luaenv.DoString(@" // xlua.hotfix(CS.XLuaTest.InnerTypeTest, 'Bar', function(obj) // print('lua Bar', obj) // return {x = 10, y = 20} // end) //"); // itt.Foo(); #endregion #region 热更修复 结构体、泛型结构体 // StructTest st = new StructTest(gameObject); // Debug.Log("go=" + st.GetGo(123, "john")); // luaenv.DoString(@" // xlua.hotfix(CS.XLuaTest.StructTest, 'GetGo', function(self, a, b) // print('GetGo', self, a, b) // return nil // end) //"); // Debug.Log("go=" + st.GetGo(123, "john")); // GenericStruct<int> gs = new GenericStruct<int>(1); // Debug.Log("gs.GetA()=" + gs.GetA(123)); // luaenv.DoString(@" // xlua.hotfix(CS.XLuaTest.GenericStruct(CS.System.Int32), 'GetA', function(self, a) // print('GetA',self, a) // return 789 // end) //"); // Debug.Log("gs.GetA()=" + gs.GetA(123)); // try // { // calc.TestOut(100, out num, ref str, gameObject); // } // catch (LuaException e) // { // Debug.Log("throw in lua an catch in c# ok, e.Message:" + e.Message); // } #endregion #region 热更修复 基类 BaseTestBase <InnerTypeTest> bt = new BaseTest(); bt.Foo(1); Debug.Log(bt); luaenv.DoString(@" xlua.hotfix(CS.XLuaTest.BaseTest, 'Foo', function(self, p) print('BaseTest', p) end) xlua.hotfix(CS.XLuaTest.BaseTest, 'ToString', function(self) return '>>>' .. base(self):ToString() end) "); bt.Foo(2); Debug.Log(bt); #endregion }