Skip to content

Commit 09ad1e9

Browse files
authored
Merge pull request #3482 from pandamicro/develop
Use imagePool to reduce image memory usage in WebGL mode
2 parents 93e7c2f + 811ca72 commit 09ad1e9

File tree

6 files changed

+67
-32
lines changed

6 files changed

+67
-32
lines changed

Diff for: CCBoot.js

+41-14
Original file line numberDiff line numberDiff line change
@@ -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,30 +903,22 @@ 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;
883-
}
884-
885906
var queue = _queue[url];
886907
if (queue) {
887908
queue.callbacks.push(callback);
888909
return queue.img;
889910
}
890911

891-
img = new Image();
912+
img = img || imagePool.get();
892913
if (opt.isCrossOrigin && location.origin !== "file://")
893914
img.crossOrigin = "Anonymous";
915+
else
916+
img.crossOrigin = null;
894917

895918
var loadCallback = function () {
896919
this.removeEventListener('load', loadCallback, false);
897920
this.removeEventListener('error', errorCallback, false);
898921

899-
if (!_urlRegExp.test(url)) {
900-
cc.loader.cache[url] = img;
901-
}
902-
903922
var queue = _queue[url];
904923
if (queue) {
905924
var callbacks = queue.callbacks;
@@ -912,17 +931,21 @@ cc.loader = (function () {
912931
queue.img = null;
913932
delete _queue[url];
914933
}
934+
935+
if (cc._renderType === cc.game.RENDER_TYPE_WEBGL) {
936+
imagePool.put(img);
937+
}
915938
};
916939

917940
var self = this;
918941
var errorCallback = function () {
919942
this.removeEventListener('load', loadCallback, false);
920943
this.removeEventListener('error', errorCallback, false);
921944

922-
if (img.crossOrigin && img.crossOrigin.toLowerCase() === "anonymous") {
945+
if (window.location.protocol !== 'https:' && img.crossOrigin && img.crossOrigin.toLowerCase() === "anonymous") {
923946
opt.isCrossOrigin = false;
924947
self.release(url);
925-
cc.loader.loadImg(url, opt, callback);
948+
cc.loader.loadImg(url, opt, callback, img);
926949
} else {
927950
var queue = _queue[url];
928951
if (queue) {
@@ -936,6 +959,10 @@ cc.loader = (function () {
936959
queue.img = null;
937960
delete _queue[url];
938961
}
962+
963+
if (cc._renderType === cc.game.RENDER_TYPE_WEBGL) {
964+
imagePool.put(img);
965+
}
939966
}
940967
};
941968

Diff for: cocos2d/core/labelttf/CCLabelTTFCanvasRenderCmd.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,10 @@ cc.LabelTTF._firsrEnglish = /^[a-zA-Z0-9\-¿¡«À-ÖØ-öø-ʯ\u0300-\u034e\u03
430430
if (node._string.length === 0) {
431431
locLabelCanvas.width = 1;
432432
locLabelCanvas.height = locContentSize.height || 1;
433-
node._texture && node._texture.handleLoadedTexture();
433+
if (node._texture) {
434+
node._texture._htmlElementObj = this._labelCanvas;
435+
node._texture.handleLoadedTexture();
436+
}
434437
node.setTextureRect(cc.rect(0, 0, 1, locContentSize.height));
435438
return true;
436439
}
@@ -444,7 +447,10 @@ cc.LabelTTF._firsrEnglish = /^[a-zA-Z0-9\-¿¡«À-ÖØ-öø-ʯ\u0300-\u034e\u03
444447
if (flag) locContext.clearRect(0, 0, width, height);
445448
this._saveStatus();
446449
this._drawTTFInCanvas(locContext);
447-
node._texture && node._texture.handleLoadedTexture();
450+
if (node._texture) {
451+
node._texture._htmlElementObj = this._labelCanvas;
452+
node._texture.handleLoadedTexture();
453+
}
448454
node.setTextureRect(cc.rect(0, 0, width, height));
449455
return true;
450456
};

Diff for: cocos2d/core/platform/CCLoaders.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,13 @@ cc._imgLoader = {
5454
callback = function (err, img) {
5555
if (err)
5656
return cb(err);
57-
cc.loader.cache[url] = img;
58-
cc.textureCache.handleLoadedTexture(url);
59-
cb(null, img);
57+
58+
var tex = cc.textureCache.getTextureForKey(url) || new cc.Texture2D();
59+
tex.url = url;
60+
tex.initWithElement(img);
61+
tex.handleLoadedTexture();
62+
cc.textureCache.cacheImage(url, tex);
63+
cb(null, tex);
6064
};
6165
}
6266
cc.loader.loadImg(realUrl, callback);

Diff for: cocos2d/core/textures/CCTexture2D.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,7 @@ cc.game.addEventListener(cc.game.EVENT_RENDERER_INITED, function () {
192192
var self = this;
193193
if (self._textureLoaded) return;
194194
if (!self._htmlElementObj) {
195-
var img = cc.loader.getRes(self.url);
196-
if (!img) return;
197-
self.initWithElement(img);
195+
return;
198196
}
199197

200198
var locElement = self._htmlElementObj;

Diff for: cocos2d/core/textures/CCTextureCache.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -313,14 +313,15 @@ cc.game.addEventListener(cc.game.EVENT_RENDERER_INITED, function () {
313313

314314
var _p = cc.textureCache;
315315

316-
_p.handleLoadedTexture = function (url) {
316+
_p.handleLoadedTexture = function (url, img) {
317317
var locTexs = this._textures;
318318
//remove judge
319319
var tex = locTexs[url];
320320
if (!tex) {
321321
tex = locTexs[url] = new cc.Texture2D();
322322
tex.url = url;
323323
}
324+
tex.initWithElement(img);
324325
tex.handleLoadedTexture();
325326
};
326327

@@ -365,12 +366,12 @@ cc.game.addEventListener(cc.game.EVENT_RENDERER_INITED, function () {
365366
if (err)
366367
return cb && cb.call(target, err);
367368

369+
cc.textureCache.handleLoadedTexture(url, img);
370+
var texResult = locTexs[url];
368371
if (!cc.loader.cache[url]) {
369-
cc.loader.cache[url] = img;
372+
cc.loader.cache[url] = texResult;
370373
}
371-
cc.textureCache.handleLoadedTexture(url);
372374

373-
var texResult = locTexs[url];
374375
cb && cb.call(target, texResult);
375376
});
376377

Diff for: cocos2d/core/textures/TexturesWebGL.js

+5-6
Original file line numberDiff line numberDiff line change
@@ -457,11 +457,8 @@ cc._tmp.WebGLTexture2D = function () {
457457
// Not sure about this ! Some texture need to be updated even after loaded
458458
if (!cc.game._rendererInitialized)
459459
return;
460-
if (!self._htmlElementObj) {
461-
var img = cc.loader.getRes(self.url);
462-
if (!img) return;
463-
self.initWithElement(img);
464-
}
460+
if (!self._htmlElementObj)
461+
return;
465462
if (!self._htmlElementObj.width || !self._htmlElementObj.height)
466463
return;
467464

@@ -498,6 +495,7 @@ cc._tmp.WebGLTexture2D = function () {
498495

499496
self._hasPremultipliedAlpha = premultiplied;
500497
self._hasMipmaps = false;
498+
self._htmlElementObj = null;
501499

502500
//dispatch load event to listener.
503501
self.dispatchEvent("load");
@@ -854,7 +852,7 @@ cc._tmp.WebGLTextureAtlas = function () {
854852
cc._tmp.WebGLTextureCache = function () {
855853
var _p = cc.textureCache;
856854

857-
_p.handleLoadedTexture = function (url) {
855+
_p.handleLoadedTexture = function (url, img) {
858856
var locTexs = this._textures, tex, ext;
859857
//remove judge(webgl)
860858
if (!cc.game._rendererInitialized) {
@@ -865,6 +863,7 @@ cc._tmp.WebGLTextureCache = function () {
865863
tex = locTexs[url] = new cc.Texture2D();
866864
tex.url = url;
867865
}
866+
tex.initWithElement(img);
868867
ext = cc.path.extname(url);
869868
if (ext === ".png") {
870869
tex.handleLoadedTexture(true);

0 commit comments

Comments
 (0)