当所有人都在说手机编程不可能,当别人在电脑上用 VS 欻欻欻敲代码时,我用 MT 管理器敲屏幕编代码,用 C4Droid编译打包程序。做了自己的界面库,做了自己的游戏。这篇文章主要介绍了我是怎么单凭手机一步步走过来的,也想为跟我相似的人提供一些方法。
支持开源:所有代码已在 Github 开源,可在文章末尾链接查看。
一、为什么要用手机编程?
"何不食肉糜?"如果有电脑,我相信我绝对会用电脑的。
从小,我就知道家里并不富裕,甚至连给我交学费都要精打细算,肯定也是不会同意买电脑的。我唯一拥有的,就是一台手机,就连我写下这篇文章时用的还是 4 年前买的手机。
当时身边的人拿起手机就是吃鸡、王者、MC,玩的很嗨。不出意外,我当然也喜欢玩游戏。小学时是我疯狂的时候,甚至打吃鸡都打到王牌 14 星,几乎是拿到手机就要开一盘,玩手机都能玩饱------感觉不到饥饿感------的那种程度。
玩游戏玩多了,真的会累。上到初中,周末回到家打开手机,感觉已经厌倦游戏了。是因为累了吗?不,是因为感觉游戏已经玩到都没意思。整天在市场刷有什么好玩的新品,但没有一个可以吊起我的胃口的。从此刻开始,做一款我喜欢的游戏的想法,扎根在我的心中。
到了初一的暑假,我开始在 B 站上看黑马程序员的视频自学 C++。为什么是 C++? 我确实纠结过,但人们都说 C++ 是最难的语言,当时正处叛逆期的我反骨极了,就不信邪。于是我花了一周左右的时间在黑马程序员看完了大部分教程,找到了 C4Droid 编译器进行实操。感觉,也没想象中那么难嘛,小小指针,手下败将。
初二,经历了一年多的战斗,学了很多新知识,C++20 及之前的都或多或少有学习过,我感觉我的 C++ 水平直线上升。
由于初二时天天看着一个黑框框,还在黑框框上手搓了一个养花浇水的游戏,初三的我就想着进军图形化界面了!
二、为什么要新造"轮子"?
在手机上,我试过我能找到的图形库,SDL、SDL2、FLTK、allegro,Qt 等等,他们要不然是只提供基础图形、是老古董;要不然就是体积庞大,在手机上编写起来就是一件十分难受的事。
于是我依靠以类为特色的 SFML 自研 SFUI,主旨就是:手机端编程容易使用的轻量级 2D 界面库。
在从初三到高二的过程中,我一边用 SFUI 写程序,一边更新。亲身用过才知道,自己的库还有什么痛点,还有什么需要改进的,比如文本框自动换行,辅助对齐界面等等代码糖。别人没写,我想用的,那我就自己写出来!虽说它只是我小小一人所写之物,存在很多的不足,各个方面都不如已经完善的图形库,但是我不断修 Bug,不断优化和加新功能,现在的 SFUI 也已经能快速应付常规软件需求了,即使是在手机编程上。
我试过许多 IDE,包括 CIDE、Cxxdroid、C4Droid,它们各有优缺点。
- CIDE:界面美。但要会员且编译器所用 C++ 版本低,无法导出安装包;
- Cxxdroid:Clang 编译器快,有运行时崩溃溯源。但无法导出安装包;
- C4Droid:GCC 编译器,C++ 版本高,可以导出安装包。不稳定,经常无响应。
因此在多次艰难的抉择后,我决定 C4Droid 主要用做编译,Cxxdroid 主要用做崩溃调试。
三、我是怎么制作游戏的?
一步步地从最初的一个想法构筑起自己的游戏,真的是想到什么做什么。中途会碰到许多困难,一个个学习、突破,直到实现自己想要的效果才满意。在初中一周一放的周末,高中两周一放的周末,我一回到家就开始 coding,越码越有成就感。


1. 对抗 Against
我在手机上做 DuckCross 最开始应该跟初学者都一样吧?秉承着"能跑就行"的原则,每帧都把所有的场景和怪物逻辑遍历一遍,场景、敌人、交互一堆 for(auto& i: vector),怪物的消失和生成直接让 60FPS 抖动到 25FPS。
不只性能问题,还有"帧率相关运动"(帧率越高人物移动越快)、Segmentation Fault、莫名其妙的崩溃等等。这让我不再执着于能跑就行的原则,我开始着眼于优化我的程序。
2. 优化 Optimize3
经过我的摸索,
✓ 对于多次遍历,我想到可以做热点标记,遍历过一次标记好他的属性,下次要用时直接检查标记;
✓ 对于怪物的删除和生成,我想到可以做一个对象池,把怪物直接重置数据复用,不用再新建对象;
✓ 对于场景的加载,我想到可以区域加载,人物走到哪里就哪一块加载;
✓ 对于内存错误,我学会了 mutex 之后让程序更加安全,崩溃频率迅速下降。
我把整个工程的文件结构进行大调整,人物、场景、技能、控制分工明确,为编写带来了便利。当然,三年间所做的优化可远不只这些......这里不过多赘述。

当 200 个怪物同屏,FPS 仍高达 120FPS 的那一刻我才明白:在手机上,性能优化是游戏制作者的必经之路,反观某些游戏几乎没有优化,卡顿至极,难道不是违背了游戏制作的初衷------让玩家开心,让制作者也开心?
3. 装饰 Decorate
"人靠衣装马靠鞍",游戏能玩还不够,玩得舒服也很重要。虽然我美术不行,没法把界面做得那么精致,没法把人物做得那么细致。但每个人物和控件也是我一个个在手机上用dotpict画出来的像素画。在游戏中我也加入了音乐和音效,当然是我在网上找的,我可不会制作音乐。
然后有同学跟我说要存档功能,我在学习之后发现这个功能确实很重要,便开始学习使用 RapidJson,我选择它是因为我听说这是最快的 Json 库,这不是与性能优化不谋而合?不到一周,存档读档功能便顺利落地。
很多很多功能逐步落地:Boss 战、主动技能、分数结算、暂停面板......以及一系列的动画动效。
4. 打包 Release
每一次小版本做好后,我都会打包发给同学们试玩。自己的感觉是主观的,还要看看别人是怎么看的。但 C4Droid 自动打包后出来的 apk 内部一团糟,没有引用的库也会存在,霸占我的 apk 空间,让我看着很不爽,apk 体积可真不是越大越好。因此我又学会了徒手改 classes.dex 文件 smali 代码的能力,把 apk 体积压缩一点是一点。

四、我的理想?
如果未来可以,我会坚持 SFUI,坚持做游戏,6 月交卷后一周内补完 SFUI 的"5 分钟上手"教程。我相信我可以照亮跟我一样的人------真心热衷于编程的人。我们都是有创造力的人,想要创造属于自己的东西。我目前还是高三学生,高考是眼前绕不开的关卡,成绩也并不突出,已经没有多余时间维护和更新了。不知道大家看完我的经历会有什么感想,这就是 17 岁的我能想到的、最具体也最长远的计划。大家有没有尝试过手机编程呢?评论区留给你们:无论是吐槽、提问还是建议,如果有时间,我会看到的。
[1] SFUI 已在 Github 免费开源 点击查看
《没电脑=不能写代码?为什么我一个高中生能在手机上码 1万多行 C++,造了一个 GUI 库和一款肉鸽游戏?》 是转载文章,点击查看原文。
