优化前游戏在iPhone 4上从启动画面到渲染第一帧需要8秒左右,一直卡在启动画面不动。分析了一下代码,怀疑AppDelegate::didFinishLaunchWithOptions里做了太多事情。用Instruments分析一下,果然didFinishLaunchWithOptions用了5s,其中ScriptingCore::runScript用了2.5s,向JSContext注入binding用了0.5s,剩下各种SDK初始化用了2s。优化方案
1. 加速代码的执行速度
ScriptingCore::runScript
ScriptingCore::runScript主要在读取js代码、编译然后执行。这里有几个优化的方法:
1. 将JS代码编译成bytecode(jsc)再打到包里,这样加载时就不用再编译了。
2. 将JS代码用UglifyJS、JSMin等压缩工具压缩,并合并成一个JS文件,减少磁盘IO的大小和次数。
压缩打包JS会带来一些问题。压缩后错误信息会比较难看,因为symbol都被压成1个字母了。另一个更严重的问题是,我们有动态更新代码的需求,以前每次只需要更新改动的JS文件,打包成一个文件后每次都更新一整个文件。
并行化
Instruments的数据里可以看出有米广告的SDK居然用了1.3s载入,在5s上也需要200ms,干脆放到单独的线程里去做,这样不会block主线程(iPhone4还是单核的A4处理器,所以开多少线程都没有什么卵用,4s和iPad2之后用的至少是双核的A5,收效就很明显)。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
// 有米广告的初始化代码
[CocoBVideo cBVideoInitWithAppID:appID cBVideoAppIDSecret:secret];
[CocoBVideo cBCloseAlertViewWhenWantExit:false];
});
追问这是从哪拷贝过来的? 有靠谱的方案吗? 我现在已经是3s 了,想要优化到1.5s内