意外收获
在制作模块化的过程中,发现了一个Unity模块和苹果MapKit的内存管理冲突的BUG,可以通过framework化来解决
表现
每当地图进行缩放操作,整个App就进入半卡死状态,通过Profile分析,CPU占用爆满超过半分钟,大量调用以下函数
1 | DynamicHeapAllocator...... |
原因
- Unity导出的iOS项目存在一个线程锁DynamicHeapAllocator
- 对某个OC的原生函数加了切面
- 地图在进行Context渲染时会同时并发大量线程
- 地图的渲染线程会被互相锁住,导致CPU爆炸
分析
如果Unity以Static Mach-O的形式加载进入项目,主体App的地图的某些函数做出切面拦截,主要是因为Unity的 C++ 代码符号和主体App在同一个Mach-O里
解决方案
Unity的显示部分以 Dynamic Framework的形式挂载到App上,做到和主工程的Mach-O分离
参考文章Mach-O的加载,可以防止MapKit的函数被 DynamicHeapAllocator 切面拦截到