THREE.TextureLoader() рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдФрд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрдЧ рдХрд╛ рд▓реЛрдб () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╣реА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХрдИ рдмрд╛рд░ (рдпрд╛рдиреА 20 рдЧреБрдирд╛ рдпрд╛ рдЕрдзрд┐рдХ) рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред
рдиреАрдЪреЗ рдЪрд┐рддреНрд░ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдмрдирд╛рд╡рдЯ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдЖрдЧреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
var Element = function (texture) {
this.texture = texture;
};
Element.prototype.createShaderMaterial = function (uniforms, vertexShader, fragmentShader) {
var loader = new THREE.TextureLoader();
uniforms.texture.value = loader.load(this.texture);
return new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: vertexShader,
fragmentShader: fragmentShader,
wireframe: true
});
};
рдбрд┐рдмрдЧрд┐рдВрдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдк рдпрд╣рд╛рдВ рдПрдХ рд▓рд╛рдЗрд╡ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рднреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://alexprut.github.io/earth-defender/ рдФрд░ рдЧреЗрдо рдХреЛрдб рдпрд╣рд╛рдВ: https://github.com/alexprut/earth-defender/tree/master/ рдЧреНрд░рд╛рд╣рдХ/рдЬреЗрдПрд╕
[рдПрдХреНрд╕] рдЖрд░ 80
[x] рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА
[ ] рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░
[x] рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд▓реЛрдбрд░ рдЕрднреАрд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЙрд▓реНрдХрд╛ рдмрдирд╛рд╡рдЯ рдХреЛ 200 рдмрд╛рд░ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВред рд▓реЛрдбрд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреИрд╢ рдХрд░рдиреЗ рдФрд░ рдЙрди рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреИрд╢ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рднреА рд╢реАрд░реНрд╖рд▓реЗрдЦ рд╕рд╣реА рд╣реИрдВ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╣рд░ рдмрд╛рд░ рдЫрд╡рд┐ рдХреЗ рдХреИрд╢реНрдб рд╕рдВрд╕реНрдХрд░рдг рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ:
this.maxMeteorietes = config.maxMeteorietes || 200;
Game.prototype.createMeteorites = function (numMeteorites) {
var meteorites = new THREE.Object3D();
for (var i = 0; i < numMeteorites; i++) {
var meteorite = new Meteorite().create(
this.createUniforms(),
this.createVertexShader(),
this.createFragmentShader()
);
....
}
Meteorite.prototype.create = function (uniforms, vertexShader, fragmentShader) {
return new THREE.Mesh(
new THREE.SphereGeometry(5, 5, 5),
//This line is called 200 times, and as such your loader.load() function will be called 200 times.
this.createShaderMaterial(uniforms, vertexShader, fragmentShader)
);
};
рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛:
var cache = [];
var loader = new THREE.TextureLoader(); //don't need a local version of this object
Element.prototype.createShaderMaterial = function (uniforms, vertexShader, fragmentShader) {
if(cache[this.texture]){
return cache[this.texture]; //cache[this.texture].clone();
}
uniforms.texture.value = loader.load(this.texture);
var shader = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: vertexShader,
fragmentShader: fragmentShader,
wireframe: true
});
cache[this.texture] = shader;
return shader;
};
рддреЛ рдЖрдк рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдПрдХ рдХреИрд╢ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рд░ рдмрд╛рд░ рдкреБрди: рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рд░рдгреА рд╕реЗ рд▓реЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрджрд┐ рд╕рднреА рдХреНрд╖реБрджреНрд░рдЧреНрд░рд╣реЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╕рд╛рдордЧреНрд░реА рд╣реИ, рдпрд╛ рдпрджрд┐ рдЖрдк рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ .clone() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓рддреА рд╣реИред
@calrk рдзрдиреНрдпрд╡рд╛рдж рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ THREE.TextureLoader()
рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрд╕реЗ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдмрдирд╛рд╡рдЯ рдХреЛ рдХреИрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
var loader = THREE.TextureLoader();
loader(texture, cache = false);
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд▓реЛрдбрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдмрдирд╛рд╡рдЯ рдХреЛ рдХреИрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрджрд┐ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпреЛрдВ)ред
рдиреАрдЪреЗ рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди (рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди/рдореЙрдбреНрдпреВрд▓ рдкреИрдЯрд░реНрди) рдХреИрд╢ рдореЙрдбреНрдпреВрд▓ рд╣реИ:
var TextureLoader = (function () {
var _instance = null;
var Loader = function () {
var _loader = new THREE.TextureLoader();
var _cache = [];
function _cachePush(elem, val) {
_cache.push({
element: elem,
value: val
});
}
function _cacheSearch(elem) {
for (var i = 0; i < _cache.length; i++) {
if (_cache[i].element === elem) {
return _cache[i].value;
}
}
return false;
}
function load(texture) {
var match = _cacheSearch(texture);
if (match) {
return match;
}
var val = _loader.load(texture);
_cachePush(texture, val);
return val;
}
return {
load: load
}
};
function getInstance() {
return (_instance) ? _instance : _instance = Loader();
}
return {
getInstance: getInstance
}
})();
рдЙрд╕ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдФрд░ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
TextureLoader.getInstance().load(texture);
XHRLoader
рдЬрд┐рд╕реЗ TextureLoader
рд╕реЗ ImageLoader
рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ Cache
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ Cache.enabled
рд╣реИ false
ред
рдпрджрд┐ рдЖрдк THREE.Cache.enabled = true;
three.js
рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
XHRLoader
рдЬрд┐рд╕реЗTextureLoader
рд╕реЗImageLoader
рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБCache
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИрд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ
Cache.enabled
рд╣реИfalse
редрдпрджрд┐ рдЖрдк
THREE.Cache.enabled = true;
three.js
рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рдж рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВрдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
https://github.com/mrdoob/three.js/blob/2f469f327a10c7780c9bc69f876f9ed5049587f2/src/loaders/XHRLoader.js#L22
https://github.com/mrdoob/three.js/blob/f65e669af99feb518e31756d793a9688a2578fbd/src/loaders/Cache.js#L9
6834