Three.js: THREE.TextureLoader()λŠ” λ™μΌν•œ ν…μŠ€μ²˜λ₯Ό μ—¬λŸ¬ 번 λ‘œλ“œν•©λ‹ˆλ‹€(예: 20회 이상).

에 λ§Œλ“  2016λ…„ 10μ›” 05일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: mrdoob/three.js

λ¬Έμ œμ— λŒ€ν•œ μ„€λͺ…

THREE.TextureLoader()λŠ” μ˜ˆμƒμΉ˜ λͺ»ν•œ 잘λͺ»λœ λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€. 클래슀의 load() ν•¨μˆ˜λŠ” λ™μΌν•œ μžμ‚°μ„ μ—¬λŸ¬ 번(즉, 20회 이상) μ‹œλ„/λ‘œλ“œν•©λ‹ˆλ‹€.

μ•„λž˜ 그림은 λΈŒλΌμš°μ € μ½˜μ†”μ„ μ‚¬μš©ν•˜μ—¬ 이 λ™μž‘μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.
bdhg9

ν…μŠ€μ²˜λ₯Ό λ‘œλ“œν•˜κ³  μ‚¬μš©ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

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

Three.js 버전
  • [ ] 개발
  • [ ] r81
  • [x] r80

    λΈŒλΌμš°μ €
  • [x] λͺ¨λ‘

  • [ ] 크둬
  • [ ] νŒŒμ΄μ–΄ν­μŠ€
  • [ ] 인터넷 μ΅μŠ€ν”Œλ‘œλŸ¬

    OS
  • [x] λͺ¨λ‘

  • [ ] μœˆλ„μš°
  • [ ] λ¦¬λˆ…μŠ€
  • [ ] μ•ˆλ“œλ‘œμ΄λ“œ
  • [ ] iOS
    ν•˜λ“œμ›¨μ–΄ μš”κ΅¬ 사항(κ·Έλž˜ν”½ μΉ΄λ“œ, VR μž₯치, ...)
Help (please use the forum)

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

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

λͺ¨λ“  3 λŒ“κΈ€

λ‘œλ”κ°€ μ˜λ„ν•œ λŒ€λ‘œ μž‘λ™ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 당신이 μš”μ²­ν•˜κΈ° λ•Œλ¬Έμ— μœ μ„± ν…μŠ€μ²˜λ₯Ό 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; λ₯Ό μ„€μ •ν–ˆλ‹€λ©΄
그것은 νš¨κ³Όκ°€μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

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

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰