cocos2d-js 和 createjs 性能對比(HTML5)


cocos2d-js除了做native游戲外,還可以用來做HTML5游戲/動畫,那么它跟adobe的createjs框架比較會怎么樣呢?

(背景知識:createjs是adobe支持的HTML5框架,沿用了Flash的思想,實現了最基本的顯示列表和事件機制,是一個非常輕量的框架。createjs暫時只有canvas 2d版本,webgl版本還沒完成。)

 

實驗一:

wps_clip_image-663

1背景,上排5個小人播放SpriteSheet動畫(14幀位圖輪播),下排5個小人不斷做旋轉和縮放。其中小人是帶透明的png,尺寸為85*121px。

 

在PC的chrome運行,cocos2d-js和createjs都能滿幀60fps,輕松搞掂無壓力。

wps_clip_image-30676

 

cocos2d-js:

        for (var i = 0; i < 5; i++) {

            var man = new cc.Sprite("res/grossini.png");

            man.runAction(cc.spawn(cc.rotateBy(1, 360, 360), cc.sequence(cc.scaleTo(1, 2), cc.scaleTo(1, 1))).repeatForever());

            this.addChild(man, 2);

            man.x = size.width/6*(i+1);

            man.y = size.height/5;

        }

        for (var j = 0; j < 5; j++) {

            var man = new cc.Sprite();

            var animation = new cc.Animation();

            for (var i = 1; i <= 14; i++) {

                animation.addSpriteFrameWithFile("res/grossini_dance_" + (i < 10 ? ("0" + i) : i) + ".png");

            }

            animation.setDelayPerUnit(1 / 7);

            man.runAction(cc.animate(animation).repeatForever());

            man.x = size.width/6*(j+1);

            man.y = size.height / 3 * 2;

            this.addChild(man, 3);

        }

 

createjs:

            for (var i = 0; i < 5; i++) {

                var man = new createjs.Bitmap("../res/grossini.png");

                man.regX = 42;

                man.regY = 60;

                man.x = canvas.width/6*(i+1);

                man.y = canvas.height/5*4;

                man.scaleX = man.scaleY = 1;

                stage.addChild(man);

                createjs.Tween.get(man, {loop: true}, true)

                        .to({rotation: 360, scaleX:2, scaleY:2}, 1000).to({rotation: 360, scaleX:1, scaleY:1}, 1000);

            }

            var images = [];

            for (var i = 1; i <= 14; i++) {

                images.push("../res/grossini_dance_" + (i<10?("0"+i):i) + ".png");

            }

            for (var j = 0; j < 5; j++) {

                var sheet = new createjs.SpriteSheet({

                    images: images,

                    frames: {width: 85, height: 121, regX: 42, regY: 60}

                }); //需要設置每幀的寬高,注冊點信息

                var man = new createjs.Sprite(sheet);

                man.framerate = 60/7;

                man.x = canvas.width/6*(j+1);

                man.y = canvas.height / 3;

                man.play();

                stage.addChild(man);

            }

 

 

 

由於播放幀動畫都需要不斷的替換貼圖,是否使用GPU加速差別不大,所以接下來只使用旋轉放縮來測試兩個框架的效率區別。

 

實驗二:

基於實驗一,改為使用2個圖,每個圖新建2000個實例放到舞台上,分別做旋轉放縮的緩動變化。實驗二繼續在PC的chrome中運行。

 

cocos2d-js:使用webGL,幀頻不斷變化,最高有55fps,最低只有29fps。

wps_clip_image-16316

如果讓cocos2d-js強制在canvas 2d模式下渲染,幀頻只有26fps左右。

 

createjs:使用canvas 2d渲染,保持在28fps。

 

在這個實驗中,兩者差異的原因主要是cocos2d-js使用了webgl渲染,可以讓部分矩陣計算放到GPU,而createjs使用純canvas 2d渲染,只能依賴CPU計算矩陣變換,導致每幀的計算超過了重繪時間間隔,導致了幀頻降低。

接着,我們再做一個手機canvas的實驗,測試機是小米1 Android 2.3,可謂是低端情況的canvas 2d,代表了一大批山寨機水平吧。

 

實驗三:

判斷當前幀頻,如果幀頻大於30,則添加20個運動的小人到舞台上,直到幀頻低於30才停止。

 

cocos2d-js在UC瀏覽器上運行,勉強支撐40個小人,幀頻13到23fps之間波動。

wps_clip_image-16220

createjs情況就沒有在PC chrome那么風光了,運行20個小人就已經卡得掉牙了,只有10到15fps。

wps_clip_image-4070

通過這個實驗可以發現,手機的canvas性能真心不行,包括UC瀏覽器和微信內嵌的瀏覽器。這可能是手機CPU性能帶來的主要瓶頸吧,所以在手機上只能多依賴GPU,要么發布為native,要么只給iOS 8(帶webgl)的高帥富使用。

有興趣的朋友,可以拿起手機掃一下,看看你的手機測試情況如何,跟個貼。

cocos2d-js:

wps_clip_image-28596

createjs:

wps_clip_image-23801

 

小結:

總體來說,由於cocos2d-js可以在webgl上渲染,所以性能會比createjs要好。單純比較在canvas 2d上的渲染來說,createjs和cocos2d-js不相伯仲,沒太大區別,尤其在手機(Android)上基本都是廢物,手機的canvas2d游戲/動畫只能盡量避免全屏重繪,減少每幀的變化。

再考慮框架的附加能力方面,cocos2d-js框架提供的UI編輯器、粒子系統、骨骼動畫、瓦片地圖等等,都是createjs這個輕量級選手不具備的,createjs只能從零開始,一切都得靠開發者自行實現。因此,cocos2d-js更適合做中大型游戲(大型指的是游戲畫面復雜程度,而不是渲染要求高),而createjs更適合做小游戲,例如神經貓級別。

 

本文的代碼可以在github.com/kenkozheng/cocos/cocos_vs_createjs中找到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM