加入收藏 | 设为首页 | 会员中心 | 我要投稿 孝感站长网 (https://www.0712zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

腾讯正式开源面向 Unity 项目的 Bug 修复神器 InjectFix

发布时间:2019-09-13 04:20:43 所属栏目:优化 来源:局长
导读:InjectFix是腾讯最新对外开源的Unity代码逻辑热修复方案,可实现在Unity线上客户端内,不用迭代新版本,就能快速修复游戏的线上bug。 先说几个亮点: 直接在Unity工程上修改C#即可更新;老项目无需修改原有代码即可使用; 更符合苹果热更新条款; 每个游戏

argumentBase指向的是求值栈该函数的栈帧,栈帧是这么安排的:

腾讯正式开源面向 Unity 项目的 Bug 修复神器 InjectFix

先放参数(如果有的话),再放本地变量(如果有的话),接着是临时区域,当函数返回时弹掉所有东西,如果有返回值就放到栈顶(函数执行前参数0的位置)。

用如下一个静态方法来演示下虚拟机怎么运行:

  1. public static float Add(float a, float b) 
  2.     return a - b; 

这函数编译后是这四条指令

腾讯正式开源面向 Unity 项目的 Bug 修复神器 InjectFix

Add函数的执行过程

  1. 指令1把参数0 Push到栈顶;
  2. 指令2把参数1 Push到栈顶;
  3. 指令3把两个栈顶元素弹出(Pop)并相加,结果Push到栈顶;
  4. 指令4把栈顶拷贝到参数0的位置,清理栈,退出循环,Execute函数执行结束。

代码注入

上面的Add函数注入后是这样的

  1. public static float Add(float a, float b) 
  2.     if (WrappersManagerImpl.IsPatched(92)) 
  3.     { 
  4.         return WrappersManagerImpl.GetPatch(92).__Gen_Wrap_25(a, b); 
  5.     } 
  6.     return a - b; 

比较简单,发现这函数有patch的话,就重定向到虚拟机。

而__Gen_Wrap_25是个适配器函数,赋值把参数压栈,调用虚拟机的Execute函数,并把结果返回。__Gen_Wrap_25的实现如下:

  1. public float __Gen_Wrap_25(float P0, float P1) 
  2.     Call call = Call.Begin(); 
  3.     call.PushSingle(P0); 
  4.     call.PushSingle(P1); 
  5.     this.virtualMachine.Execute(this.methodId, ref call, 2, 0); 
  6.     return call.GetSingle(0); 

PS:我们的例子仅有三种指令,和这几条指令无关的代码全部简化了,真正复杂得多,有兴趣可以看源码了解。

总结

InjectFix使用简单,小巧,合规且安全。即使你不打算用它来更新线上版本,只要你程序有原生部分,接入也能一定程度上提高开发效率,没什么拒绝它的理由,是吧?

(编辑:孝感站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读