话说这个《月之境》项目,之前一直就放在PC端跑着,想着先弄个能动的demo给朋友看看。结果上个月,我老婆随口说了一句:“你能不能搞个手机上也能玩的?” 听者有意,我这老骨头就动了起来,想着试试把这玩意儿弄到安卓上去。要我说,这年头,做东西不往手机上跑一跑,总感觉少点什么。
第一步:把工具链那堆破烂理清楚
我这人做事比较糙,以前搞PC项目,环境都是随手搭的,现在要转安卓,立马就遇到了拦路虎。我抓起以前的工程,发现用的是一个比较老版本的引擎。就是升级SDK和NDK,这东西简直是玄学,版本之间各种冲突。我对着官方文档,像个小学生一样,一步步检查路径,下载缺失的组件。折腾了两天,光是让IDE不报错,我就耗光了所有咖啡。中间有一次,因为环境变量没设对,光是下载依赖包就卡死了半天,我还以为是网速慢,后来才发现是配置问题。
最要命的是Gradle。我盯着那堆配置文件,一会儿说这个库找不到,一会儿说那个API被弃用了。我翻遍了国内外的论坛,复制粘贴了一堆解决方案,有时候运气好蒙对了,有时候直接编译失败。那感觉就像是玩俄罗斯方块,每次都差一块怎么也对不上。我把配置文件来回修改了不下二十次,才勉强骗过了编译器,让它吐出了一个AAB文件。这前前后后,光是让工程成功跑出第一个空白屏幕,我的发际线又往后挪了一厘米。
第二步:真机测试,发现它根本跑不动
能编译出来只是万里长征第一步。我把AAB文件导到我的老安卓机上,安装,运行——黑屏,然后闪退。我心想MMP,又来了。我赶紧插上数据线,打开Logcat,那屏幕上的报错信息跟瀑布一样往外喷,密密麻麻,看都看不清。这台老手机是我故意留着的,就为了测试低端机的性能,果然没让我失望,直接给我一个下马威。
- 我查了一下,发现是内存泄露,PC端无所谓,安卓机直接给你崩掉。我之前在PC上跑,内存随便用,现在到了手机上,那点资源简直是抠抠索索。
- 我改了一下资源加载策略,以前是随用随载,现在必须预加载一部分,不然打开一个场景就得等半天。
- 我发现贴图尺寸太大,安卓机根本吃不消,我又批量压缩了一遍。这一压缩,效果确实有点下降,但没办法,总得让人玩得动。
这个过程足足持续了一周。白天我坐着改代码,晚上我躺在床上琢磨怎么优化那些渲染管线。我的“月之境”里头光影效果比较多,在性能差的手机上直接卡成了幻灯片。我咬着牙,砍掉了一些不必要的后期处理,虽然效果差了一点,但至少能流畅运行了。为了这个流畅度,我牺牲了很多视觉上的东西,但总归是能玩了。最难受的是,我处理完了内存泄露,帧率上来了,结果发现触控输入又有延迟,我又钻进了输入系统里头,调整事件捕获的优先级。
第三步:发布前的冲刺——签名和适配
当性能勉强过关后,就到了最烦人的签名环节。我以前丢过keystore文件,所以这回格外小心。我创建了一个新的签名密钥,设置了一堆密码,然后反复确认备份。这个步骤虽然简单,但一旦出错,后面更新就彻底抓瞎了。我把所有图标和启动画面都适配了一遍,让它们在不同分辨率的手机上都能正常显示。安卓手机型号多如牛毛,我找遍了办公室能借到的所有不同牌子的手机,挨个测试,确保没有出现奇葩的UI错位。
我生成了最终的发布包,上传到了测试渠道。当我在自己手机上点开图标,看到“月之境”的启动画面稳定出现,并且游戏能流畅跑起来的时候,那种成就感,真叫一个踏实。这前前后后搞了差不多半个月,中间无数次想扔掉键盘。我老婆看我那几天天天对着电脑屏幕骂骂咧咧,还以为我股票跌了。
折腾安卓,最大的感受就是,兼容性真是个老问题。你花了大力气做出来一个东西,结果在隔壁同事的手机上又崩了。但没办法,你得去解决那些层出不穷的小麻烦。每次搞定一个平台,都感觉像是又爬上了一座山头,虽然累,但回头看看,还是挺带感的。