axmol/samples/TestJavascript/Resources/js/PerformanceTest/PerformanceSpriteTest.js

577 lines
19 KiB
JavaScript

/****************************************************************************
Copyright (c) 2010-2012 cocos2d-x.org
Copyright (c) 2008-2010 Ricardo Quesada
Copyright (c) 2011 Zynga Inc.
http://www.cocos2d-x.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
var MAX_SPRITES = 1000;
var SPRITES_INCREASE = 50;
var TAG_INFO_LAYER = 1;
var TAG_MAIN_LAYER = 2;
var TAG_SPRITE_MENU_LAYER = (MAX_SPRITES + 1000);
var s_nSpriteCurCase = 0;
////////////////////////////////////////////////////////
//
// SubTest
//
////////////////////////////////////////////////////////
var SubTest = cc.Class.extend({
_subtestNumber:null,
_batchNode:null,
_parent:null,
removeByTag:function (tag) {
switch (this._subtestNumber) {
case 1:
case 4:
case 7:
this._parent.removeChildByTag(tag + 100, true);
break;
case 2:
case 3:
case 5:
case 6:
case 8:
case 9:
this._batchNode.removeChildAtIndex(tag, true);
break;
default:
break;
}
},
createSpriteWithTag:function (tag) {
// create
cc.Texture2D.setDefaultAlphaPixelFormat(cc.TEXTURE_PIXELFORMAT_RGBA8888);
var sprite = null;
switch (this._subtestNumber) {
case 1:
{
sprite = cc.Sprite.create("Images/grossinis_sister1.png");
this._parent.addChild(sprite, 0, tag + 100);
break;
}
case 2:
case 3:
{
sprite = cc.Sprite.createWithTexture(this._batchNode.getTexture(), cc.rect(0, 0, 52, 139));
this._batchNode.addChild(sprite, 0, tag + 100);
break;
}
case 4:
{
var idx = parseInt(cc.RANDOM_0_1() * 14) + 1;
idx = idx < 10 ? "0" + idx : idx.toString();
var str = "Images/grossini_dance_" + idx + ".png";
sprite = cc.Sprite.create(str);
this._parent.addChild(sprite, 0, tag + 100);
break;
}
case 5:
case 6:
{
var idx = 0 | (cc.RANDOM_0_1() * 14);
var x = (idx % 5) * 85;
var y = (0 | (idx / 5)) * 121;
sprite = cc.Sprite.createWithTexture(this._batchNode.getTexture(), cc.rect(x, y, 85, 121));
this._batchNode.addChild(sprite, 0, tag + 100);
break;
}
case 7:
{
var y, x;
var r = 0 | (cc.RANDOM_0_1() * 64);
y = parseInt(r / 8);
x = parseInt(r % 8);
var str = "Images/sprites_test/sprite-" + x + "-" + y + ".png";
sprite = cc.Sprite.create(str);
this._parent.addChild(sprite, 0, tag + 100);
break;
}
case 8:
case 9:
{
var y, x;
var r = 0 | (cc.RANDOM_0_1() * 64);
y = (0 | (r / 8)) * 32;
x = (r % 8) * 32;
sprite = cc.Sprite.createWithTexture(this._batchNode.getTexture(), cc.rect(x, y, 32, 32));
this._batchNode.addChild(sprite, 0, tag + 100);
break;
}
default:
break;
}
cc.Texture2D.setDefaultAlphaPixelFormat(cc.TEXTURE_PIXELFORMAT_DEFAULT);
return sprite;
},
initWithSubTest:function (subTest, p) {
this._subtestNumber = subTest;
this._parent = p;
this._batchNode = null;
/*
* Tests:
* 1: 1 (32-bit) PNG sprite of 52 x 139
* 2: 1 (32-bit) PNG Batch Node using 1 sprite of 52 x 139
* 3: 1 (16-bit) PNG Batch Node using 1 sprite of 52 x 139
* 4: 1 (4-bit) PVRTC Batch Node using 1 sprite of 52 x 139
* 5: 14 (32-bit) PNG sprites of 85 x 121 each
* 6: 14 (32-bit) PNG Batch Node of 85 x 121 each
* 7: 14 (16-bit) PNG Batch Node of 85 x 121 each
* 8: 14 (4-bit) PVRTC Batch Node of 85 x 121 each
* 9: 64 (32-bit) sprites of 32 x 32 each
*10: 64 (32-bit) PNG Batch Node of 32 x 32 each
*11: 64 (16-bit) PNG Batch Node of 32 x 32 each
*12: 64 (4-bit) PVRTC Batch Node of 32 x 32 each
*/
// purge textures
log("initWithSubTest 01");
var mgr = cc.TextureCache.getInstance();
log("initWithSubTest 02");
// [mgr removeAllTextures];
mgr.removeTexture(mgr.addImage("Images/grossinis_sister1.png"));
mgr.removeTexture(mgr.addImage("Images/grossini_dance_atlas.png"));
mgr.removeTexture(mgr.addImage("Images/spritesheet1.png"));
log("initWithSubTest 03");
switch (this._subtestNumber) {
case 1:
case 4:
case 7:
break;
///
case 2:
cc.Texture2D.setDefaultAlphaPixelFormat(cc.TEXTURE_PIXELFORMAT_RGBA8888);
this._batchNode = cc.SpriteBatchNode.create("Images/grossinis_sister1.png", 100);
p.addChild(this._batchNode, 0);
break;
case 3:
cc.Texture2D.setDefaultAlphaPixelFormat(cc.TEXTURE_PIXELFORMAT_RGBA4444);
this._batchNode = cc.SpriteBatchNode.create("Images/grossinis_sister1.png", 100);
p.addChild(this._batchNode, 0);
break;
///
case 5:
cc.Texture2D.setDefaultAlphaPixelFormat(cc.TEXTURE_PIXELFORMAT_RGBA8888);
this._batchNode = cc.SpriteBatchNode.create("Images/grossini_dance_atlas.png", 100);
p.addChild(this._batchNode, 0);
break;
case 6:
cc.Texture2D.setDefaultAlphaPixelFormat(cc.TEXTURE_PIXELFORMAT_RGBA4444);
this._batchNode = cc.SpriteBatchNode.create("Images/grossini_dance_atlas.png", 100);
p.addChild(this._batchNode, 0);
break;
///
case 8:
cc.Texture2D.setDefaultAlphaPixelFormat(cc.TEXTURE_PIXELFORMAT_RGBA8888);
this._batchNode = cc.SpriteBatchNode.create("Images/spritesheet1.png", 100);
p.addChild(this._batchNode, 0);
break;
case 9:
cc.Texture2D.setDefaultAlphaPixelFormat(cc.TEXTURE_PIXELFORMAT_RGBA4444);
this._batchNode = cc.SpriteBatchNode.create("Images/spritesheet1.png", 100);
p.addChild(this._batchNode, 0);
break;
default:
break;
}
log("initWithSubTest 04");
cc.Texture2D.setDefaultAlphaPixelFormat(cc.TEXTURE_PIXELFORMAT_DEFAULT);
log("initWithSubTest 05");
}
});
////////////////////////////////////////////////////////
//
// SpriteMenuLayer
//
////////////////////////////////////////////////////////
var SpriteMenuLayer = PerformBasicLayer.extend({
_maxCases:7,
showCurrentTest:function () {
var scene = null;
var preScene = this.getParent();
var subTest = preScene.getSubTestNum();
var nodes = preScene.getNodesNum();
switch (this._curCase) {
case 0:
scene = new SpritePerformTest1();
break;
case 1:
scene = new SpritePerformTest2();
break;
case 2:
scene = new SpritePerformTest3();
break;
case 3:
scene = new SpritePerformTest4();
break;
case 4:
scene = new SpritePerformTest5();
break;
case 5:
scene = new SpritePerformTest6();
break;
case 6:
scene = new SpritePerformTest7();
break;
}
s_nSpriteCurCase = this._curCase;
if (scene) {
scene.initWithSubTest(subTest, nodes);
cc.Director.getInstance().replaceScene(scene);
}
}
});
////////////////////////////////////////////////////////
//
// SpriteMainScene
//
////////////////////////////////////////////////////////
var SpriteMainScene = cc.Scene.extend({
_lastRenderedCount:null,
_quantityNodes:null,
_subTest:null,
_subtestNumber:1,
ctor:function () {
var parent = new cc.Scene();
__associateObjWithNative(this, parent);
this.init();
},
title:function () {
return "No title";
},
initWithSubTest:function (asubtest, nodes) {
this._subtestNumber = asubtest;
this._subTest = new SubTest();
this._subTest.initWithSubTest(asubtest, this);
var s = cc.Director.getInstance().getWinSize();
this._lastRenderedCount = 0;
this._quantityNodes = 0;
// add title label
var label = cc.LabelTTF.create(this.title(), "Arial", 40);
this.addChild(label, 1);
label.setPosition(cc.p(s.width / 2, s.height - 32));
label.setColor(cc.c3b(255, 255, 40));
cc.MenuItemFont.setFontSize(65);
var decrease = cc.MenuItemFont.create(" - ", this, this.onDecrease);
decrease.setColor(cc.c3b(0, 200, 20));
var increase = cc.MenuItemFont.create(" + ", this, this.onIncrease);
increase.setColor(cc.c3b(0, 200, 20));
var menu = cc.Menu.create(decrease, increase);
menu.alignItemsHorizontally();
menu.setPosition(cc.p(s.width / 2, s.height - 65));
this.addChild(menu, 1);
var infoLabel = cc.LabelTTF.create("0 nodes", "Marker Felt", 30);
infoLabel.setColor(cc.c3b(0, 200, 20));
infoLabel.setPosition(cc.p(s.width / 2, s.height - 90));
this.addChild(infoLabel, 1, TAG_INFO_LAYER);
// add menu
var menu = new SpriteMenuLayer(true, 7, s_nSpriteCurCase);
this.addChild(menu, 1, TAG_SPRITE_MENU_LAYER);
// Sub Tests
cc.MenuItemFont.setFontSize(32);
var subMenu = cc.Menu.create();
for (var i = 1; i <= 9; ++i) {
var text = i.toString();
var itemFont = cc.MenuItemFont.create(text, this, this.testNCallback);
itemFont.setTag(i);
subMenu.addChild(itemFont, 10);
if (i <= 3)
itemFont.setColor(cc.c3b(200, 20, 20));
else if (i <= 6)
itemFont.setColor(cc.c3b(0, 200, 20));
else
itemFont.setColor(cc.c3b(0, 20, 200));
}
subMenu.alignItemsHorizontally();
subMenu.setPosition(cc.p(s.width / 2, 80));
this.addChild(subMenu, 2);
while (this._quantityNodes < nodes) {
this.onIncrease(this);
}
},
updateNodes:function () {
if (this._quantityNodes != this._lastRenderedCount) {
var infoLabel = this.getChildByTag(TAG_INFO_LAYER);
var str = this._quantityNodes + " nodes";
infoLabel.setString(str);
this._lastRenderedCount = this._quantityNodes;
}
},
testNCallback:function (sender) {
this._subtestNumber = sender.getTag();
var menu = this.getChildByTag(TAG_SPRITE_MENU_LAYER);
menu.restartCallback(sender);
},
onIncrease:function (sender) {
if (this._quantityNodes >= MAX_SPRITES)
return;
for (var i = 0; i < SPRITES_INCREASE; i++) {
var sprite = this._subTest.createSpriteWithTag(this._quantityNodes);
this.doTest(sprite);
this._quantityNodes++;
}
this.updateNodes();
},
onDecrease:function (sender) {
if (this._quantityNodes <= 0)
return;
for (var i = 0; i < SPRITES_INCREASE; i++) {
this._quantityNodes--;
this._subTest.removeByTag(this._quantityNodes);
}
this.updateNodes();
},
doTest:function (sprite) {
},
getSubTestNum:function () {
return this._subtestNumber
},
getNodesNum:function () {
return this._quantityNodes
}
});
////////////////////////////////////////////////////////
//
// For test functions
//
////////////////////////////////////////////////////////
function performanceActions(sprite) {
var size = cc.Director.getInstance().getWinSize();
sprite.setPosition(cc.p(parseInt(Math.random() * size.width), parseInt(Math.random() * size.height)));
var period = 0.5 + (Math.random() * 1000) / 500.0;
var rot = cc.RotateBy.create(period, 360.0 * cc.RANDOM_0_1());
var rot_back = rot.reverse();
var permanentRotation = cc.RepeatForever.create(cc.Sequence.create(rot, rot_back));
sprite.runAction(permanentRotation);
var growDuration = 0.5 + (Math.random() * 1000) / 500.0;
var grow = cc.ScaleBy.create(growDuration, 0.5, 0.5);
var permanentScaleLoop = cc.RepeatForever.create(cc.Sequence.create(grow, grow.reverse()));
sprite.runAction(permanentScaleLoop);
}
function performanceActions20(sprite) {
var size = cc.Director.getInstance().getWinSize();
if (cc.RANDOM_0_1() < 0.2)
sprite.setPosition(cc.p(parseInt(Math.random() * size.width), parseInt(Math.random() * size.height)));
else
sprite.setPosition(cc.p(-1000, -1000));
var period = 0.5 + (Math.random() * 1000) / 500.0;
var rot = cc.RotateBy.create(period, 360.0 * cc.RANDOM_0_1());
var rot_back = rot.reverse();
var permanentRotation = cc.RepeatForever.create(cc.Sequence.create(rot, rot_back));
sprite.runAction(permanentRotation);
var growDuration = 0.5 + (Math.random() * 1000) / 500.0;
var grow = cc.ScaleBy.create(growDuration, 0.5, 0.5);
var permanentScaleLoop = cc.RepeatForever.create(cc.Sequence.create(grow, grow.reverse()));
sprite.runAction(permanentScaleLoop);
}
function performanceRotationScale(sprite) {
var size = cc.Director.getInstance().getWinSize();
sprite.setPosition(cc.p(parseInt(Math.random() * size.width), parseInt(Math.random() * size.height)));
sprite.setRotation(cc.RANDOM_0_1() * 360);
sprite.setScale(cc.RANDOM_0_1() * 2);
}
function performancePosition(sprite) {
var size = cc.Director.getInstance().getWinSize();
log("performancePosition 01");
sprite.setPosition(cc.p(parseInt(Math.random() * size.width), parseInt(Math.random() * size.height)));
log("performancePosition 02");
}
function performanceout20(sprite) {
var size = cc.Director.getInstance().getWinSize();
if (cc.RANDOM_0_1() < 0.2)
sprite.setPosition(cc.p(parseInt(Math.random() * size.width), parseInt(Math.random() * size.height)));
else
sprite.setPosition(cc.p(-1000, -1000));
}
function performanceOut100(sprite) {
sprite.setPosition(cc.p(-1000, -1000));
}
function performanceScale(sprite) {
var size = cc.Director.getInstance().getWinSize();
sprite.setPosition(cc.p(parseInt(Math.random() * size.width), parseInt(Math.random() * size.height)));
sprite.setScale(cc.RANDOM_0_1() * 100 / 50);
}
////////////////////////////////////////////////////////
//
// SpritePerformTest1
//
////////////////////////////////////////////////////////
var SpritePerformTest1 = SpriteMainScene.extend({
doTest:function (sprite) {
performancePosition(sprite);
},
title:function () {
return "A (" + this._subtestNumber + ") position";
}
});
////////////////////////////////////////////////////////
//
// SpritePerformTest2
//
////////////////////////////////////////////////////////
var SpritePerformTest2 = SpriteMainScene.extend({
doTest:function (sprite) {
performanceScale(sprite);
},
title:function () {
return "B (" + this._subtestNumber + ") scale";
}
});
////////////////////////////////////////////////////////
//
// SpritePerformTest3
//
////////////////////////////////////////////////////////
var SpritePerformTest3 = SpriteMainScene.extend({
doTest:function (sprite) {
performanceRotationScale(sprite);
},
title:function () {
return "C (" + this._subtestNumber + ") scale + rot";
}
});
////////////////////////////////////////////////////////
//
// SpritePerformTest4
//
////////////////////////////////////////////////////////
var SpritePerformTest4 = SpriteMainScene.extend({
doTest:function (sprite) {
performanceOut100(sprite);
},
title:function () {
return "D (" + this._subtestNumber + ") 100% out";
}
});
////////////////////////////////////////////////////////
//
// SpritePerformTest5
//
////////////////////////////////////////////////////////
var SpritePerformTest5 = SpriteMainScene.extend({
doTest:function (sprite) {
performanceout20(sprite);
},
title:function () {
return "E (" + this._subtestNumber + ") 80% out";
}
});
////////////////////////////////////////////////////////
//
// SpritePerformTest6
//
////////////////////////////////////////////////////////
var SpritePerformTest6 = SpriteMainScene.extend({
doTest:function (sprite) {
performanceActions(sprite);
},
title:function () {
return "F (" + this._subtestNumber + ") actions";
}
});
////////////////////////////////////////////////////////
//
// SpritePerformTest7
//
////////////////////////////////////////////////////////
var SpritePerformTest7 = SpriteMainScene.extend({
doTest:function (sprite) {
performanceActions20(sprite);
},
title:function () {
return "G (" + this._subtestNumber + ") actions 80% out";
}
});
function runSpriteTest() {
log("runSpriteTest 01");
var scene = new SpritePerformTest1;
log("runSpriteTest 02");
scene.initWithSubTest(1, 50);
log("runSpriteTest 03");
cc.Director.getInstance().replaceScene(scene);
log("runSpriteTest 04");
}