@1111922 写道:
写在前面:公司使用cocos2d-js 3.9开发游戏,一款横版过关arpg游戏,目前已经在app store上线(感兴趣可以app store搜艾泽拉斯战记)。发现游戏出现有规律卡顿,并确认原因出在GC上面,没有找到合适的方法解决,比较烦恼。遂做一些测试,对于lua与js的性能比较好奇,也想与大家交流一下,如果有测试不合理的地方还望提出。
环境:
mac mini + OS X Yosemite(10.10.5)+xcode(Version 7.2.1)
cocos2d-x 13.1.1 + Simulator Iphone6(IOS 9.2)测试代码(代码均在cocos2d_tests中稍加修改得来)
js:
var scene = new cc.Scene(); var array = {}; var count = 0; scene.update = function () { for (var i = 1; i < 100000; i++) { array[i+count*100000] = {value:[count]}; } count++; if (count > 51) { for (var i = 1; i < 100000; i++) { array[i+(count-50)*100000] = null; } } cc.log("count="+count); } scene.scheduleUpdate(); cc.director.runScene(scene);
lua:
local sceneGame = cc.Scene:create() local array = {} local count = 0; sceneGame.update = function () for i=1, 100000 do array[i+count*100000] = {["value"]={count}} end count = count+1 if count > 51 then for i=1, 100000 do array[i+(count-50)*100000] = nil; end end cclog("count=" .. count); end sceneGame:scheduleUpdateWithPriorityLua(sceneGame.update,0) cc.Director:getInstance():runWithScene(sceneGame)
分别运行一分钟。
帧数对比:
js 9fps
lua 2.5fps.
在这里 js的性能明显比lua要快。但是 如果不是这种赋值方式,而是简单的创建对象,lua比js要快,另外lua的加法和乘法也比js要快上许多。卡顿现象:
js在循环稳定后,会出现周期卡顿,应该是由GC引起。
lua在循环稳定后,没有出现周期卡顿,但是本身lua帧数较低,这里也没有弄明白是lua的垃圾回收性能较好,还是本身比较卡所以也看不出来。内存占用:
js在循环稳定后,在xcode中使用内存截图如下:
在时间增加的过程中,内存占用持续增高,会出现周期性回落,但是整体上是升高的。lua:
内存占用会稳定在1GB。但是会越来越卡。有一点我一直不是很明白,就是xcode里面的memory里面显示的究竟是什么内存。因为我跑js的测试代码时,最后内存会到3.xGB。望知道的告诉我一下,谢谢。
Instruments:
js:
lua:同样对于显示结果的解释不是很清楚的了解,直观上看js有内存泄漏。
以上是测试的现象,但是有些现象不能很好的解读,希望论坛内的大神能帮忙解读一下。
另外js游戏GC造成卡顿的现象,对于一个商业游戏应该是不能接受的。网上查到的方法有做对象池的,做缓存的(?),我自己想到的还有切换场景的时候手动调用gc函数进行gc。但是,在我们游戏的战斗过程中依然会产生让人不爽的卡顿(即使使用iphone7p)。这个问题只能是在代码编写中少新建对象,尽量重用已有对象来解决吗?感觉对编程的要求有些高,有时很难注意。
另外以上的结果是否证明使用lua还是比使用js要稳定一些?还是希望与大家进行讨论: )。
帖子: 1
参与者: 1