游戏性能优化备忘

排除GPU问题

只要:

1. 尽量不使用shader,或者只使用简单的shader

2. 不要画太多内容(三角形所占总像素面积)。

那么一般就不会是GPU导致的性能问题。

减少CPU占用

1. 尽量使用批量绘制。

2. 尽量减少draw call次数。

3. 尽量使用占内存更小的纹理。(RGBA4444+抖动)

4. 不在屏幕内的物体,应设置为不显示。

减少GPU占用

绘制大图的时候,把大图拆分成多个多边形,或者使用polygon sprite meshes,以减少透明区域,可降低GPU占用,但是相应的会提升CPU占用。

Cocos2dx项目Android Studio打包趟坑记录

问题描述:

游戏一直用Windows环境打包Android版本,临时需要用Mac打包,但是报错。

解决方法:

Mac下默认安装的是JDK 10,换成JDK 8即可。(也可能与Android Studio或者Gradle的版本有关系)

下载安装JDK 8并删除JKD 10。

小技巧:

Android Studio的报错信息不一定有用,直接在Android Studio的命令行(Terminal)下输入:./gradlew build 来编译,这样输出的错误信息更有参考价值。

Android Studio打包APK报错collect2.exe: error: ld returned 5 exit status的解决办法

因为cocos2dx 3.16版本,官方只支持到NDK(14),所以只能用这个版本。

但是用这个版本打包APK时会报这个错误:

collect2.exe: error: ld returned 5 exit status

解决方法:

下载最新版本NDK(17),将其中的ld.exe复制出来,覆盖NDK(14)中的对应文件。

在合并分支时如何跳过某次提交

比如我们在分支A上做了一次改动,但是我们不想让这个改动在将来执行合并时被合并到分支B上。具体做法如下:

  1. 在分支A上正常修改并提交。
  2. 切换到分支B。
  3. 执行 git merge -s ours branch_A
  4. 重新切换到分支A继续开发。

重点在第三步,加了 -s ours 参数的合并会忽略分支A的提交,但是仍然标记为已合并。

易于提交的App Store Preview视频格式

反正我是为了提交App Store的Preview视频操碎了心。

总之是这个链接拯救了我:

https://stackoverflow.com/questions/25820601/unable-to-load-app-preview-in-itunes-connect

这个方法使用了一个叫做HandBrake的视频格式转换软件。

除了链接中提到的之外,其实还有几点需要注意的。我把所有的都列一下好了:

  1. Format:MP4 File
  2. Framerate(FPS): 30, Constant Framerate
  3. Quality: Constant Quality, RF: 0. (其实RF这里可以,可以调整一下,是导出质量)
  4. 切换到Picutre页签。
  5. 注意Storage Size还有Display Size要与Source保持一致。如果不一致,则需要调整Anamorphic和Cropping选项。
  6. 切换到Audio页签。
  7. Samplerate设置为44.1。

这样基本上导出来的格式就比较稳了。

 

为游戏缩减TTF字体文件

找到几个方案,最终决定用FontPruner来实现。其它方案可参考下方的相关资料。

FontPruner的执行需要电脑支持Python和Jave的运行。

提前准备

1. 文本合并

首先,为了方便FontPruner的执行,我们要把所有的文本信息保存到一个txt文件中。

实现文本合并有很多方法,这里我采用了Notepad++以及它自带的插件Combine来实现。

步骤:

  1. 在Notepad++中打开所有要包含的文件。
  2. 为了以后使用方便,我们可以把当前打开的文件保存成一个Session(相当于工程文件)。
  3. 执行Combine插件,并保存为alltext.txt。

2. 运行准备

  1. 在FontPruner的目录下创建input目录,并将alltext.txt拷贝进来。
  2. 如果需要追加其它字符,可以在input目录下创建另外的txt,并将要追加的字符保存进去。
  3. 一定要注意txt的编码格式统一,否则转换会失败。
  4. 将字体文件拷贝到FontPruner目录下。
  5. 在FontPruner的目录下创建output目录。

开始导出

打开命令行执行如下命令:

如果没有报错,那就导出成功了。

但是不知道为什么,FontPruner会过滤掉空格和Tab符号。为了解决这一点需要以下操作:

打开output\intermediate\unChineseOutPut.txt文件,在开头手动加入一个空格和一个Tab符号。

然后执行:

这次的导出文件中就会包含空格了。

相关资料

https://github.com/GameBuildingBlocks/FontPruner

http://font-spider.org/

http://ecomfe.github.io/fontmin/

http://fontstore.baidu.com/static/editor/index.html

将Sprite绘制到RenderTexture指定位置的方法

有时候我们想要复制一个Sprite或者Node,不但复制其自身还要包含其子元件。最直接的办法就是使用RenderTexture,将Sprite及其子元件都绘制到RenderTexture上。但是Sprite在RenderTexture上的位置是不能直接指定的,我们又不想改变Sprite的位置。解决方法如下:

 

赛道初体验

昨天终于和JST(纯原厂)在潍坊荣和赛车场同时完成了赛道初体验,是参加一个车友所在企业举办的赛道活动。参加活动的车辆不算少,总共跑了4节,个人最佳成绩59.18秒,没有拿到名次。

考虑到咱是首次下赛道,对赛道、赛车都不熟悉,所以关于比赛经验啦,赛道跑法啦什么的咱就不在这里说什么了,说了也不见得对。就简单聊一下个人的感受,和JST的表现情况吧。

一辆车,尤其是一辆小钢炮的真面目,真的只有在赛道中才能体现。在体会了每一挡都断油,每一刹都到底,每个弯都响胎之后,才明白日常那所谓有些激进的驾驶,对JST来说也不过是闲庭信步而已。在赛道上,要发挥车辆的三个极限:加速极限,刹车极限,过弯极限。我就分别说说JST在这三个极限上的表现吧。

JST是性能车,但是在性能车里算是性能最弱的级别吧,但在赛道上正好适合像我这样的新手,不会因为动力太强而收不住。当天就有一辆法拉利458两度冲出赛道……在荣和赛道基本只能用到JST的2、3两挡。2挡提速很快,我常常先察觉到断油才反应过来要升挡。3挡加速过程相对慢一些,在最长的直道末端也不会断油。

JST的原厂刹车真的不错,在1600米的赛道上全力跑五六圈,一点都没有衰减的感觉,而且全天都没有拖后腿。刹车力度也很够,可以在直道加速的时候给我很大的信心。晚上回家后看了一眼,跑4节赛道,刹车片大概磨掉了三分之一左右,备用的刹车片看来暂时用不上了。

然后就是弯道了。在极限状态下JST的过弯感觉依然犀利,只要操控得当,它可以快速准确的执行车手的意图,绝不拖泥带水。平时觉得很硬的悬挂终于找到了用武之地,即使是180度的发夹弯也感受不到很大的侧倾。原厂轮胎在弯道中表现也很出色,会牢牢抓住地面帮你过弯。当然新手总会有失误的时候,有时候进弯速度太快还是会转向不足,只能进一步减速来修正过弯路线。比较有意思的是如果你进弯的速度合适,但是方向打的有点大的时候,JST会把尾巴甩出去。当天我自己体验过甩尾,在赛道上眼看着前车甩尾,在赛道下看别的车180度甩尾……总之是切身体验了众多车评人所说的“尾巴很活跃”的这个特点,这也是在赛道之外基本无法体验的。

关于JST弯道犀利还有一点值得说的,就是在荣和这种中低速赛道上,小弟JST几乎压制了大哥FST一头,全场最快成绩由JST取得,整体成绩也比FST要快一些。(FST的兄弟们不要骂我,直道上你们稳赢,嘿嘿。)

对于我个人来说,这也是一次难得的体验。我知道了下赛道是什么感觉,知道了要跑好赛道是多么难,要付出多大努力,知道了自己仍然是一个驾驶新手,知道了要顶着大太阳站一天的赛道日有多累。最重要的是,我对JST的了解又更深了一层,感觉就像是两个人终于互相敞开了心扉,真正坦诚相待了一样,虽然还没有十分融洽。

要说刺激,其实对于经常跑卡丁车的我来说,跑赛道和跑卡丁车相差无几。卡丁车赛场会把车准备好,你只需要专注驾驶,而且卡丁车的机械纯粹感,操控感,甚至是速度感,都要强于我这台JST。跑赛道,除了个人驾驶技术和对赛道的了解,还要对自己的车有更深刻的了解,即使是不改装,你也要时刻关注轮胎、胎压、刹车片、机油、刹车油、汽油等各种油液的状态等等。改装的话,那又是另一个世界了。

总之,赛道这个成就终于解锁了,体验也很难忘,即便是明白自己以后不会经常去赛道,因为成本真的不低。这只能说咱和赛道缘分比较淡,是吧?T_T