@@ -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 ( ) ;
@@ -2511,8 +2547,9 @@ cc.game = /** @lends cc.game# */{
25112547// @Time ticker section
25122548 _setAnimFrame : function ( ) {
25132549 this . _lastTime = new Date ( ) ;
2514- this . _frameTime = 1000 / cc . game . config [ cc . game . CONFIG_KEY . frameRate ] ;
2515- 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 ) {
25162553 window . requestAnimFrame = this . _stTime ;
25172554 window . cancelAnimationFrame = this . _ctTime ;
25182555 }
@@ -2550,20 +2587,26 @@ cc.game = /** @lends cc.game# */{
25502587 //Run game.
25512588 _runMainLoop : function ( ) {
25522589 var self = this , callback , config = self . config , CONFIG_KEY = self . CONFIG_KEY ,
2553- director = cc . director ;
2590+ director = cc . director ,
2591+ skip = true , frameRate = config [ CONFIG_KEY . frameRate ] ;
25542592
25552593 director . setDisplayStats ( config [ CONFIG_KEY . showFPS ] ) ;
25562594
25572595 callback = function ( ) {
25582596 if ( ! self . _paused ) {
2597+ if ( frameRate === 30 ) {
2598+ if ( skip = ! skip ) {
2599+ self . _intervalId = window . requestAnimFrame ( callback ) ;
2600+ return ;
2601+ }
2602+ }
2603+
25592604 director . mainLoop ( ) ;
2560- if ( self . _intervalId )
2561- window . cancelAnimationFrame ( self . _intervalId ) ;
25622605 self . _intervalId = window . requestAnimFrame ( callback ) ;
25632606 }
25642607 } ;
25652608
2566- window . requestAnimFrame ( callback ) ;
2609+ self . _intervalId = window . requestAnimFrame ( callback ) ;
25672610 self . _paused = false ;
25682611 } ,
25692612
@@ -2659,7 +2702,7 @@ cc.game = /** @lends cc.game# */{
26592702 }
26602703 width = width || element . clientWidth ;
26612704 height = height || element . clientHeight ;
2662- this . canvas = cc . _canvas = localCanvas = document . createElement ( "CANVAS" ) ;
2705+ this . canvas = cc . _canvas = localCanvas = cc . $ ( document . createElement ( "CANVAS" ) ) ;
26632706 this . container = cc . container = localContainer = document . createElement ( "DIV" ) ;
26642707 element . appendChild ( localContainer ) ;
26652708 }
@@ -2707,7 +2750,7 @@ cc.game = /** @lends cc.game# */{
27072750 } ,
27082751
27092752 _initEvents : function ( ) {
2710- var win = window , self = this , hidden , visibilityChange , _undef = "undefined" ;
2753+ var win = window , hidden ;
27112754
27122755 this . _eventHide = this . _eventHide || new cc . EventCustom ( this . EVENT_HIDE ) ;
27132756 this . _eventHide . setUserData ( this ) ;
@@ -2720,18 +2763,21 @@ cc.game = /** @lends cc.game# */{
27202763
27212764 if ( ! cc . isUndefined ( document . hidden ) ) {
27222765 hidden = "hidden" ;
2723- visibilityChange = "visibilitychange" ;
27242766 } else if ( ! cc . isUndefined ( document . mozHidden ) ) {
27252767 hidden = "mozHidden" ;
2726- visibilityChange = "mozvisibilitychange" ;
27272768 } else if ( ! cc . isUndefined ( document . msHidden ) ) {
27282769 hidden = "msHidden" ;
2729- visibilityChange = "msvisibilitychange" ;
27302770 } else if ( ! cc . isUndefined ( document . webkitHidden ) ) {
27312771 hidden = "webkitHidden" ;
2732- visibilityChange = "webkitvisibilitychange" ;
27332772 }
27342773
2774+ var changeList = [
2775+ "visibilitychange" ,
2776+ "mozvisibilitychange" ,
2777+ "msvisibilitychange" ,
2778+ "webkitvisibilitychange" ,
2779+ "qbrowserVisibilityChange"
2780+ ] ;
27352781 var onHidden = function ( ) {
27362782 if ( cc . eventManager && cc . game . _eventHide )
27372783 cc . eventManager . dispatchEvent ( cc . game . _eventHide ) ;
@@ -2742,10 +2788,15 @@ cc.game = /** @lends cc.game# */{
27422788 } ;
27432789
27442790 if ( hidden ) {
2745- document . addEventListener ( visibilityChange , function ( ) {
2746- if ( document [ hidden ] ) onHidden ( ) ;
2747- else onShow ( ) ;
2748- } , 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+ }
27492800 } else {
27502801 win . addEventListener ( "blur" , onHidden , false ) ;
27512802 win . addEventListener ( "focus" , onShow , false ) ;
0 commit comments