@@ -583,6 +583,33 @@ cc.path = /** @lends cc.path# */{
583583 * @see cc.loader
584584 */
585585
586+ var imagePool = {
587+ _pool : new Array ( 10 ) ,
588+ _MAX : 10 ,
589+ _smallImg : "data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=" ,
590+
591+ count : 0 ,
592+ get : function ( ) {
593+ if ( this . count > 0 ) {
594+ this . count -- ;
595+ var result = this . _pool [ this . count ] ;
596+ this . _pool [ this . count ] = null ;
597+ return result ;
598+ }
599+ else {
600+ return new Image ( ) ;
601+ }
602+ } ,
603+ put : function ( img ) {
604+ var pool = this . _pool ;
605+ if ( img instanceof HTMLImageElement && this . count < this . _MAX ) {
606+ img . src = this . _smallImg ;
607+ pool [ this . count ] = img ;
608+ this . count ++ ;
609+ }
610+ }
611+ } ;
612+
586613/**
587614 * Singleton instance of cc.Loader.
588615 * @name cc.loader
@@ -867,7 +894,7 @@ cc.loader = (function () {
867894 * @param {function } callback
868895 * @returns {Image }
869896 */
870- loadImg : function ( url , option , callback ) {
897+ loadImg : function ( url , option , callback , img ) {
871898 var opt = {
872899 isCrossOrigin : true
873900 } ;
@@ -876,10 +903,10 @@ cc.loader = (function () {
876903 else if ( option !== undefined )
877904 callback = option ;
878905
879- var img = this . getRes ( url ) ;
880- if ( img ) {
881- callback && callback ( null , img ) ;
882- return img ;
906+ var texture = this . getRes ( url ) ;
907+ if ( texture ) {
908+ callback && callback ( null , texture ) ;
909+ return null ;
883910 }
884911
885912 var queue = _queue [ url ] ;
@@ -888,18 +915,16 @@ cc.loader = (function () {
888915 return queue . img ;
889916 }
890917
891- img = new Image ( ) ;
918+ img = img || imagePool . get ( ) ;
892919 if ( opt . isCrossOrigin && location . origin !== "file://" )
893920 img . crossOrigin = "Anonymous" ;
921+ else
922+ img . crossOrigin = null ;
894923
895924 var loadCallback = function ( ) {
896925 this . removeEventListener ( 'load' , loadCallback , false ) ;
897926 this . removeEventListener ( 'error' , errorCallback , false ) ;
898927
899- if ( ! _urlRegExp . test ( url ) ) {
900- cc . loader . cache [ url ] = img ;
901- }
902-
903928 var queue = _queue [ url ] ;
904929 if ( queue ) {
905930 var callbacks = queue . callbacks ;
@@ -912,16 +937,21 @@ cc.loader = (function () {
912937 queue . img = null ;
913938 delete _queue [ url ] ;
914939 }
940+
941+ if ( cc . _renderType === cc . game . RENDER_TYPE_WEBGL ) {
942+ imagePool . put ( img ) ;
943+ }
915944 } ;
916945
917946 var self = this ;
918947 var errorCallback = function ( ) {
948+ this . removeEventListener ( 'load' , loadCallback , false ) ;
919949 this . removeEventListener ( 'error' , errorCallback , false ) ;
920950
921- if ( img . crossOrigin && img . crossOrigin . toLowerCase ( ) === "anonymous" ) {
951+ if ( window . location . protocol !== 'https:' && img . crossOrigin && img . crossOrigin . toLowerCase ( ) === "anonymous" ) {
922952 opt . isCrossOrigin = false ;
923953 self . release ( url ) ;
924- cc . loader . loadImg ( url , opt , callback ) ;
954+ cc . loader . loadImg ( url , opt , callback , img ) ;
925955 } else {
926956 var queue = _queue [ url ] ;
927957 if ( queue ) {
@@ -935,6 +965,10 @@ cc.loader = (function () {
935965 queue . img = null ;
936966 delete _queue [ url ] ;
937967 }
968+
969+ if ( cc . _renderType === cc . game . RENDER_TYPE_WEBGL ) {
970+ imagePool . put ( img ) ;
971+ }
938972 }
939973 } ;
940974
@@ -1610,6 +1644,7 @@ var _initSys = function () {
16101644 sys . BROWSER_TYPE_WECHAT = "wechat" ;
16111645 sys . BROWSER_TYPE_ANDROID = "androidbrowser" ;
16121646 sys . BROWSER_TYPE_IE = "ie" ;
1647+ sys . BROWSER_TYPE_QQ_APP = "qq" ; // QQ App
16131648 sys . BROWSER_TYPE_QQ = "qqbrowser" ;
16141649 sys . BROWSER_TYPE_MOBILE_QQ = "mqqbrowser" ;
16151650 sys . BROWSER_TYPE_UC = "ucbrowser" ;
@@ -1727,13 +1762,13 @@ var _initSys = function () {
17271762 /* Determine the browser type */
17281763 ( function ( ) {
17291764 var typeReg1 = / m i c r o m e s s e n g e r | m q q b r o w s e r | s o g o u | q z o n e | l i e b a o | u c b r o w s e r | 3 6 0 a p h o n e | 3 6 0 b r o w s e r | b a i d u b o x a p p | b a i d u b r o w s e r | m a x t h o n | m x b r o w s e r | t r i d e n t | m i u i b r o w s e r / i;
1730- var typeReg2 = / q q b r o w s e r | c h r o m e | s a f a r i | f i r e f o x | o p r | o u p e n g | o p e r a / i;
1765+ var typeReg2 = / q q b r o w s e r | q q | c h r o m e | s a f a r i | f i r e f o x | o p r | o u p e n g | o p e r a / i;
17311766 var browserTypes = typeReg1 . exec ( ua ) ;
17321767 if ( ! browserTypes ) browserTypes = typeReg2 . exec ( ua ) ;
17331768 var browserType = browserTypes ? browserTypes [ 0 ] : sys . BROWSER_TYPE_UNKNOWN ;
17341769 if ( browserType === 'micromessenger' )
17351770 browserType = sys . BROWSER_TYPE_WECHAT ;
1736- else if ( browserType === "safari" && ( ua . match ( / a n d r o i d . * a p p l e w e b k i t / ) ) )
1771+ else if ( browserType === "safari" && isAndroid )
17371772 browserType = sys . BROWSER_TYPE_ANDROID ;
17381773 else if ( browserType === "trident" )
17391774 browserType = sys . BROWSER_TYPE_IE ;
@@ -1756,8 +1791,8 @@ var _initSys = function () {
17561791 sys . browserVersion = "" ;
17571792 /* Determine the browser version number */
17581793 ( function ( ) {
1759- var versionReg1 = / ( m i c r o m e s s e n g e r | q q | m x | m a x t h o n | b a i d u | s o g o u ) ( m o b i l e ) ? ( b r o w s e r ) ? \/ ? ( [ \d . ] + ) / i;
1760- var versionReg2 = / ( m s i e | r v : | f i r e f o x | c h r o m e | u c b r o w s e r | o u p e n g | o p e r a | o p r | s a f a r i | m i u i ) ( m o b i l e ) ? ( b r o w s e r ) ? \/ ? ( [ \d . ] + ) / i;
1794+ var versionReg1 = / ( m q q b r o w s e r | m i c r o m e s s e n g e r | s o g o u | q z o n e | l i e b a o | m a x t h o n | m x b r o w s e r | b a i d u ) ( m o b i l e ) ? ( b r o w s e r ) ? \/ ? ( [ \d . ] + ) / i;
1795+ var versionReg2 = / ( m s i e | r v : | f i r e f o x | c h r o m e | u c b r o w s e r | q q | o u p e n g | o p e r a | o p r | s a f a r i | m i u i ) ( m o b i l e ) ? ( b r o w s e r ) ? \/ ? ( [ \d . ] + ) / i;
17611796 var tmp = ua . match ( versionReg1 ) ;
17621797 if ( ! tmp ) tmp = ua . match ( versionReg2 ) ;
17631798 sys . browserVersion = tmp ? tmp [ 4 ] : "" ;
@@ -1843,7 +1878,7 @@ var _initSys = function () {
18431878 var tmpCanvas = document . createElement ( "CANVAS" ) ;
18441879 try {
18451880 var context = cc . create3DContext ( tmpCanvas ) ;
1846- if ( context && context . getShaderPrecisionFormat ) {
1881+ if ( context ) {
18471882 _supportWebGL = true ;
18481883 }
18491884
@@ -2329,6 +2364,7 @@ cc.game = /** @lends cc.game# */{
23292364 config [ CONFIG_KEY . frameRate ] = frameRate ;
23302365 if ( self . _intervalId )
23312366 window . cancelAnimationFrame ( self . _intervalId ) ;
2367+ self . _intervalId = 0 ;
23322368 self . _paused = true ;
23332369 self . _setAnimFrame ( ) ;
23342370 self . _runMainLoop ( ) ;
@@ -2349,8 +2385,7 @@ cc.game = /** @lends cc.game# */{
23492385 this . _paused = true ;
23502386 // Pause audio engine
23512387 if ( cc . audioEngine ) {
2352- cc . audioEngine . stopAllEffects ( ) ;
2353- cc . audioEngine . pauseMusic ( ) ;
2388+ cc . audioEngine . _pausePlaying ( ) ;
23542389 }
23552390 // Pause main loop
23562391 if ( this . _intervalId )
@@ -2366,7 +2401,7 @@ cc.game = /** @lends cc.game# */{
23662401 this . _paused = false ;
23672402 // Resume audio engine
23682403 if ( cc . audioEngine ) {
2369- cc . audioEngine . resumeMusic ( ) ;
2404+ cc . audioEngine . _resumePlaying ( ) ;
23702405 }
23712406 // Resume main loop
23722407 this . _runMainLoop ( ) ;
@@ -2512,8 +2547,9 @@ cc.game = /** @lends cc.game# */{
25122547// @Time ticker section
25132548 _setAnimFrame : function ( ) {
25142549 this . _lastTime = new Date ( ) ;
2515- this . _frameTime = 1000 / cc . game . config [ cc . game . CONFIG_KEY . frameRate ] ;
2516- if ( ( cc . sys . os === cc . sys . OS_IOS && cc . sys . browserType === cc . sys . BROWSER_TYPE_WECHAT ) || cc . game . config [ cc . game . CONFIG_KEY . frameRate ] !== 60 ) {
2550+ var frameRate = cc . game . config [ cc . game . CONFIG_KEY . frameRate ] ;
2551+ this . _frameTime = 1000 / frameRate ;
2552+ if ( frameRate !== 60 && frameRate !== 30 ) {
25172553 window . requestAnimFrame = this . _stTime ;
25182554 window . cancelAnimationFrame = this . _ctTime ;
25192555 }
@@ -2551,20 +2587,26 @@ cc.game = /** @lends cc.game# */{
25512587 //Run game.
25522588 _runMainLoop : function ( ) {
25532589 var self = this , callback , config = self . config , CONFIG_KEY = self . CONFIG_KEY ,
2554- director = cc . director ;
2590+ director = cc . director ,
2591+ skip = true , frameRate = config [ CONFIG_KEY . frameRate ] ;
25552592
25562593 director . setDisplayStats ( config [ CONFIG_KEY . showFPS ] ) ;
25572594
25582595 callback = function ( ) {
25592596 if ( ! self . _paused ) {
2597+ if ( frameRate === 30 ) {
2598+ if ( skip = ! skip ) {
2599+ self . _intervalId = window . requestAnimFrame ( callback ) ;
2600+ return ;
2601+ }
2602+ }
2603+
25602604 director . mainLoop ( ) ;
2561- if ( self . _intervalId )
2562- window . cancelAnimationFrame ( self . _intervalId ) ;
25632605 self . _intervalId = window . requestAnimFrame ( callback ) ;
25642606 }
25652607 } ;
25662608
2567- window . requestAnimFrame ( callback ) ;
2609+ self . _intervalId = window . requestAnimFrame ( callback ) ;
25682610 self . _paused = false ;
25692611 } ,
25702612
@@ -2660,7 +2702,7 @@ cc.game = /** @lends cc.game# */{
26602702 }
26612703 width = width || element . clientWidth ;
26622704 height = height || element . clientHeight ;
2663- this . canvas = cc . _canvas = localCanvas = document . createElement ( "CANVAS" ) ;
2705+ this . canvas = cc . _canvas = localCanvas = cc . $ ( document . createElement ( "CANVAS" ) ) ;
26642706 this . container = cc . container = localContainer = document . createElement ( "DIV" ) ;
26652707 element . appendChild ( localContainer ) ;
26662708 }
@@ -2708,7 +2750,7 @@ cc.game = /** @lends cc.game# */{
27082750 } ,
27092751
27102752 _initEvents : function ( ) {
2711- var win = window , self = this , hidden , visibilityChange , _undef = "undefined" ;
2753+ var win = window , hidden ;
27122754
27132755 this . _eventHide = this . _eventHide || new cc . EventCustom ( this . EVENT_HIDE ) ;
27142756 this . _eventHide . setUserData ( this ) ;
@@ -2721,18 +2763,21 @@ cc.game = /** @lends cc.game# */{
27212763
27222764 if ( ! cc . isUndefined ( document . hidden ) ) {
27232765 hidden = "hidden" ;
2724- visibilityChange = "visibilitychange" ;
27252766 } else if ( ! cc . isUndefined ( document . mozHidden ) ) {
27262767 hidden = "mozHidden" ;
2727- visibilityChange = "mozvisibilitychange" ;
27282768 } else if ( ! cc . isUndefined ( document . msHidden ) ) {
27292769 hidden = "msHidden" ;
2730- visibilityChange = "msvisibilitychange" ;
27312770 } else if ( ! cc . isUndefined ( document . webkitHidden ) ) {
27322771 hidden = "webkitHidden" ;
2733- visibilityChange = "webkitvisibilitychange" ;
27342772 }
27352773
2774+ var changeList = [
2775+ "visibilitychange" ,
2776+ "mozvisibilitychange" ,
2777+ "msvisibilitychange" ,
2778+ "webkitvisibilitychange" ,
2779+ "qbrowserVisibilityChange"
2780+ ] ;
27362781 var onHidden = function ( ) {
27372782 if ( cc . eventManager && cc . game . _eventHide )
27382783 cc . eventManager . dispatchEvent ( cc . game . _eventHide ) ;
@@ -2743,10 +2788,15 @@ cc.game = /** @lends cc.game# */{
27432788 } ;
27442789
27452790 if ( hidden ) {
2746- document . addEventListener ( visibilityChange , function ( ) {
2747- if ( document [ hidden ] ) onHidden ( ) ;
2748- else onShow ( ) ;
2749- } , false ) ;
2791+ for ( var i = 0 ; i < changeList . length ; i ++ ) {
2792+ document . addEventListener ( changeList [ i ] , function ( event ) {
2793+ var visible = document [ hidden ] ;
2794+ // QQ App
2795+ visible = visible || event [ "hidden" ] ;
2796+ if ( visible ) onHidden ( ) ;
2797+ else onShow ( ) ;
2798+ } , false ) ;
2799+ }
27502800 } else {
27512801 win . addEventListener ( "blur" , onHidden , false ) ;
27522802 win . addEventListener ( "focus" , onShow , false ) ;
0 commit comments