THREE.TextureLoader()λ μμμΉ λͺ»ν μλͺ»λ λ°©μμΌλ‘ μλν©λλ€. ν΄λμ€μ load() ν¨μλ λμΌν μμ°μ μ¬λ¬ λ²(μ¦, 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/ ν΄λΌμ΄μΈνΈ/js
[x] r80
[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
TextureLoader
μμ νΈμΆλλ XHRLoader
ImageLoader
λ μ μ κ°μ²΄ Cache
νμ§λ§ κΈ°λ³Έ Cache.enabled
λ false
μ
λλ€.
three.js
λΆλ¬μ€κΈ° μ§νμ THREE.Cache.enabled = true;
λ₯Ό μ€μ νλ€λ©΄
κ·Έκ²μ ν¨κ³Όκ°μμ κ²μ
λλ€.
κ°μ₯ μ μ©ν λκΈ
XHRLoader
TextureLoader
λ₯Ό ν΅ν΄ImageLoader
TextureLoader
μμ νΈμΆλλXHRLoader
ImageLoader
λ μ μ κ°μ²΄Cache
νμ§λ§ κΈ°λ³Έ
Cache.enabled
λfalse
μ λλ€.three.js
λΆλ¬μ€κΈ° μ§νμTHREE.Cache.enabled = true;
λ₯Ό μ€μ νλ€λ©΄κ·Έκ²μ ν¨κ³Όκ°μμ κ²μ λλ€.
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