最近公司新版本告一段落,空闲一点了,把做新版本过程中遇到的问题记录一下。
一、精灵过多,渲染卡顿
因为游戏需要单个不停的创建精灵,所以当精灵过多时,渲染会很卡。尝试过精灵缓存队列,然而效果并不好,因为从队列中取出精灵的模式与原有业务逻辑冲突,批量创建渲染也不行,所以采取了减少渲染数量的方法。后续再来修改业务逻辑。
二、数字标签与自定义字体
游戏中有很多可变的精灵,如果全部用ui切图的话,图片太多不现实,另一方面,如果服务端修改参数了,那游戏无法动态改变。所以采用精灵+数字标签或者自定义字体的方式。
1.AtlasLabel数字标签
首先用TexturePacker将ui给的数字小图合成一张图,这些小图宽高需要相等,然后代码中
cc.LabelAtlas:create("100", "nums_font.png", 14, 21, 48)
即可使用数字标签,第一个参数是要显示的值,第二个是合图路径,第三个是小图宽,第四个是小图高,第五个是合图中首个数字的ASCII码。
2.BitmapLabel自定义字体
自定义字体我是用BmFont这个工具制作的,官网在这。打开BmFont之后,首先Edit→Open Image Manger→Image。导入相关图片,注意图片不能被压缩,否则可能无法导入。
导入时这里有一个id,填对应的ASCII码,比如我这个图片是1,就可以填1的ASCII码49。每个数字的ascii码可以在bmfont中找到。导入所有图片,设定好对应的ASCII码之后,再点击Options→Export options 。可以设定padding,导出图片大小等等。如果是带颜色图片记得bit depth设置为32位。底部设置如下
导出图片后,代码中
cc.LabelBMFont:create(num,"文件路径")
即可使用自定义字体。
在我的实际使用过程中,数字标签与自定义字体生成的图片相对于ui原图来说会有模糊的情况,如果ui上要求不高可以忽略。
三、纹理图集
游戏里用到了很多散图,为了减少游戏包体积与内存占用,则可以使用TexturePacker进行合图。优点:
1.减少文件读取次数,读取一张图片比读取一堆小文件要快。
2.减少OpenGL ES绘制调用并且加速渲染。
3.减少内存消耗。
四、代码创建动画与cocostudio创建动画文件
新版本中加了很多动画效果,分别采用了代码创建动画与调用帧动画文件的方式来实现。
1.代码创建动画
可以参加官方文档中的动作系统,通过不同动作的组合来达到目的。
2.cocostudio 1.6创建动画文件,代码调用如下:
local armatureDataManager = ccs.ArmatureDataManager:getInstance()
armatureDataManager:addArmatureFileInfo(GameRes.string_tp_json)
self.tpArma = ccs.Armature:create(GameRes.string_tp_name)
self.tpArma:getAnimation():playWithIndex(0)
local function animationEvent(armatureBack, movementType, movementID)
self:goFly()
end
self.tpArma:getAnimation():setMovementEventCallFunc(animationEvent)
self.tpArma:setPosition(self.worldPosition.x,self.worldPosition.y)
self:addChild(self.tpArma)