2014-01-15 09:22:45 +08:00
/****************************************************************************
Copyright ( c ) 2008 - 2010 Ricardo Quesada
Copyright ( c ) 2010 - 2012 cocos2d - x . org
Copyright ( c ) 2011 Zynga Inc .
Copyright ( c ) 2013 - 2014 Chukong Technologies 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 .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2012-04-19 14:35:52 +08:00
# include "PerformanceSpriteTest.h"
2011-03-25 13:59:08 +08:00
enum {
2012-06-12 16:56:34 +08:00
kMaxNodes = 50000 ,
kNodesIncrease = 250 ,
2011-03-25 13:59:08 +08:00
TEST_COUNT = 7 ,
} ;
enum {
kTagInfoLayer = 1 ,
kTagMainLayer = 2 ,
2013-09-30 16:22:55 +08:00
kTagAutoTestMenu = 3 ,
2011-04-21 14:46:15 +08:00
kTagMenuLayer = ( kMaxNodes + 1000 ) ,
2011-03-25 13:59:08 +08:00
} ;
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// SubTest
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2011-04-07 14:30:35 +08:00
SubTest : : ~ SubTest ( )
{
2014-01-17 05:07:56 +08:00
_parentNode - > release ( ) ;
2011-04-07 14:30:35 +08:00
}
2014-01-15 09:22:45 +08:00
void SubTest : : initWithSubTest ( int subtest , Node * p )
2011-03-25 13:59:08 +08:00
{
2014-01-15 09:22:45 +08:00
srand ( 0 ) ;
subtestNumber = subtest ;
2014-01-17 05:07:56 +08:00
_parentNode = nullptr ;
2011-03-25 13:59:08 +08:00
/*
2014-01-15 09:22:45 +08:00
* Tests :
* 1 : 1 ( 32 - bit ) PNG sprite of 52 x 139
2014-01-17 05:07:56 +08:00
* 2 : 1 ( 32 - bit ) PNG sprite of 52 x 139 ( same as 1 )
2014-01-15 09:22:45 +08:00
* 3 : 1 ( 32 - bit ) PNG Batch Node using 1 sprite of 52 x 139
* 4 : 1 ( 16 - bit ) PNG 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 sprites of 85 x 121 each that belong to on texture atlas
* 7 : 14 ( 32 - bit ) PNG Batch Node of 85 x 121 each
* 8 : 14 ( 16 - bit ) PNG Batch Node of 85 x 121 each
* 9 : 64 ( 32 - bit ) sprites of 32 x 32 each
* 10 : 64 ( 32 - bit ) sprites of 32 x 32 each that belong to on texture atlas
* 11 : 64 ( 32 - bit ) PNG Batch Node of 32 x 32 each
* 12 : 64 ( 16 - bit ) PNG Batch Node of 32 x 32 each
2011-03-25 13:59:08 +08:00
*/
// purge textures
2013-11-07 21:48:39 +08:00
auto mgr = Director : : getInstance ( ) - > getTextureCache ( ) ;
2014-01-15 09:22:45 +08:00
mgr - > removeTextureForKey ( " Images/grossinis_sister1.png " ) ;
mgr - > removeTextureForKey ( " Images/grossini_dance_atlas.png " ) ;
mgr - > removeTextureForKey ( " Images/spritesheet1.png " ) ;
2011-03-25 13:59:08 +08:00
switch ( subtestNumber )
{
2014-01-15 09:22:45 +08:00
///
2011-03-25 13:59:08 +08:00
case 1 :
case 2 :
2013-07-26 04:36:19 +08:00
Texture2D : : setDefaultAlphaPixelFormat ( Texture2D : : PixelFormat : : RGBA8888 ) ;
2014-01-17 05:07:56 +08:00
_parentNode = Node : : create ( ) ;
2011-03-25 13:59:08 +08:00
break ;
case 3 :
2014-01-15 09:22:45 +08:00
Texture2D : : setDefaultAlphaPixelFormat ( Texture2D : : PixelFormat : : RGBA8888 ) ;
2014-01-17 05:07:56 +08:00
_parentNode = SpriteBatchNode : : create ( " Images/grossinis_sister1.png " , 100 ) ;
2014-01-15 09:22:45 +08:00
break ;
case 4 :
2013-07-26 04:36:19 +08:00
Texture2D : : setDefaultAlphaPixelFormat ( Texture2D : : PixelFormat : : RGBA4444 ) ;
2014-01-17 05:07:56 +08:00
_parentNode = SpriteBatchNode : : create ( " Images/grossinis_sister1.png " , 100 ) ;
2011-03-25 13:59:08 +08:00
break ;
///
case 5 :
case 6 :
2014-01-15 09:22:45 +08:00
Texture2D : : setDefaultAlphaPixelFormat ( Texture2D : : PixelFormat : : RGBA8888 ) ;
2014-01-17 05:07:56 +08:00
_parentNode = Node : : create ( ) ;
2014-01-15 09:22:45 +08:00
break ;
case 7 :
Texture2D : : setDefaultAlphaPixelFormat ( Texture2D : : PixelFormat : : RGBA8888 ) ;
2014-01-17 05:07:56 +08:00
_parentNode = SpriteBatchNode : : create ( " Images/grossini_dance_atlas.png " , 100 ) ;
break ;
2014-01-15 09:22:45 +08:00
case 8 :
2013-07-26 04:36:19 +08:00
Texture2D : : setDefaultAlphaPixelFormat ( Texture2D : : PixelFormat : : RGBA4444 ) ;
2014-01-17 05:07:56 +08:00
_parentNode = SpriteBatchNode : : create ( " Images/grossini_dance_atlas.png " , 100 ) ;
2011-03-25 13:59:08 +08:00
break ;
///
2014-01-15 09:22:45 +08:00
case 9 :
case 10 :
Texture2D : : setDefaultAlphaPixelFormat ( Texture2D : : PixelFormat : : RGBA8888 ) ;
2014-01-17 05:07:56 +08:00
_parentNode = Node : : create ( ) ;
2014-01-15 09:22:45 +08:00
break ;
case 11 :
Texture2D : : setDefaultAlphaPixelFormat ( Texture2D : : PixelFormat : : RGBA8888 ) ;
2014-01-17 05:07:56 +08:00
_parentNode = SpriteBatchNode : : create ( " Images/spritesheet1.png " , 100 ) ;
2014-01-15 09:22:45 +08:00
break ;
case 12 :
2013-07-26 04:36:19 +08:00
Texture2D : : setDefaultAlphaPixelFormat ( Texture2D : : PixelFormat : : RGBA4444 ) ;
2014-01-17 05:07:56 +08:00
_parentNode = SpriteBatchNode : : create ( " Images/spritesheet1.png " , 100 ) ;
2011-03-25 13:59:08 +08:00
break ;
2014-01-15 09:22:45 +08:00
///
2014-01-17 05:07:56 +08:00
case 13 :
Texture2D : : setDefaultAlphaPixelFormat ( Texture2D : : PixelFormat : : RGBA4444 ) ;
_parentNode = Node : : create ( ) ;
break ;
2011-03-25 13:59:08 +08:00
default :
break ;
}
2014-01-17 05:07:56 +08:00
p - > addChild ( _parentNode ) ;
_parentNode - > retain ( ) ;
2011-03-25 13:59:08 +08:00
}
2013-06-20 14:17:10 +08:00
Sprite * SubTest : : createSpriteWithTag ( int tag )
2011-03-25 13:59:08 +08:00
{
2014-01-17 05:07:56 +08:00
TextureCache * cache = Director : : getInstance ( ) - > getTextureCache ( ) ;
2013-06-20 14:17:10 +08:00
Sprite * sprite = NULL ;
2011-03-25 13:59:08 +08:00
switch ( subtestNumber )
{
2014-01-15 09:22:45 +08:00
///
2011-03-25 13:59:08 +08:00
case 1 :
case 2 :
2014-01-15 09:22:45 +08:00
{
sprite = Sprite : : create ( " Images/grossinis_sister1.png " ) ;
2014-01-17 05:07:56 +08:00
_parentNode - > addChild ( sprite , 0 , tag + 100 ) ;
2014-01-15 09:22:45 +08:00
break ;
}
case 3 :
2011-03-25 13:59:08 +08:00
case 4 :
2014-01-15 09:22:45 +08:00
{
2014-01-17 05:07:56 +08:00
Texture2D * texture = cache - > addImage ( " Images/grossinis_sister1.png " ) ;
sprite = Sprite : : createWithTexture ( texture , Rect ( 0 , 0 , 52 , 139 ) ) ;
_parentNode - > addChild ( sprite , 0 , tag + 100 ) ;
2014-01-15 09:22:45 +08:00
break ;
}
///
2011-03-25 13:59:08 +08:00
case 5 :
2014-01-15 09:22:45 +08:00
{
int idx = ( CCRANDOM_0_1 ( ) * 1400 / 100 ) + 1 ;
char str [ 32 ] = { 0 } ;
sprintf ( str , " Images/grossini_dance_%02d.png " , idx ) ;
sprite = Sprite : : create ( str ) ;
2014-01-17 05:07:56 +08:00
_parentNode - > addChild ( sprite , 0 , tag + 100 ) ;
2014-01-15 09:22:45 +08:00
break ;
}
2011-03-25 13:59:08 +08:00
case 6 :
case 7 :
2014-01-15 09:22:45 +08:00
case 8 :
{
int y , x ;
int r = ( CCRANDOM_0_1 ( ) * 1400 / 100 ) ;
y = r / 5 ;
x = r % 5 ;
x * = 85 ;
y * = 121 ;
2014-01-17 05:07:56 +08:00
Texture2D * texture = cache - > addImage ( " Images/grossini_dance_atlas.png " ) ;
sprite = Sprite : : createWithTexture ( texture , Rect ( x , y , 85 , 121 ) ) ;
_parentNode - > addChild ( sprite , 0 , tag + 100 ) ;
2014-01-15 09:22:45 +08:00
break ;
}
///
case 9 :
2011-03-25 13:59:08 +08:00
{
int y , x ;
int r = ( CCRANDOM_0_1 ( ) * 6400 / 100 ) ;
y = r / 8 ;
x = r % 8 ;
char str [ 40 ] = { 0 } ;
sprintf ( str , " Images/sprites_test/sprite-%d-%d.png " , x , y ) ;
2013-06-20 14:17:10 +08:00
sprite = Sprite : : create ( str ) ;
2014-01-17 05:07:56 +08:00
_parentNode - > addChild ( sprite , 0 , tag + 100 ) ;
2011-03-25 13:59:08 +08:00
break ;
}
2014-01-15 09:22:45 +08:00
case 10 :
2014-01-17 05:07:56 +08:00
case 11 :
case 12 :
2014-01-15 09:22:45 +08:00
{
int y , x ;
int r = ( CCRANDOM_0_1 ( ) * 6400 / 100 ) ;
2011-03-25 13:59:08 +08:00
2014-01-15 09:22:45 +08:00
y = r / 8 ;
x = r % 8 ;
2011-03-25 13:59:08 +08:00
2014-01-15 09:22:45 +08:00
x * = 32 ;
y * = 32 ;
2014-01-17 05:07:56 +08:00
Texture2D * texture = cache - > addImage ( " Images/spritesheet1.png " ) ;
sprite = Sprite : : createWithTexture ( texture , CC_RECT_PIXELS_TO_POINTS ( Rect ( x , y , 32 , 32 ) ) ) ;
_parentNode - > addChild ( sprite , 0 , tag + 100 ) ;
2014-01-15 09:22:45 +08:00
break ;
}
2014-01-17 05:07:56 +08:00
///
case 13 :
2014-01-15 09:22:45 +08:00
{
2014-01-17 05:07:56 +08:00
int test = ( CCRANDOM_0_1 ( ) * 3 ) ;
2014-01-15 09:22:45 +08:00
2014-01-17 05:07:56 +08:00
if ( test = = 0 ) {
// Switch case 1
sprite = Sprite : : create ( " Images/grossinis_sister1.png " ) ;
_parentNode - > addChild ( sprite , 0 , tag + 100 ) ;
}
else if ( test = = 1 )
{
// Switch case 6
int y , x ;
int r = ( CCRANDOM_0_1 ( ) * 1400 / 100 ) ;
2014-01-15 09:22:45 +08:00
2014-01-17 05:07:56 +08:00
y = r / 5 ;
x = r % 5 ;
x * = 85 ;
y * = 121 ;
Texture2D * texture = cache - > addImage ( " Images/grossini_dance_atlas.png " ) ;
sprite = Sprite : : createWithTexture ( texture , Rect ( x , y , 85 , 121 ) ) ;
_parentNode - > addChild ( sprite , 0 , tag + 100 ) ;
}
else if ( test = = 2 )
{
int y , x ;
int r = ( CCRANDOM_0_1 ( ) * 6400 / 100 ) ;
y = r / 8 ;
x = r % 8 ;
x * = 32 ;
y * = 32 ;
Texture2D * texture = cache - > addImage ( " Images/spritesheet1.png " ) ;
sprite = Sprite : : createWithTexture ( texture , CC_RECT_PIXELS_TO_POINTS ( Rect ( x , y , 32 , 32 ) ) ) ;
_parentNode - > addChild ( sprite , 0 , tag + 100 ) ;
}
2014-01-15 09:22:45 +08:00
}
2011-03-25 13:59:08 +08:00
default :
break ;
}
return sprite ;
}
void SubTest : : removeByTag ( int tag )
{
2014-01-17 05:07:56 +08:00
_parentNode - > removeChildByTag ( tag + 100 , true ) ;
2011-03-25 13:59:08 +08:00
}
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// SpriteMenuLayer
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2014-02-20 10:53:49 +08:00
void SpriteMenuLayer : : restartCallback ( Ref * sender )
2013-09-30 16:22:55 +08:00
{
if ( SpriteMainScene : : _s_autoTest )
{
log ( " It's auto sprite performace testing,so this operation is invalid " ) ;
return ;
}
PerformBasicLayer : : restartCallback ( sender ) ;
}
2014-02-20 10:53:49 +08:00
void SpriteMenuLayer : : nextCallback ( Ref * sender )
2013-09-30 16:22:55 +08:00
{
if ( SpriteMainScene : : _s_autoTest )
{
log ( " It's auto sprite performace testing,so this operation is invalid " ) ;
return ;
}
PerformBasicLayer : : nextCallback ( sender ) ;
}
2014-02-20 10:53:49 +08:00
void SpriteMenuLayer : : backCallback ( Ref * sender )
2013-09-30 16:22:55 +08:00
{
if ( SpriteMainScene : : _s_autoTest )
{
log ( " It's auto sprite performace testing,so this operation is invalid " ) ;
return ;
}
PerformBasicLayer : : backCallback ( sender ) ;
}
2011-03-25 13:59:08 +08:00
void SpriteMenuLayer : : showCurrentTest ( )
{
2013-07-23 08:25:44 +08:00
SpriteMainScene * scene = NULL ;
2013-08-16 16:05:27 +08:00
auto pPreScene = ( SpriteMainScene * ) getParent ( ) ;
2011-03-25 13:59:08 +08:00
int nSubTest = pPreScene - > getSubTestNum ( ) ;
int nNodes = pPreScene - > getNodesNum ( ) ;
2013-06-15 14:03:30 +08:00
switch ( _curCase )
2011-03-25 13:59:08 +08:00
{
case 0 :
2013-07-23 08:25:44 +08:00
scene = new SpritePerformTest1 ;
2011-03-25 13:59:08 +08:00
break ;
case 1 :
2013-07-23 08:25:44 +08:00
scene = new SpritePerformTest2 ;
2011-03-25 13:59:08 +08:00
break ;
case 2 :
2013-07-23 08:25:44 +08:00
scene = new SpritePerformTest3 ;
2011-03-25 13:59:08 +08:00
break ;
case 3 :
2013-07-23 08:25:44 +08:00
scene = new SpritePerformTest4 ;
2011-03-25 13:59:08 +08:00
break ;
case 4 :
2013-07-23 08:25:44 +08:00
scene = new SpritePerformTest5 ;
2011-03-25 13:59:08 +08:00
break ;
case 5 :
2013-07-23 08:25:44 +08:00
scene = new SpritePerformTest6 ;
2011-03-25 13:59:08 +08:00
break ;
case 6 :
2013-07-23 08:25:44 +08:00
scene = new SpritePerformTest7 ;
2011-03-25 13:59:08 +08:00
break ;
}
2013-09-30 16:22:55 +08:00
SpriteMainScene : : _s_nSpriteCurCase = _curCase ;
2011-03-25 13:59:08 +08:00
2013-07-23 08:25:44 +08:00
if ( scene )
2012-04-19 14:35:52 +08:00
{
2013-07-23 08:25:44 +08:00
scene - > initWithSubTest ( nSubTest , nNodes ) ;
Director : : getInstance ( ) - > replaceScene ( scene ) ;
scene - > release ( ) ;
2012-04-19 14:35:52 +08:00
}
2011-03-25 13:59:08 +08:00
}
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// SpriteMainScene
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2013-09-30 16:22:55 +08:00
bool SpriteMainScene : : _s_autoTest = false ;
int SpriteMainScene : : _s_nSpriteCurCase = 0 ;
2011-03-25 13:59:08 +08:00
void SpriteMainScene : : initWithSubTest ( int asubtest , int nNodes )
{
//srandom(0);
subtestNumber = asubtest ;
2013-06-15 14:03:30 +08:00
_subTest = new SubTest ;
_subTest - > initWithSubTest ( asubtest , this ) ;
2011-03-25 13:59:08 +08:00
2013-08-16 16:05:27 +08:00
auto s = Director : : getInstance ( ) - > getWinSize ( ) ;
2011-03-25 13:59:08 +08:00
lastRenderedCount = 0 ;
quantityNodes = 0 ;
2013-06-20 14:17:10 +08:00
MenuItemFont : : setFontSize ( 65 ) ;
2013-08-16 16:05:27 +08:00
auto decrease = MenuItemFont : : create ( " - " , CC_CALLBACK_1 ( SpriteMainScene : : onDecrease , this ) ) ;
2013-07-05 16:49:22 +08:00
decrease - > setColor ( Color3B ( 0 , 200 , 20 ) ) ;
2013-08-16 16:05:27 +08:00
auto increase = MenuItemFont : : create ( " + " , CC_CALLBACK_1 ( SpriteMainScene : : onIncrease , this ) ) ;
2013-07-05 16:49:22 +08:00
increase - > setColor ( Color3B ( 0 , 200 , 20 ) ) ;
2011-03-25 13:59:08 +08:00
2013-08-16 16:05:27 +08:00
auto menu = Menu : : create ( decrease , increase , NULL ) ;
2011-03-25 13:59:08 +08:00
menu - > alignItemsHorizontally ( ) ;
2013-07-12 14:11:55 +08:00
menu - > setPosition ( Point ( s . width / 2 , s . height - 65 ) ) ;
2011-03-25 13:59:08 +08:00
addChild ( menu , 1 ) ;
2014-04-09 23:31:05 +08:00
auto infoLabel = Label : : createWithTTF ( " 0 nodes " , " fonts/Marker Felt.ttf " , 30 ) ;
2013-07-05 16:49:22 +08:00
infoLabel - > setColor ( Color3B ( 0 , 200 , 20 ) ) ;
2013-07-12 14:11:55 +08:00
infoLabel - > setPosition ( Point ( s . width / 2 , s . height - 90 ) ) ;
2011-03-25 13:59:08 +08:00
addChild ( infoLabel , 1 , kTagInfoLayer ) ;
// add menu
2013-09-30 16:22:55 +08:00
auto menuLayer = new SpriteMenuLayer ( true , TEST_COUNT , SpriteMainScene : : _s_nSpriteCurCase ) ;
2013-07-24 06:20:22 +08:00
addChild ( menuLayer , 1 , kTagMenuLayer ) ;
menuLayer - > release ( ) ;
2013-09-30 16:22:55 +08:00
/**
* auto test menu
*/
auto menuAutoTest = Menu : : create ( ) ;
menuAutoTest - > setPosition ( Point : : ZERO ) ;
2014-03-26 23:33:58 +08:00
MenuItemFont : : setFontName ( " fonts/arial.ttf " ) ;
2013-09-30 16:22:55 +08:00
MenuItemFont : : setFontSize ( 24 ) ;
MenuItemFont * autoTestItem = NULL ;
if ( SpriteMainScene : : _s_autoTest )
{
autoTestItem = MenuItemFont : : create ( " Auto Test On " , CC_CALLBACK_1 ( SpriteMainScene : : onAutoTest , this ) ) ;
}
else
{
autoTestItem = MenuItemFont : : create ( " Auto Test Off " , CC_CALLBACK_1 ( SpriteMainScene : : onAutoTest , this ) ) ;
}
autoTestItem - > setTag ( 1 ) ;
autoTestItem - > setPosition ( Point ( s . width - 90 , s . height / 2 ) ) ;
menuAutoTest - > addChild ( autoTestItem ) ;
addChild ( menuAutoTest , 3 , kTagAutoTestMenu ) ;
2011-03-25 13:59:08 +08:00
// Sub Tests
2014-01-17 05:07:56 +08:00
MenuItemFont : : setFontSize ( 28 ) ;
2013-08-16 16:05:27 +08:00
auto subMenu = Menu : : create ( ) ;
2014-01-17 05:07:56 +08:00
for ( int i = 1 ; i < = 13 ; + + i )
2012-04-19 14:35:52 +08:00
{
char str [ 10 ] = { 0 } ;
sprintf ( str , " %d " , i ) ;
2013-08-16 16:05:27 +08:00
auto itemFont = MenuItemFont : : create ( str , CC_CALLBACK_1 ( SpriteMainScene : : testNCallback , this ) ) ;
2012-04-19 14:35:52 +08:00
itemFont - > setTag ( i ) ;
2013-07-24 06:20:22 +08:00
subMenu - > addChild ( itemFont , 10 ) ;
2012-04-19 14:35:52 +08:00
2014-01-15 09:22:45 +08:00
if ( i < = 4 )
2013-07-05 16:49:22 +08:00
itemFont - > setColor ( Color3B ( 200 , 20 , 20 ) ) ;
2014-01-15 09:22:45 +08:00
else if ( i < = 8 )
2013-07-05 16:49:22 +08:00
itemFont - > setColor ( Color3B ( 0 , 200 , 20 ) ) ;
2014-01-17 05:07:56 +08:00
else if ( i < = 12 )
2013-07-05 16:49:22 +08:00
itemFont - > setColor ( Color3B ( 0 , 20 , 200 ) ) ;
2014-01-17 05:07:56 +08:00
else
itemFont - > setColor ( Color3B : : GRAY ) ;
2011-03-25 13:59:08 +08:00
}
2013-07-24 06:20:22 +08:00
subMenu - > alignItemsHorizontally ( ) ;
subMenu - > setPosition ( Point ( s . width / 2 , 80 ) ) ;
addChild ( subMenu , 2 ) ;
2011-03-25 13:59:08 +08:00
// add title label
2014-04-09 23:31:05 +08:00
auto label = Label : : createWithTTF ( title ( ) , " fonts/arial.ttf " , 32 ) ;
2011-03-25 13:59:08 +08:00
addChild ( label , 1 ) ;
2014-02-10 11:42:15 +08:00
label - > setPosition ( Point ( s . width / 2 , s . height - 50 ) ) ;
2011-03-25 13:59:08 +08:00
2014-01-15 09:22:45 +08:00
// subtitle
std : : string strSubtitle = subtitle ( ) ;
if ( ! strSubtitle . empty ( ) )
{
2014-04-09 23:31:05 +08:00
auto l = Label : : createWithTTF ( strSubtitle . c_str ( ) , " fonts/Thonburi.ttf " , 16 ) ;
2014-01-15 09:22:45 +08:00
addChild ( l , 9999 ) ;
l - > setPosition ( Point ( VisibleRect : : center ( ) . x , VisibleRect : : top ( ) . y - 60 ) ) ;
}
2011-03-25 13:59:08 +08:00
while ( quantityNodes < nNodes )
onIncrease ( this ) ;
}
2013-12-19 05:52:10 +08:00
std : : string SpriteMainScene : : title ( ) const
2011-03-25 13:59:08 +08:00
{
return " No title " ;
}
2014-01-15 09:22:45 +08:00
std : : string SpriteMainScene : : subtitle ( ) const
{
return " " ; // override me
}
2011-03-25 13:59:08 +08:00
SpriteMainScene : : ~ SpriteMainScene ( )
{
2013-06-15 14:03:30 +08:00
if ( _subTest )
2012-04-19 14:35:52 +08:00
{
2013-06-15 14:03:30 +08:00
delete _subTest ;
_subTest = NULL ;
2011-03-25 13:59:08 +08:00
}
}
2014-02-20 10:53:49 +08:00
void SpriteMainScene : : testNCallback ( Ref * sender )
2011-03-25 13:59:08 +08:00
{
2013-09-30 16:22:55 +08:00
if ( SpriteMainScene : : _s_autoTest )
{
log ( " It's auto sprite performace testing,so this operation is invalid " ) ;
return ;
}
2013-07-26 06:53:24 +08:00
subtestNumber = static_cast < MenuItemFont * > ( sender ) - > getTag ( ) ;
auto menu = static_cast < SpriteMenuLayer * > ( getChildByTag ( kTagMenuLayer ) ) ;
menu - > restartCallback ( sender ) ;
2011-03-25 13:59:08 +08:00
}
void SpriteMainScene : : updateNodes ( )
{
if ( quantityNodes ! = lastRenderedCount )
{
2014-03-26 23:33:58 +08:00
auto infoLabel = ( Label * ) getChildByTag ( kTagInfoLayer ) ;
2011-03-25 13:59:08 +08:00
char str [ 16 ] = { 0 } ;
sprintf ( str , " %u nodes " , quantityNodes ) ;
infoLabel - > setString ( str ) ;
lastRenderedCount = quantityNodes ;
}
}
2014-02-20 10:53:49 +08:00
void SpriteMainScene : : onIncrease ( Ref * sender )
2013-09-30 16:22:55 +08:00
{
2011-03-25 13:59:08 +08:00
if ( quantityNodes > = kMaxNodes )
return ;
for ( int i = 0 ; i < kNodesIncrease ; i + + )
{
2013-08-16 16:05:27 +08:00
auto sprite = _subTest - > createSpriteWithTag ( quantityNodes ) ;
2011-03-25 13:59:08 +08:00
doTest ( sprite ) ;
quantityNodes + + ;
}
updateNodes ( ) ;
}
2014-02-20 10:53:49 +08:00
void SpriteMainScene : : onDecrease ( Ref * sender )
2011-03-25 13:59:08 +08:00
{
2013-09-30 16:22:55 +08:00
2011-03-25 13:59:08 +08:00
if ( quantityNodes < = 0 )
return ;
for ( int i = 0 ; i < kNodesIncrease ; i + + )
{
quantityNodes - - ;
2013-06-15 14:03:30 +08:00
_subTest - > removeByTag ( quantityNodes ) ;
2011-03-25 13:59:08 +08:00
}
updateNodes ( ) ;
}
2013-09-30 16:22:55 +08:00
void SpriteMainScene : : dumpProfilerFPS ( )
{
if ( _vecFPS . empty ( ) )
{
log ( " Error: the FPS vector is empty " ) ;
return ;
}
auto iter = _vecFPS . begin ( ) ;
float minFPS = * iter ;
float maxFPS = * iter ;
float totalFPS = 0.0f ;
float averagerFPS = 0.0f ;
2013-10-31 09:49:04 +08:00
for ( auto fps : _vecFPS )
2013-09-30 16:22:55 +08:00
{
2013-10-31 09:49:04 +08:00
CCLOG ( " fps is :%f \n " , fps ) ;
minFPS = std : : min ( minFPS , fps ) ;
maxFPS = std : : max ( maxFPS , fps ) ;
totalFPS + = fps ;
2013-09-30 16:22:55 +08:00
}
averagerFPS = totalFPS / _vecFPS . size ( ) ;
log ( " Cur test: %d, cur sub item :%d,cur sprite nums:%d, the min FPS value is %.1f,the max FPS value is %.1f,the averager FPS is %.1f " , SpriteMainScene : : _s_nSpriteCurCase , subtestNumber , quantityNodes , minFPS , maxFPS , averagerFPS ) ;
}
void SpriteMainScene : : updateAutoTest ( float dt )
{
if ( SpriteMainScene : : _s_autoTest )
{
_executeTimes + = 1 ;
_vecFPS . push_back ( Director : : getInstance ( ) - > getFrameRate ( ) ) ;
if ( _executeTimes > = SpriteMainScene : : MAX_AUTO_TEST_TIMES )
{
dumpProfilerFPS ( ) ;
nextAutoTest ( ) ;
}
}
}
void SpriteMainScene : : onEnter ( )
{
Scene : : onEnter ( ) ;
if ( SpriteMainScene : : _s_autoTest )
{
_vecFPS . clear ( ) ;
_executeTimes = 0 ;
auto director = Director : : getInstance ( ) ;
auto sched = director - > getScheduler ( ) ;
2014-03-03 11:00:30 +08:00
sched - > schedule ( schedule_selector ( SpriteMainScene : : updateAutoTest ) , this , 0.2f , false ) ;
2013-09-30 16:22:55 +08:00
}
}
void SpriteMainScene : : onExit ( )
{
if ( SpriteMainScene : : _s_autoTest )
{
auto director = Director : : getInstance ( ) ;
auto sched = director - > getScheduler ( ) ;
2014-03-03 11:00:30 +08:00
sched - > unschedule ( schedule_selector ( SpriteMainScene : : updateAutoTest ) , this ) ;
2013-09-30 16:22:55 +08:00
}
Scene : : onExit ( ) ;
}
void SpriteMainScene : : autoShowSpriteTests ( int curCase , int subTest , int nodes )
{
SpriteMainScene * scene = NULL ;
switch ( 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 ;
}
SpriteMainScene : : _s_nSpriteCurCase = curCase ;
if ( scene )
{
scene - > initWithSubTest ( subTest , nodes ) ;
Director : : getInstance ( ) - > replaceScene ( scene ) ;
scene - > release ( ) ;
}
}
void SpriteMainScene : : beginAutoTest ( )
{
if ( 0 ! = SpriteMainScene : : _s_nSpriteCurCase )
{
SpriteMainScene : : _s_nSpriteCurCase = 0 ;
}
auto scene = new SpritePerformTest1 ;
scene - > initWithSubTest ( 1 , 500 ) ;
Director : : getInstance ( ) - > replaceScene ( scene ) ;
scene - > release ( ) ;
}
void SpriteMainScene : : endAutoTest ( )
{
SpriteMainScene : : _s_autoTest = false ;
auto director = Director : : getInstance ( ) ;
auto sched = director - > getScheduler ( ) ;
2014-03-03 11:00:30 +08:00
sched - > unschedule ( schedule_selector ( SpriteMainScene : : updateAutoTest ) , this ) ;
2013-09-30 16:22:55 +08:00
}
void SpriteMainScene : : nextAutoTest ( )
{
if ( SpriteMainScene : : _s_nSpriteCurCase < SpriteMainScene : : MAX_SPRITE_TEST_CASE )
{
if ( subtestNumber < SpriteMainScene : : MAX_SUB_TEST_NUMS )
{
subtestNumber + = 1 ;
autoShowSpriteTests ( SpriteMainScene : : _s_nSpriteCurCase , subtestNumber , quantityNodes ) ;
}
else if ( subtestNumber = = SpriteMainScene : : MAX_SUB_TEST_NUMS )
{
if ( quantityNodes = = SpriteMainScene : : AUTO_TEST_NODE_NUM1 )
{
autoShowSpriteTests ( SpriteMainScene : : _s_nSpriteCurCase , 1 , SpriteMainScene : : AUTO_TEST_NODE_NUM2 ) ;
}
else
{
if ( SpriteMainScene : : _s_nSpriteCurCase + 1 < SpriteMainScene : : MAX_SPRITE_TEST_CASE )
{
SpriteMainScene : : _s_nSpriteCurCase + = 1 ;
autoShowSpriteTests ( SpriteMainScene : : _s_nSpriteCurCase , 1 , SpriteMainScene : : AUTO_TEST_NODE_NUM1 ) ;
}
else
{
finishAutoTest ( ) ;
}
}
}
}
}
void SpriteMainScene : : finishAutoTest ( )
{
SpriteMainScene : : _s_autoTest = false ;
auto director = Director : : getInstance ( ) ;
auto sched = director - > getScheduler ( ) ;
2014-03-03 11:00:30 +08:00
sched - > unschedule ( schedule_selector ( SpriteMainScene : : updateAutoTest ) , this ) ;
2013-09-30 16:22:55 +08:00
auto autoTestMenu = dynamic_cast < Menu * > ( getChildByTag ( kTagAutoTestMenu ) ) ;
if ( nullptr ! = autoTestMenu )
{
auto menuItemFont = dynamic_cast < MenuItemFont * > ( autoTestMenu - > getChildByTag ( 1 ) ) ;
if ( nullptr ! = menuItemFont )
{
menuItemFont - > setString ( " Auto Test finish " ) ;
}
}
log ( " Sprite performance test is finish " ) ;
}
2014-02-20 10:53:49 +08:00
void SpriteMainScene : : onAutoTest ( Ref * sender )
2013-09-30 16:22:55 +08:00
{
SpriteMainScene : : _s_autoTest = ! SpriteMainScene : : _s_autoTest ;
MenuItemFont * menuItem = dynamic_cast < MenuItemFont * > ( sender ) ;
if ( nullptr ! = menuItem )
{
if ( SpriteMainScene : : _s_autoTest )
{
menuItem - > setString ( " Auto Test On " ) ;
beginAutoTest ( ) ;
}
else
{
menuItem - > setString ( " Auto Test Off " ) ;
endAutoTest ( ) ;
}
}
}
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// For test functions
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2013-07-24 06:20:22 +08:00
void performanceActions ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
2013-08-16 16:05:27 +08:00
auto size = Director : : getInstance ( ) - > getWinSize ( ) ;
2013-07-24 06:20:22 +08:00
sprite - > setPosition ( Point ( ( rand ( ) % ( int ) size . width ) , ( rand ( ) % ( int ) size . height ) ) ) ;
2011-03-25 13:59:08 +08:00
float period = 0.5f + ( rand ( ) % 1000 ) / 500.0f ;
2013-08-16 16:05:27 +08:00
auto rot = RotateBy : : create ( period , 360.0f * CCRANDOM_0_1 ( ) ) ;
auto rot_back = rot - > reverse ( ) ;
auto permanentRotation = RepeatForever : : create ( Sequence : : create ( rot , rot_back , NULL ) ) ;
2013-07-24 06:20:22 +08:00
sprite - > runAction ( permanentRotation ) ;
2011-03-25 13:59:08 +08:00
float growDuration = 0.5f + ( rand ( ) % 1000 ) / 500.0f ;
2013-08-16 16:05:27 +08:00
auto grow = ScaleBy : : create ( growDuration , 0.5f , 0.5f ) ;
auto permanentScaleLoop = RepeatForever : : create ( Sequence : : create ( grow , grow - > reverse ( ) , NULL ) ) ;
2013-07-24 06:20:22 +08:00
sprite - > runAction ( permanentScaleLoop ) ;
2011-03-25 13:59:08 +08:00
}
2013-07-24 06:20:22 +08:00
void performanceActions20 ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
2013-08-16 16:05:27 +08:00
auto size = Director : : getInstance ( ) - > getWinSize ( ) ;
2011-03-25 13:59:08 +08:00
if ( CCRANDOM_0_1 ( ) < 0.2f )
2013-07-24 06:20:22 +08:00
sprite - > setPosition ( Point ( ( rand ( ) % ( int ) size . width ) , ( rand ( ) % ( int ) size . height ) ) ) ;
2011-03-25 13:59:08 +08:00
else
2013-07-24 06:20:22 +08:00
sprite - > setPosition ( Point ( - 1000 , - 1000 ) ) ;
2011-03-25 13:59:08 +08:00
float period = 0.5f + ( rand ( ) % 1000 ) / 500.0f ;
2013-08-16 16:05:27 +08:00
auto rot = RotateBy : : create ( period , 360.0f * CCRANDOM_0_1 ( ) ) ;
auto rot_back = rot - > reverse ( ) ;
auto permanentRotation = RepeatForever : : create ( Sequence : : create ( rot , rot_back , NULL ) ) ;
2013-07-24 06:20:22 +08:00
sprite - > runAction ( permanentRotation ) ;
2011-03-25 13:59:08 +08:00
float growDuration = 0.5f + ( rand ( ) % 1000 ) / 500.0f ;
2013-08-16 16:05:27 +08:00
auto grow = ScaleBy : : create ( growDuration , 0.5f , 0.5f ) ;
auto permanentScaleLoop = RepeatForever : : create ( Sequence : : createWithTwoActions ( grow , grow - > reverse ( ) ) ) ;
2013-07-24 06:20:22 +08:00
sprite - > runAction ( permanentScaleLoop ) ;
2011-03-25 13:59:08 +08:00
}
2013-07-24 06:20:22 +08:00
void performanceRotationScale ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
2013-08-16 16:05:27 +08:00
auto size = Director : : getInstance ( ) - > getWinSize ( ) ;
2013-07-24 06:20:22 +08:00
sprite - > setPosition ( Point ( ( rand ( ) % ( int ) size . width ) , ( rand ( ) % ( int ) size . height ) ) ) ;
sprite - > setRotation ( CCRANDOM_0_1 ( ) * 360 ) ;
sprite - > setScale ( CCRANDOM_0_1 ( ) * 2 ) ;
2011-03-25 13:59:08 +08:00
}
2013-07-24 06:20:22 +08:00
void performancePosition ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
2013-08-16 16:05:27 +08:00
auto size = Director : : getInstance ( ) - > getWinSize ( ) ;
2013-07-24 06:20:22 +08:00
sprite - > setPosition ( Point ( ( rand ( ) % ( int ) size . width ) , ( rand ( ) % ( int ) size . height ) ) ) ;
2011-03-25 13:59:08 +08:00
}
2013-07-24 06:20:22 +08:00
void performanceout20 ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
2013-08-16 16:05:27 +08:00
auto size = Director : : getInstance ( ) - > getWinSize ( ) ;
2011-03-25 13:59:08 +08:00
if ( CCRANDOM_0_1 ( ) < 0.2f )
2013-07-24 06:20:22 +08:00
sprite - > setPosition ( Point ( ( rand ( ) % ( int ) size . width ) , ( rand ( ) % ( int ) size . height ) ) ) ;
2011-03-25 13:59:08 +08:00
else
2013-07-24 06:20:22 +08:00
sprite - > setPosition ( Point ( - 1000 , - 1000 ) ) ;
2011-03-25 13:59:08 +08:00
}
2013-07-24 06:20:22 +08:00
void performanceOut100 ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
2013-07-24 06:20:22 +08:00
sprite - > setPosition ( Point ( - 1000 , - 1000 ) ) ;
2011-03-25 13:59:08 +08:00
}
2013-07-24 06:20:22 +08:00
void performanceScale ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
2013-08-16 16:05:27 +08:00
auto size = Director : : getInstance ( ) - > getWinSize ( ) ;
2013-07-24 06:20:22 +08:00
sprite - > setPosition ( Point ( ( rand ( ) % ( int ) size . width ) , ( rand ( ) % ( int ) size . height ) ) ) ;
sprite - > setScale ( CCRANDOM_0_1 ( ) * 100 / 50 ) ;
2011-03-25 13:59:08 +08:00
}
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// SpritePerformTest1
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2013-12-19 05:52:10 +08:00
std : : string SpritePerformTest1 : : title ( ) const
2011-03-25 13:59:08 +08:00
{
char str [ 32 ] = { 0 } ;
sprintf ( str , " A (%d) position " , subtestNumber ) ;
std : : string strRet = str ;
return strRet ;
}
2014-01-15 09:22:45 +08:00
std : : string SpritePerformTest1 : : subtitle ( ) const
{
return " test 1 " ;
}
2013-06-20 14:17:10 +08:00
void SpritePerformTest1 : : doTest ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
performancePosition ( sprite ) ;
}
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// SpritePerformTest2
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2013-12-19 05:52:10 +08:00
std : : string SpritePerformTest2 : : title ( ) const
2011-03-25 13:59:08 +08:00
{
char str [ 32 ] = { 0 } ;
sprintf ( str , " B (%d) scale " , subtestNumber ) ;
std : : string strRet = str ;
return strRet ;
}
2014-01-15 09:22:45 +08:00
std : : string SpritePerformTest2 : : subtitle ( ) const
{
return " test 2 " ;
}
2013-06-20 14:17:10 +08:00
void SpritePerformTest2 : : doTest ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
performanceScale ( sprite ) ;
}
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// SpritePerformTest3
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2013-12-19 05:52:10 +08:00
std : : string SpritePerformTest3 : : title ( ) const
2011-03-25 13:59:08 +08:00
{
char str [ 32 ] = { 0 } ;
sprintf ( str , " C (%d) scale + rot " , subtestNumber ) ;
std : : string strRet = str ;
return strRet ;
}
2014-01-15 09:22:45 +08:00
std : : string SpritePerformTest3 : : subtitle ( ) const
{
return " test 3 " ;
}
2013-06-20 14:17:10 +08:00
void SpritePerformTest3 : : doTest ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
performanceRotationScale ( sprite ) ;
}
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// SpritePerformTest4
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2013-12-19 05:52:10 +08:00
std : : string SpritePerformTest4 : : title ( ) const
2011-03-25 13:59:08 +08:00
{
char str [ 32 ] = { 0 } ;
sprintf ( str , " D (%d) 100%% out " , subtestNumber ) ;
std : : string strRet = str ;
return strRet ;
}
2014-01-15 09:22:45 +08:00
std : : string SpritePerformTest4 : : subtitle ( ) const
{
return " test 4 " ;
}
2013-06-20 14:17:10 +08:00
void SpritePerformTest4 : : doTest ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
performanceOut100 ( sprite ) ;
}
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// SpritePerformTest5
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2013-12-19 05:52:10 +08:00
std : : string SpritePerformTest5 : : title ( ) const
2011-03-25 13:59:08 +08:00
{
char str [ 32 ] = { 0 } ;
sprintf ( str , " E (%d) 80%% out " , subtestNumber ) ;
std : : string strRet = str ;
return strRet ;
}
2014-01-15 09:22:45 +08:00
std : : string SpritePerformTest5 : : subtitle ( ) const
{
return " test 5 " ;
}
2013-06-20 14:17:10 +08:00
void SpritePerformTest5 : : doTest ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
performanceout20 ( sprite ) ;
}
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// SpritePerformTest6
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2013-12-19 05:52:10 +08:00
std : : string SpritePerformTest6 : : title ( ) const
2011-03-25 13:59:08 +08:00
{
char str [ 32 ] = { 0 } ;
sprintf ( str , " F (%d) actions " , subtestNumber ) ;
std : : string strRet = str ;
return strRet ;
}
2014-01-15 09:22:45 +08:00
std : : string SpritePerformTest6 : : subtitle ( ) const
{
return " test 6 " ;
}
2013-06-20 14:17:10 +08:00
void SpritePerformTest6 : : doTest ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
performanceActions ( sprite ) ;
}
2012-04-19 14:35:52 +08:00
////////////////////////////////////////////////////////
//
// SpritePerformTest7
//
2011-03-25 13:59:08 +08:00
////////////////////////////////////////////////////////
2013-12-19 05:52:10 +08:00
std : : string SpritePerformTest7 : : title ( ) const
2011-03-25 13:59:08 +08:00
{
char str [ 32 ] = { 0 } ;
sprintf ( str , " G (%d) actions 80%% out " , subtestNumber ) ;
std : : string strRet = str ;
return strRet ;
}
2014-01-15 09:22:45 +08:00
std : : string SpritePerformTest7 : : subtitle ( ) const
{
return " test 7 " ;
}
2013-06-20 14:17:10 +08:00
void SpritePerformTest7 : : doTest ( Sprite * sprite )
2011-03-25 13:59:08 +08:00
{
performanceActions20 ( sprite ) ;
}
void runSpriteTest ( )
{
2013-09-30 16:22:55 +08:00
SpriteMainScene : : _s_autoTest = false ;
2013-08-16 16:05:27 +08:00
auto scene = new SpritePerformTest1 ;
2013-07-23 08:25:44 +08:00
scene - > initWithSubTest ( 1 , 50 ) ;
Director : : getInstance ( ) - > replaceScene ( scene ) ;
scene - > release ( ) ;
2011-03-25 13:59:08 +08:00
}