Three.js: THREE.TextureLoader () рдПрдХ рд╣реА рдмрдирд╛рд╡рдЯ рдХреЛ рдХрдИ рдмрд╛рд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд 20 рдЧреБрдирд╛ рдпрд╛ рдЕрдзрд┐рдХ)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рдЕрдХреНрддреВре░ 2016  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mrdoob/three.js

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг

THREE.TextureLoader() рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдФрд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрдЧ рдХрд╛ рд▓реЛрдб () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╣реА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХрдИ рдмрд╛рд░ (рдпрд╛рдиреА 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/ рдЧреНрд░рд╛рд╣рдХ/рдЬреЗрдПрд╕

рддреАрди.рдЬреЗрдПрд╕ рд╕рдВрд╕реНрдХрд░рдг
  • [] рджреЗрд╡
  • [] r81
  • [рдПрдХреНрд╕] рдЖрд░ 80

    рдмреНрд░рд╛рдЙрдЬрд╝рд░
  • [x] рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА

  • [] рдХреНрд░реЛрдо
  • [ ] рдлрд╛рдпрд░рдлреЙрдХреНрд╕
  • [ ] рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░

    рдУрдПрд╕
  • [x] рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА

  • [ ] рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдБ
  • [] рд▓рд┐рдирдХреНрд╕
  • [ ] рдПрдВрдбреНрд░реЙрдпрдб
  • [] рдЖрдИрдУрдПрд╕
    рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ (рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб, рд╡реАрдЖрд░ рдбрд┐рд╡рд╛рдЗрд╕, ...)
Help (please use the forum)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

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

рд╕рднреА 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 рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ 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

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕