Three.js: ์ผ๋ถ€ ES6 ๊ธฐ๋Šฅ ์ฑ„ํƒ

์— ๋งŒ๋“  2015๋…„ 04์›” 16์ผ  ยท  74์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

๋ธŒ๋ผ์šฐ์ €์™€ ๋„๊ตฌ๊ฐ€ ๋น ๋ฅด๊ฒŒ ์ง€์›๋˜๋Š” ES6์ด ์ถœ์‹œ๋ฉ๋‹ˆ๋‹ค. THREE.js๋Š” ES6์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€์—์„œ ์—„์ฒญ๋‚œ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์žฌ๋ฏธ๋ฅผ ์œ„ํ•ด ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์ ํŠธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์žฅ๋ คํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์—์„œ ๋ณด์—ฌ์ง€๋Š” ๊ธฐ๋Šฅ:

  • ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜
  • ์ฐจ๋‹จ ๋ฒ”์œ„ let ํ‚ค์›Œ๋“œ
  • ๋ฐ˜๋ณต์ž + For..Of
  • ํด๋ž˜์Šค
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
  • ๋ฐœ์ „๊ธฐ
  • ๋ชจ๋“ˆ

ํด๋ž˜์Šค ์˜ˆ์‹œ

import Object3D from '../core/Object3D';
import Geometry from '../core/Geometry';
import MeshBasicMaterial from '../materials/MeshBasicMaterial';

class Mesh extends Object3D {
    constructor(
        geometry = new Geometry(),
        material = new MeshBasicMaterial({color: Math.random() * 0xffffff}
    ) {
        super();

        this.geometry = geometry;
        this.material = material;

        this.updateMorphTargets();
    }
}

export default Mesh;

์ˆœํšŒ ์ƒ์„ฑ๊ธฐ ์˜ˆ์ œ

class Object3D {
    constructor() {
        ...
    }

    traverse(callback) {
        callback(this);

        for (let object of this.children) {
            object.traverse(callback);
        }
    },

    *traversalGenerator() {
        this.traverse(object => yield object);
    }

    ...
}

์‚ฌ์šฉ ์ค‘์ธ ๋ฐœ์ „๊ธฐ:

for (let object of scene.traversalGenerator()) {
    if (object.name === 'Blah') {
        break;
    }
}

์ฐธ๊ณ  : ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

Suggestion

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

https://github.com/mrdoob/three.js/commit/1017a5432eede4487436d6d34807fda24b506088

์ข‹์Šต๋‹ˆ๋‹ค. let ๋ฐ const ์—์„œ src/ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@DefinitelyMaybe ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ๋„์™€์ฃผ๊ณ  ์‹ถ์€ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๋ชจ๋“  74 ๋Œ“๊ธ€

์•„๋งˆ ์กฐ๊ธˆ ์ผ์ฐ? ์ง€์›์€ ์ผ๊ด€๋˜๊ฒŒ ํ›Œ๋ฅญํ•œ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค: http://kangax.github.io/compat-table/es6/

let FF์—์„œ๋Š” ๋…ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉฐ Chrome ๋ฐ IE์—์„œ๋Š” 100% ์ƒํ™ฉ์ด ์•„๋‹™๋‹ˆ๋‹ค.
generators IE์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
class ๋Š” ํ˜„์žฌ ๋ฒ„์ „๋ณด๋‹ค 2๋‹จ๊ณ„ ๋†’์€ Win10 ๋ฐ FF39์šฉ Chrome, IE12(Spartan) ๊ธฐ์ˆ  ํ”„๋ฆฌ๋ทฐ์—๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.
import ์€(๋Š”) ์•„์ง ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
super ๋Š” IE11, Chrome ๋˜๋Š” FF๊ฐ€ ์•„๋‹Œ IE12์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
arrow functions IE11 ๋˜๋Š” Chrome์— ์—†์Œ

๋˜ํ•œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ for-of ๋Š” ๋ชจ๋‘ Chrome์˜ ์ตœ์ ํ™” ํ‚ฌ๋Ÿฌ์ž…๋‹ˆ๋‹ค.

Imo๋Š” ๋˜ํ•œ ๋” ๋ฉ‹์ง„ ๊ตฌ๋ฌธ์„ ๋ณด๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ด๋ฅด๋‹ค. ๋ชฉ๋ก์— ์žˆ๋Š” ํ•ญ๋ชฉ์ด ๋ˆˆ์— ๋„๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋˜๋Š” ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ์ด์ ์„ ์ œ๊ณตํ•  ๋•Œ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค์™€ ES6 ๊ธฐ๋Šฅ์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์ด์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ES6 ํŒŒํ‹ฐ์— ์กฐ๊ธˆ ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋‹ค๋ฅธ ์–ธ์–ด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ •๊ธฐ์ ์œผ๋กœ Three.js์— ๊ธฐ์—ฌํ•˜์ง€๋งŒ ์œ„์˜ ์Šค๋‹ˆํŽซ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋ฉด ๊ณ„์†ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 'new function()' ๋ฐ 'object.prototype'๊ณผ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ๋” ๋Š๋ฆด ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ์–‘๊ณผ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์˜ JavaScript ๋ฒ„์ „์„ ๋ฐฐ์šธ ์ธ๋‚ด์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์›น ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ES6 ์–ธ์–ด ์œ„์›ํšŒ์— ์š”๊ตฌํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” 20๋…„ ๋™์•ˆ ์ฝ”๋”ฉ์„ ํ•ด์™”๊ณ  'ํด๋ž˜์Šค'๋ผ๋Š” ๋‹จ์–ด๋Š” ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ์–ด๋””์—๋„ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ JavaScript๋Š” JAVA...(script)์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. :-\

์ €๋Š” @benaadams ๋ฐ @jonnenauha ์™€ ํ•จ๊ป˜ ์žˆ์Šต๋‹ˆ๋‹ค ; ๋„ˆ๋ฌด ์ด๋ฅด๊ณ  Chrome๊ณผ Firefox๊ฐ€ ์ด๋ฏธ ๋‚ด๋ถ€์—์„œ JavaScript(V8 ๋“ฑ...)๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ด ์ƒˆ ๋ฒ„์ „์˜ ์–ธ์–ด๋ฅผ ํฌ๊ฒŒ ์ตœ์ ํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

:+1:

@erichlof ๊ธ€์Ž„์š”, ์ €๋Š” ์‚ฌ์‹ค ES6 ํด๋ž˜์Šค์™€ ๋ชจ๋“ˆ ์ง€์›์„ ๊ฐ€์žฅ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‚ด ์•ฑ์— AMD๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ž‘์—…ํ•˜๋Š” ์ฃผ์š” JS ํ”„๋กœ์ ํŠธ๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ "ํด๋ž˜์Šค"๊ฐ€ ์žˆ๋Š” ~10k ๋ผ์ธ์ด๊ณ  AMD๋Š” ์ƒ๋ช…์˜ ์€์ธ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ค‘ ๋ฐ ๋นŒ๋“œ ์ƒ์„ฑ ์‹œ ๋ชจ๋‘. ํฌ๊ฑฐ๋‚˜ ๋” ์ž‘์€ ํ”„๋กœ์ ํŠธ์—๋Š” ์ผ์ข…์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ๊ณผ ์˜์กดํ•˜๋Š” ๋Œ€์ƒ์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ฒŒ ๋˜๋ฉด ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด 25x <script> ํƒœ๊ทธ๋ฅผ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ฐฐ์น˜ํ• ์ง€ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๋‚จ๊ฒจ๋‘์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. three.js์™€ ๊ฐ™์€ ํŒŒ์ผ ์–‘์ด ๋งŽ์œผ๋ฉด ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ๋Š” ํ•˜๋‚˜์˜ ํฐ js ํŒŒ์ผ(์˜ˆ: three.js)์„ ๋นŒ๋“œํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ extras/helpers ํด๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์†Œ ์ œํ•œ์ ์ด๋ฉฐ ~๋ชจ๋“  ๊ฒƒ์„ ํƒœ์–‘ ์•„๋ž˜์—์„œ ์–ป์œผ๋ ค๋ฉด ~500kb(์ถ•์†Œ) ๋นŒ๋“œ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋Š ์‹œ์ ์—์„œ ๋‚˜๋Š” ์„ธ ๊ฐ€์ง€๊ฐ€ AMD ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ AMD๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๊ฐ์ง€ํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ window.THREE๋ฅผ ์„ ์–ธํ•˜๋Š” ๋Œ€์‹  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ž‘์€ ์ฝ”๋“œ ๋ธ”๋ก์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์„ ์‚ญ์ œํ•˜๊ณ  ์ฝ”์–ด ์™ธ๋ถ€์— ์›ํ•˜๋Š” ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ˆœ์„œ๋Œ€๋กœ ๋กœ๋“œํ•˜๋Š” ๋‹จ์ผ ์ž‘์—… ํŒŒ์ผ๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ๋งž์ถคํ˜• ๋นŒ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ˜„์žฌ ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šด ์ผ์ธ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์— "ํด๋ž˜์Šค"๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ object.prototype(3.js๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ)์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์‹ค์ƒ ๋™์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋™์˜ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ๋ฌผ๊ฑด์„ ์กฐํ•ฉํ•˜๊ณ  ๋ชฉ์ ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ์ฝ”๋“œ๋Š” ํ•ด๋‹น ๊ฐœ์ฒด์™€ ๊นจ๋—ํ•œ ์„ ์–ธ์  ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ ES6 ํด๋ž˜์Šค์™€ ๋ชจ๋“ˆ์ด ๋นŒ๋“œ๋ฅผ ์œ„ํ•œ ๋” ๋งŽ์€ ๊ตฌ์กฐ์™€ ๋ชจ๋“ˆ์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด three.js์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ์ด๋ฅด๋‹ค. ์•„์ง ๋ชจ๋“ˆ. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•˜๊ณ  babel ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ES5 ํ˜ธํ™˜ ๋นŒ๋“œ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์ƒ๊ฐ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์Šต๋‹ˆ๊นŒ. ์ด๊ฒƒ์€ ๊ฐœ๋ฐœ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ , ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ ๋นŒ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฉฐ, ๋””๋ฒ„๊น…๋„ ๋” ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋‚˜๋Š” ์ด ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

PS๋Š” three.js์— ๋Œ€ํ•œ ํ˜ธ์–ธ์žฅ๋‹ด์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ € ์ง€์›์ด ์ œ๊ณต๋˜๋ฉด three.js์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ES6์— ์ด์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋” ๋งŽ์€ ๊ฒƒ์„ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

three.js์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์€ WeakMap ๋ฐ WeakSet ์ž…๋‹ˆ๋‹ค. ๊ทธ ์˜๋ฏธ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ "์†Œ์œ ์ž"๊ฐ€ ๋” ์ด์ƒ ref๋ฅผ ๋ณด์œ ํ•˜์ง€ ์•Š์œผ๋ฉด GC๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ถ”์ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. three.js์—๋Š” ์ด์™€ ๊ฐ™์€ ์ƒํƒœ๊ฐ€ ๋งŽ์ด ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ฐจ์ด๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์†Œ์œ ๊ถŒ ์„ ์–ธ์— ๋Œ€ํ•œ C++์˜ ๊ณต์œ /์•ฝํ•œ ptrs์™€ ์•ฝ๊ฐ„ ์œ ์‚ฌํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ข‹์€ ํ›„๋ณด๋Š” https://github.com/mrdoob/three.js/blob/master/src/lights/SpotLight.js#L12 ์™€ ๊ฐ™์ด ์•ฝํ•œ ์ฐธ์กฐ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋Œ€์ƒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค. ํ˜„์žฅ์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ์ˆ˜์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ์ปฌ๋ ‰์…˜์— ์˜์กดํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ผ๋‹จ ๋Œ€์ƒ์ด ์žฅ๋ฉด์—์„œ ์ œ๊ฑฐ๋˜๋ฉด ์–ด์จŒ๋“  ์ด๋ฅผ ๋ฌดํšจํ™”ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฑ์— ์–ด๋–ค ์ด์ ์ด ์žˆ๋Š”์ง€ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์Šต๋‹ˆ๊นŒ? :)

์•ˆ๋…•ํ•˜์„ธ์š” @jonnenauha ์ž…๋‹ˆ๋‹ค .

์˜ˆ, '๊ฐ€์ ธ์˜ค๊ธฐ' ๋ฐ '๋‚ด๋ณด๋‚ด๊ธฐ'์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ํŠนํžˆ ๋ชจ๋“ˆ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๊ฒฝ์šฐ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด @coballast ์™€ @kumavis ๊ฐ€ THREE.js๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ ๋นŒ๋“œ์™€ ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํŠนํžˆ THREE.js์™€ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•์‹์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“ˆ๊ณผ ๊ฐ์ฒด ๋ฐ ํ•จ์ˆ˜์˜ ์žฌ์‚ฌ์šฉ์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ JavaScript์—์„œ ์ˆ˜์‹ญ ๋…„ ๋™์•ˆ ์‚ฌ์šฉ๋˜์–ด ์™”์œผ๋ฉฐ ์ด๋ฏธ ๋งŽ์€ ๊ฒฌ์ธ๋ ฅ. ๋‚˜๋Š” ๊ตฌ์‹์ผ์ง€ ๋ชจ๋ฅด์ง€๋งŒ JavaScript๋Š” ์ด๋ฏธ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด(์ฆ‰, ํ•จ์ˆ˜ = ๊ฐ์ฒด = ์ผ๊ธ‰ ์‹œ๋ฏผ)์ด์ง€๋งŒ '๊ณ ์ „์ ์ธ' ์–ธ์–ด๋Š” ์•„๋‹ˆ๋ผ๊ณ  Douglas Crockford์™€ ํ•จ๊ป˜ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ JavaScript๋กœ ๊ตฌ๋ถ€๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” (1990๋…„๋Œ€์˜ C/C++ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์œ ๋ž˜) ๋‹นํ™ฉํ–ˆ์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ’€๋ ค๊ณ  ํ•  ๋•Œ๋งˆ๋‹ค ์ ์  ๋” ๋™์˜ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ.

THREE.js์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ๋ณ€๊ฒฝ ๋Œ€์‹  ์ƒˆ๋กœ์šด SIMD ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์œผ๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. THREE์˜ ๋ชจ๋“  ์ˆ˜ํ•™ ์ฝ”๋“œ(ํŠนํžˆ Vector3 ๋ฐ Matrix4)๊ฐ€ ์ด๋กœ๋ถ€ํ„ฐ ํฐ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋น„๋””์˜ค ๋งํฌ์ž…๋‹ˆ๋‹ค(ํƒ€์ž„ ์ฝ”๋“œ์—์„œ 22:51 ํ™•์ธ).
https://youtu.be/CbMXkbqQBcQ?t=1371
์ด ๊ธฐ๋Šฅ์ด ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €์— ๋„์ž…๋˜๋ฉด ๋ชจ๋“  THREE.js ์‚ฌ์šฉ์ž๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ”„๋ ˆ์ž„ ์†๋„๊ฐ€ ๋ˆˆ์— ๋„๊ฒŒ ๋นจ๋ผ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์ด ํ˜ธ์–ธ์žฅ๋‹ด์ฒ˜๋Ÿผ ๋“ค๋ ธ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” THREE.js๊ฐ€ ์ง€๊ธˆ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ๋ถ€๋ถ„์„ ์‰ฝ๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€, ์–ด๋””์„œ ์™”๋Š”์ง€, ๋ฌด์—‡์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

@erichlof @jonnenauha es6 ํด๋ž˜์Šค๋Š” ์„คํƒ•์ผ ๋ฟ์ด๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์— ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ €๋Š” es6 ๊ธฐ๋Šฅ์ด ๊ณ„์‚ฐ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๋‹นํžˆ ๋‚™๊ด€ํ•ฉ๋‹ˆ๋‹ค. es6 ๋ชจ๋“ˆ์€ ํ•˜๋‚˜์˜ ํฐ ํŒŒ์ผ์ด ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์—”์ง„์— ์˜ํ•ด ์ตœ์ข…์ ์œผ๋กœ ๊ตฌํ˜„๋  ๋•Œ ๋กœ๋“œ ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HTTP/2๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  es6 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ browserify๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ es6 ๊ตฌ๋ฌธ์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ๋‚จ์šฉํ•˜๊ณ  ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์˜ˆ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์•‰์•„์„œ es6์ด ์—”์ง„์— ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ง€๊ธˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด ์—„์ฒญ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ธ‰ํ•ด ํ•˜๊ณ  ์ฆ‰์‹œ ์ž‘์—…์„ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์œ ๋‹‰์Šค ํŒŒ์ดํ”„์˜ ๋ฐœ๋ช…๊ฐ€์ด์ž ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ˜์‹ ๋ฐ˜์ธ Doug McIlroy๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.
"๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์šฐํšŒํ•ด์•ผ ํ•˜๊ณ  ์‚ฌ์šฉ์„ ๋งˆ์นœ ํ›„์— ์ผ๋ถ€๋ฅผ ๋ฒ„๋ฆด ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋”๋ผ๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž‘์—…์„ ๊ฐ€๋ณ๊ฒŒ ํ•˜๋ ค๋ฉด ๋ฏธ์ˆ™ํ•œ ๋„์›€๋ณด๋‹ค ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค."

es6์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ฐธ์—ฌํ•˜๊ณ  ๊ธฐ์—ฌํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค: https://github.com/5to6/5to6

์ „์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋‹ค๋ฅธ ํ•˜์œ„ ์ง‘ํ•ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์žฅ๋‹จ์ ์ด ๋ฌด์—‡์ธ์ง€ ๋…ผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „๋งˆ๋‹ค ์„ฑ๋Šฅ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•ฝํ•œ ๋งต์€ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ Œ๋”๋Ÿฌ์—์„œ ํฐ ์ด๋“์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ์•ฝํ•œ ํด๋ฆฌํ•„๊ณผ ๋งค์šฐ ์ ์€ ๋ธŒ๋ผ์šฐ์ € ์ง€์› ๋ฐ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ์„ฑ๋Šฅ ํŠน์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค. (์กฐ์‚ฌํ•œ์ง€ ์‹œ๊ฐ„์ด ์ข€ ์ง€๋‚˜์„œ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ)

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” es6๋งŒ ๋ณด์•„์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ams.js๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋ Œ๋”๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ์ˆ ๋กœ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ http://stackoverflow.com/questions/18427810/three-and-asmjs/18439786#18439786์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ต์ˆ™ํ•˜๊ณ  es6์ด ์•„์ง ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ต์ˆ™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์—ฌ์ž๋“ค์ด ์ฃผ๋กœ ๊ธฐ์—ฌํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

@gero3 ์ƒ๊ฐ์ง€๋„ ๋ชปํ•œ ์ข‹์€์ ๋“ค์ด

์œ„์—์„œ ์ œ๊ฐ€ ์ฃผ๋กœ ์ด์•ผ๊ธฐํ•œ ๊ฒƒ์€ ๊ธฐ์กด es5 ๊ธฐ๋Šฅ๊ณผ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ๋™์ผํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์„ฑ๋Šฅ์— ๋„ˆ๋ฌด ๋งŽ์€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉด์„œ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ:
์•„๋ฌด๋„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์„์ง€ ๋ชจ๋ฅด์ง€๋งŒ ๋‚˜๋Š” ๋งˆ์Œ์„ ๋ฐ”๊ฟจ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์—…์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ es6 ๋ชจ๋“ˆ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ˆ˜์—…์— ์ „์ ์œผ๋กœ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. JavaScript์˜ ๊ฐœ์ฒด ํ”„๋กœํ† ํƒ€์ž…์ด ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋†€๋ผ์šด ์ผ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ THREE.js(๋ฐ ๊ธฐํƒ€ ๋งŽ์€ ์ตœ์‹  OS ํ”„๋กœ์ ํŠธ)์—์„œ ์šฐ๋ฆฌ๋Š” ํ”„๋กœํ† ํƒ€์ž… ์ƒ์†์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ฉ‹์ง„ ๊ตฌ๋ฌธ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ดํ‚น ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

THREE.Object3D.call( this );

๊ทธ๋ฆฌ๊ณ 

THREE.Scene.prototype = Object.create( THREE.Object3D.prototype );

์•ˆ์ •์ ์ธ Chrome ๋ฐ Firefox์—์„œ ํด๋ž˜์Šค๊ฐ€ ์ง€์›๋˜๋Š” ์ฆ‰์‹œ ์ฝ”๋“œ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜Š

@mrdoob ํด๋ž˜์Šค๋Š” ํ˜„์žฌ ์•ˆ์ •์ ์ธ Chrome 42์—์„œ ์ง€์›๋˜๋ฉฐ Firefox 39๋Š” 6์›” FYI ์ถœ์‹œ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค ๐Ÿ˜Š

์š”์ฆ˜์€ iOS์˜ ์‚ฌํŒŒ๋ฆฌ๊ฐ€ ๋Œ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์•„์š”... ๐Ÿ˜ฃ

์ˆ˜์—…์€ ํ›Œ๋ฅญํ•˜๊ณ  ๋‹ค๋ฅธ ES7 ๊ธฐ๋Šฅ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ Chrome, Firefox, IE ๋ฐ Safari์™€ ๊ฐ™์€ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋กœ์Šค ์ปดํŒŒ์ผ๋Ÿฌ(babel.js)๋ฅผ ๋„์ž…ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

babel.js(babelify)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €ํ™” ๋ณ€ํ™˜์ด ์žˆ์œผ๋ฏ€๋กœ ๋‚ด ๋…ธ๋ ฅ๊ณผ ์ž˜ ๋งž์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ ํ˜ธ๊ธฐ์‹ฌ์—์„œ, ์ด๋“ค ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•œ ์ž‘์—…์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๊นŒ? :)

์šฐ๋ฆฌ๋Š” ์•„์ง ์†๋„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์•Œ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚ด ์ดํ•ด๋Š” ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค ES6์€ ๋Œ€๋ถ€๋ถ„ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ ํ”„๋กœ๋•์…˜์šฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฆ‰, ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ๋˜๋Š” ๋ชจ๋“ˆ์€ ์˜ค๋Š˜๋‚  ์ด๋Ÿฌํ•œ ํŽธ์˜๋ฅผ ์กฐ์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ด ๊ฒฐ์ •์—๋Š” ์„ฑ๋Šฅ์ด ๊ณ ๋ ค๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@erichlof imo์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์œ ์šฉํ•œ ๊ตฌํ˜„์€ ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ SIMD(https://github.com/tc39/ecmascript_simd)์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ํ˜œํƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

SIMD๋Š” ThreeJS์—์„œ ์–ด๋””์— ์ ํ•ฉํ• ๊นŒ์š”? ThreeJS๋Š” ์ด๋ฏธ ๋ชจ๋“  ์ค‘์š”ํ•œ ๊ณ„์‚ฐ์„ GPU๋กœ ์˜คํ”„๋กœ๋“œํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Vector ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์–ด๋Š ์ •๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ThreeJS์—์„œ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ์ˆ˜ํ•™์€ ๊ฑฐ์˜ ์—†์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„ ์ด๋Ÿฌํ•œ ๋ฒกํ„ฐ๊ฐ€ GPU๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

์ด์ „์— SSE2/SSE4 ํ™•์žฅ์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ์˜ ๊ฒฝํ—˜์— ๋น„์ถ”์–ด ๋ณผ ๋•Œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ด์ ์ด ์ผ์‹œ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์‹ค์ œ ์‚ฌ๋ก€๋Š” ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ์–ด๋ ˆ์ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์˜€์Šต๋‹ˆ๋‹ค. ์ž‘์—….

์•ˆ๋…•ํ•˜์„ธ์š” @buston๋‹˜ .
Matrix ์ž‘์—…์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๊นŒ? SIMD๋ฅผ ์ƒ๊ฐํ•  ๋•Œ 4 X 4 ํ–‰๋ ฌ ์—ฐ์‚ฐ์ด ๊ฐ€์žฅ ์ด์ต์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ ๋ชจ๋‘ ์•Œ๋‹ค์‹œํ”ผ, ํ–‰๋ ฌ์€ ์•ฑ์˜ ๋ณต์žก์„ฑ์— ๊ด€๊ณ„์—†์ด JavaScript/CPU ์ธก์—์„œ Three.js์˜ ๋ชจ๋“  ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ”„๋ ˆ์ž„์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Babylon.js ์‚ฌ์šฉ์ž๊ฐ€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด ๋ชจ๋“  ๊ฒƒ์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํžŒํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/BabylonJS/Babylon.js/blob/master/src/Math/babylon.math.js#L2030 -L2093

ํ˜•์‹์„ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹จ์ผ ํ–‰๋ ฌ ๋ฐฐ์ˆ˜๋Š” ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งคํŠธ๋ฆญ์Šค๊ฐ€ ํ•ญ์ƒ SIMD ํ˜•์‹์ธ ๊ฒฝ์šฐ ์ด์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ–‰๋ ฌ ๊ณฑ์…ˆ์€ ์žฌ์ •๋ ฌ ์ž‘์—…์ด ํ•„์š”ํ•œ ํ–‰๊ณผ ์—ด์„ ๊ณฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ์ด ์•„๋‹Œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

SIMD ์ตœ์ ํ™”์— ๋Œ€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋…ธ๋ ฅ(๋™์ข… ์ž‘์—…์ด ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ์–ด๋ ˆ์ด ์ œ์™ธ)์€ ๋…ธ๋ ฅํ•  ๊ฐ€์น˜๊ฐ€ ์—†์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋ฒค์น˜๋งˆํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ์ฝ”๋“œ๋Š” ๋””๋ฒ„๊ทธ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ์ „๋žต์€ ๋ชจ๋“  ๋ฒกํ„ฐ์™€ ํ–‰๋ ฌ์ด SIMD ํ˜ธํ™˜ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ๊ธฐ๋ณธ ํ‘œํ˜„์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ Quake 3์˜ ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ฏฟ์—ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด vec2 ๋ฐ vec3 ์œ ํ˜•์— ๋Œ€ํ•ด 4๊ฐœ์˜ ๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ, GPU์— ์—…๋กœ๋“œํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ด์ œ ์ถ”๊ฐ€ ๋ถ€๋™ ์†Œ์ˆ˜์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฌด์Šจ ๋ง์ธ์ง€ ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ†ต์ฐฐ๋ ฅ๊ณผ ์ „๋ฌธ ์ง€์‹์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์–ผ๋งˆ ์ „ SIMD.js ํ”„๋ ˆ์  ํ…Œ์ด์…˜์— ๊นŠ์€ ์ธ์ƒ์„ ๋ฐ›์€ ๊ฒƒ๊ณผ ๊ทธ๊ฒƒ์„ three.js์— ์ง‘์–ด๋„ฃ๊ณ  ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋ช‡ ๊ฐ€์ง€ ์„ฑ๋Šฅ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๊ณ  ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. three.js์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” Cannon.js ๋ฐ Oimo.js์™€ ๊ฐ™์€ ๋ฌผ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ SIMD์—์„œ ๋” ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

@bhouston Ahh

@erichlof ๊ด€์‹ฌ์ด https://github.com/Globegitter/three.js/tree/include-SIMD ์ง€์ ์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Vector3์„ SIMD๋กœ ๊ต์ฒดํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฌด๊ฑฐ์šด WIP์ด๊ณ  ๋‚ด ์‹œ๊ฐ„์ด ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ตœ์‹  Firefox๋ฅผ ์•ผ๊ฐ„์— ์‚ฌ์šฉํ•˜๋ฉด ํด๋ฆฌํ•„ ์—†์ด ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ๊ธฐ๋ณธ ๊ตฌํ˜„์€ ํด๋ฆฌํ•„์— ๋น„ํ•ด ๋ถ„๋ช…ํžˆ ~20๋ฐฐ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค: https://blog.mozilla.org/javascript/2015/03/10/state -of-simd-js-performance-in-firefox/).

@erichlof @jonnenauha es6 ํด๋ž˜์Šค๋Š” ์„คํƒ•์ผ ๋ฟ์ด๋ฉฐ ๋‚ด๋ถ€์ ์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์— ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ €๋Š” es6 ๊ธฐ๋Šฅ์ด ๊ณ„์‚ฐ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๋‹นํžˆ ๋‚™๊ด€ํ•ฉ๋‹ˆ๋‹ค.

JS ๊ฐ์ฒด์˜ (์ƒ๋‹นํžˆ ๋ณต์žกํ•œ) ๊ตฌํ˜„์—์„œ ๋ชจ๋“  JS ์—”์ง„์—๋Š” ์‹ค์ œ๋กœ ES6์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

es6 ๋ชจ๋“ˆ์€ ํ•˜๋‚˜์˜ ํฐ ํŒŒ์ผ์ด ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์—”์ง„์— ์˜ํ•ด ์ตœ์ข…์ ์œผ๋กœ ๊ตฌํ˜„๋  ๋•Œ ๋กœ๋“œ ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HTTP/2๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ์—ฌ์ „ํžˆ ์ „์ฒด ์•ฑ JS ์ˆ˜์ค€ ์••์ถ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์ค„์ด๊ณ  ์ง€์  ์žฌ์‚ฐ์„ ๋ณดํ˜ธํ•˜๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋กœ์ € ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ Three.js๋ฅผ ์ดํ•ดํ•˜๋„๋ก ํ•˜๋ฉด ES6์œผ๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์ „ํ™˜ํ•  ์ ์ ˆํ•œ ์‹œ์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งŽ์€ ์ถ”๊ฐ€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์ด๋Ÿฐ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•œ ๊ณณ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค...

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  [SIMD] ํ–‰๋ ฌ ๊ณฑ์…ˆ์€ ์žฌ์ •๋ ฌ ์ž‘์—…์ด ํ•„์š”ํ•œ ์—ด๊ณผ ํ–‰์„ ๊ณฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ ์ด ์•„๋‹Œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

SIMD ๋ช…๋ น์–ด ์„ธํŠธ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ–‰๋ ฌ ๊ณฑ์…ˆ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ข…์ข… "์Šค์นผ๋ผ ๋ฐ ๋”ํ•˜๊ธฐ ๊ณฑํ•˜๊ธฐ" ๋ช…๋ น์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

for i : 0..3:
    dst.col[i] = lhs.col[i] * rhs.co[i][0] // multiply vector by scalar
    for j : 1..3:
        dst.col[i] += lhs.col[i] * rhs_col[i][j] // multiply vector by scalar & add

ํ–‰๋ ฌ ๊ณฑ์…ˆ์€ ์‹ค์ œ๋กœ ์˜ค๋ฅธ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž์˜ ์—ด ๋ฒกํ„ฐ์— ๋ณ€ํ™˜์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋ณ€ํ™˜์€ ๋งŽ์€ ๋‚ด์ (์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํŽœ๊ณผ ์ข…์ด์— ์‚ฌ์šฉํ•˜๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฐฉ์‹)์œผ๋กœ ๋ณด๊ฑฐ๋‚˜ ๋Œ€์ƒ ๊ณต๊ฐ„์˜ ์ถ• ๋ฒกํ„ฐ = ์™ผ์ชฝ์˜ ์—ด ๋ฒกํ„ฐ์˜ ์„ ํ˜• ์กฐํ•ฉ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”ผ์—ฐ์‚ฐ์ž.

@Globegitter ์™€์šฐ ๋ฉ‹์ง„ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค! ์ƒˆ ๋ถ„๊ธฐ๋„ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ๋„๋ก Firefox Nightly๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค!

@Globegitter ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฏฟ์„ ๋•Œ ์•ž์žฅ์„œ์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ํ† ๋ก ๋ณด๋‹ค ๋” ๋นจ๋ฆฌ ๋‹ค์–‘ํ•œ ๊ด€์ ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌํ˜„์ด ํด๋ฆฌํ•„์— ๋น„ํ•ด ๋ถ„๋ช…ํžˆ ~20๋ฐฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋˜ํ•œ ํด๋ฆฌํ•„์ด SIMD๊ฐ€ ์•„๋‹Œ ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ ์–ผ๋งˆ๋‚˜ ๋Š๋ฆฐ์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ƒˆ ๋ถ„๊ธฐ๋„ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ๋„๋ก Firefox Nightly๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค!

about:flags ์—์„œ ์‹คํ—˜ ๋ฐ asm.js๋ฅผ ์ผœ์„œ Edge์—์„œ ์‹œ๋„ํ•  ์ˆ˜๋„ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .

@Globegitter ํŽธ์ง‘์ž๊ฐ€ ๊ณต๋ฐฑ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ •๋ง ๋ถˆ์พŒํ•œ diff๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ ๊ฐ™์•„์š”: https://github.com/Globegitter/three.js/commit/d835ca3a22eed4ed4603534773ae55c29d5a8026

SIMD ์œ ํ˜•์„ ์‚ฌ์ด๋“œ์นด๋กœ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

https://github.com/Globegitter/three.js/commit/8ed9c1d351a3b0587a1f05051922d271d79f642d

Vector3 x, y, z๋ฅผ getter/setter๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  float32x4๋งŒ ์ €์žฅํ•˜๋„๋ก ์ œ์•ˆํ•ด๋„ ๋ ๊นŒ์š”? ๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋” ์ ์€ ๋ณ€๊ฒฝ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์†์„ฑ์„ ์ •์˜ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ mrdoob์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/blob/5c7e0df9b100ba40cdcaaf530196290e16c34858/examples/js/wip/proxys/ProxyVector4.js#L18

์ˆ˜ํ•™ ์œ ํ˜• ๋’ค์˜ ๊ธฐ๋ณธ ์ €์žฅ ์œ ํ˜•์œผ๋กœ SIMD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ถ”๊ฐ€ ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ฒกํ„ฐ/ํ–‰๋ ฌ ์—ฐ์‚ฐ์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ์€ Bullet Physics SSE ์ˆ˜ํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

https://code.google.com/p/bullet/source/browse/trunk/src/vectormath/sse/

@bhouston , ์ด๋Ÿฌํ•œ ๋ฉ”๋ชจ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €๋Š” ์ด์ „์— 3๊ณผ SIMD๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ช‡ ์‹œ๊ฐ„ ์•ˆ์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋ฐ”๋กœ ๋“ค์–ด๊ฐ€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(์šฐ๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์„ธ ๊ฐ€์ง€๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ์˜ ์ด ํ”ผ๋“œ๋ฐฑ์€ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ˆ, ๋‚ด ํŽธ์ง‘๊ธฐ์—์„œ ๊ทธ๊ฒƒ์„ ๊บผ์•ผํ•ฉ๋‹ˆ๋‹ค.

@tschw ํ–‰๋ ฌ/๋ฒกํ„ฐ ์ˆ˜ํ•™์— ๋Œ€ํ•œ ๋ฉ”๋ชจ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๊ทธ๊ฒŒ ๋” ๋‚ซ๋‹ค๋Š” ๋ง์ด ๋งž์Šต๋‹ˆ๋‹ค.

@Globegitter ๋‹ค์Œ์€ ๊ฐœ์ฒด์˜ ํ”„๋กœํ† ํƒ€์ž…์— ๋Œ€ํ•œ setter/getter์˜ ๋” ๋‚˜์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. https://github.com/mrdoob/three.js/blob/master/src/core/Object3D.js#L83

ES2015 ์ž‘์—…์— ๋ช‡ ์„ผํŠธ(์ฃผ๋กœ ๋…ธ๋“œ์—์„œ)

  • Javascript ์—”์ง„(์˜ˆ: V8)์ด ES6 ๊ธฐ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • let x = 1, y = 2 ์™€ ๊ฐ™์€ ๋‚ด ๊ฒฝํ—˜ ์ฝ”๋“œ์—์„œ v8์ด ๊ฒฐ๊ตญ ์ง€์›๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ v8์„ ์ตœ์ ํ™” ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.
  • ES5๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” ES6 ์ฝ”๋“œ๋ณด๋‹ค ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งต๊ณผ ์„ธํŠธ๋Š” ์„ฑ๋Šฅ์˜ ์Šน๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • ์ˆ˜์—…์ด ์ข‹๋‹ค
  • Babel์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์›Œํฌํ”Œ๋กœ์— ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ES6์„ ๊ตฌ๋ฌธ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋…ธ๋ ฅํ•  ๊ฐ€์น˜๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋…„ ์ „์— ๋‚˜๋Š” ๋ช‡๋ช‡ Three.js ํ•จ์ˆ˜(4x4 ํ–‰๋ ฌ ๊ณฑ์…ˆ, Vector4 ๋“ฑ)๋ฅผ SIMD๋กœ ๋ณ€ํ™˜ํ–ˆ๊ณ  ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์‹œ์ ์—์„œ๋Š” ๋ถ๋งˆํฌ๋กœ ์ž‘๋™ํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ตœ์‹  Three ๋ฒ„์ „์œผ๋กœ ์ž‘์—…ํ•˜๋ ค๋ฉด ์ƒˆ๋กœ ๊ณ ์นจ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Firefox Nightly ๋Š” ๊ธฐ๋ณธ SIMD๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • --js-flags="--harmony-simd" ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๋Š” Chrome์€ SIMD์˜ JS ํด๋ฆฌํ•„์„ ์ง€์›ํ•˜๋ฏ€๋กœ ๋น„-simd ๋ฒ„์ „๋ณด๋‹ค ๋Š๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

350% ์„ฑ๋Šฅ ํ–ฅ์ƒ์€ ๊ฑฐ์ง“๋ง์ž…๋‹ˆ๋‹ค :)

๋˜ํ•œ Vector3์˜ ์ผ๋ถ€๋ฅผ ์ด์‹ํ–ˆ์ง€๋งŒ ์ฃผ์„์ด ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/DVLP/three.turbo.js

ํŽธ์ง‘: ๋‚ด ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ ์–ด๋”˜๊ฐ€์— ์ตœ์‹  ๋ฒ„์ „์ด ์žˆ์œผ๋ฏ€๋กœ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณง ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ์‹œ์ฒญ ๋ฐ ์‘์‹œ +1.
์„ฑ๋Šฅ์„ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ์ด ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์„ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ์ด ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜๋‚˜๋Š” Vector3 ๋ชจ๋“ˆ ๋‚ด์— ๋‘ ๊ฐœ์˜ Vector3 ์ •์˜๊ฐ€ ์žˆ๊ณ  SIMD๊ฐ€ ๊ธฐ๋ณธ์ธ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ถ€๋กœ ํ•˜๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‹ค์šด๋กœ๋“œ ์ธก๋ฉด์„ ์ฆ๊ฐ€์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. SIMD๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ „ํ™˜๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•จ์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ SIMD๋Š” ์ˆ˜ํ•™ ํ•จ์ˆ˜์˜ ์ž‘์€ ํ•˜์œ„ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ€์žฅ ์ค‘์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋กœ ๋ณผ ๋•Œ ์ด๊ฒƒ์ด ์ ์—ˆ๋‹ค๋ฉด ์ง€๊ธˆ ๋„ฃ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ SIMD๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ๋Š๋ ค์ง€์ง€ ์•Š๋„๋ก ์„ ํƒ ์‚ฌํ•ญ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Matrix4 ์˜ multiplyMatrices() SIMD ๋ฒ„์ „์€ ํ˜„์žฌ ๋ณต์žกํ•œ ์žฅ๋ฉด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/blob/dev/src/math/Matrix4.js#L383 -L419

screen shot 2016-08-30 at 20 46 29

@mrdoob ์—ฌ๊ธฐ์—์„œ ๋ณด์„ธ์š”. ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/DVLP/three.turbo.js/blob/master/src/three.turbo.js

๋ถ๋งˆํฌ๋กœ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”:
javascript:(function(){var script=document.createElement('script');script.src='//rawgit.com/DVLP/three.turbo.js/master/src/three.turbo.js';document.head.appendChild(script);})()

์ฑ…์ž„์žˆ๋Š” ์ฝ”๋“œ ์กฐ๊ฐ

THREE.Matrix4.prototype.multiplyMatrices = function(a, b) {
    var ae = a.elements,
      be = b.elements,
      tb = this.elements,
      arr1 = SIMD.Float32x4.load(ae, 0),
      arr3 = SIMD.Float32x4.load(ae, 4),
      arr5 = SIMD.Float32x4.load(ae, 8),
      arr7 = SIMD.Float32x4.load(ae, 12),
      arr2,
      arr4,
      arr6,
      arr8,
      res;
    // calculated version
        for (var i = 0; i < 4; i++) {
            arr2 = SIMD.Float32x4.splat(be[i * 4]);
            arr4 = SIMD.Float32x4.splat(be[i * 4 + 1]);
            arr6 = SIMD.Float32x4.splat(be[i * 4 + 2]);
            arr8 = SIMD.Float32x4.splat(be[i * 4 + 3]);
            res = SIMD.Float32x4.add(SIMD.Float32x4.add(SIMD.Float32x4.mul(arr1, arr2), SIMD.Float32x4.mul(arr3, arr4)), SIMD.Float32x4.add(SIMD.Float32x4.mul(arr5, arr6), SIMD.Float32x4.mul(arr7, arr8)));
            SIMD.Float32x4.store(tb, i * 4, res);
          }
}

๋ฐ˜๋…„ ์ „์— ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ–ˆ์„ ๋•Œ "for" ๋ฃจํ”„๊ฐ€ ํŽผ์ณ์ง„ ๋ฒ„์ „์ด ์ตœ์†Œํ•œ์œผ๋กœ ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด ์ž‘์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฃจํ”„๊ฐ€ ์ฃผ์„ ์ฒ˜๋ฆฌ๋˜๊ณ  ํ•˜๋“œ ์ฝ”๋“œ๋œ ๋ฒ„์ „์ด ์กด์žฌํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

"์—ญ" ๋ถ„๊ธฐ์— ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/DVLP/three.turbo.js/blob/inverse/src/three.turbo.js

์„ฑ๋Šฅ ์ฐจ์ด๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

https://jsfiddle.net/tk6zx5dm/6/

๋•Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€. Nightly์—์„œ ๊ณ„์‚ฐ ์ˆ˜๊ฐ€ ์ ์œผ๋ฉด(<1000) ๊ฒฐ๊ณผ๊ฐ€ 3๋ฐฐ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค. ๊ณ„์‚ฐ ์ˆ˜๊ฐ€ 10000๋ณด๋‹ค ํฌ๋ฉด ์†๋„๊ฐ€ ~40% ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

--js-flags="--harmony-simd" ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋œ Chrome์—๋Š” ์‹ค์ œ SIMD๊ฐ€ ์—†์ง€๋งŒ JavaScript ํด๋ฆฌํ•„์ด ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ๋กœ์„œ๋Š” ์†๋„๊ฐ€ ๋ช‡ ๋ฐฐ๋‚˜ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธํ•˜๊ธฐ์— ์ข‹์€ ๊ณณ์€ Crosswalk ํ”„๋กœ์ ํŠธ(Chromium ๊ธฐ๋ฐ˜)์ž…๋‹ˆ๋‹ค. Android์šฉ ์‹ค์ œ SIMD๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด JSFiddle์˜ ์ฝ”๋“œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ์‹คํ—˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์˜ˆ์ œ ํŽ˜์ด์ง€์— simd polyfill์„ ํฌํ•จํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์‹œํ—˜ํ•ด๋ณด๊ธฐ์— ์กฐ๊ธˆ ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ฝ˜์†”์— ํ•œ ์ค„์„ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜ ๋„ค์ดํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ํ™”๋ฉด์— ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค(ํด๋ฆฌํ•„์€ ์•„๋งˆ๋„ ํ™œ์„ฑํ™”๋˜์—ˆ๋‹ค๋Š” ํžŒํŠธ๋ฅผ ๋‚จ๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

Chrome์ด --js-flags="--harmony-simd" js simd polyfill์„ ๋กœ๋“œํ•˜๋Š” ์ด์œ ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ ์ด๋ฏธ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค! ์ด๊ฒƒ์˜ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ๊ทธ๋“ค์€ ์ ์ฐจ์ ์œผ๋กœ ๋ฌผ๊ฑด์„ ๋„ฃ๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ์—์„œ ์‹ค์ œ๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€, ์ข‹์€ ๋งํฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋””์„œ ์ฝ์—ˆ์Šต๋‹ˆ๊นŒ? https://www.chromestatus.com/features/5757910432874496 ์—์„œ "๊ฐœ๋ฐœ ์ค‘"์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์‹ค์ œ ์ฃผ์ œ๋กœ: ์„ฑ๋Šฅ์ด ๋ช‡ ๊ฐ€์ง€ ๊ฐœ์ฒด์—์„œ ๋งŽ์€ ๊ฐœ์ฒด์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋ชจ๋“  ๊ณณ์— ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ํ•ญ๋ชฉ์„ three.js์— ๋„ฃ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต๋‹ค๊ณ  ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ตฌํ˜„์ด 1~N๊ฐœ์˜ ๊ฐœ์ฒด๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธฐ๋Šฅ์„ ๊ฐ์ง€ํ•˜๊ณ  ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ณณ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ impls๊ฐ€ ์ผ๊ด€์„ฑ์ด ์—†์œผ๋ฉด ์ „์ฒด๊ฐ€ ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ท€์ฐฎ๊ฒŒ ์ž‘์—…ํ•˜๊ณ  ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋” ์ƒ์‚ฐ์ ์ธ ๋ฐ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

three๋Š” ์„ฑ์ˆ™ํ•ด์ง€๋ฉด ์ด์— ๋›ฐ์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด three.js ์ง€์›์ด ๋ธŒ๋ผ์šฐ์ € ๊ตฌํ˜„์„ ๋” ์ž˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ธ๋ฆฌ์–ผ ์—”์ง„ ๋ฐ ๊ธฐํƒ€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜/์ˆ˜ํ•™ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๊ณต๊ธ‰์—…์ฒด์˜ ์›๋™๋ ฅ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š”์ง€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์–ด์š”.

Chrome์ด --js-flags="--harmony-simd"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ js simd ํด๋ฆฌํ•„์„ ๋กœ๋“œํ•˜๋Š” ์ด์œ ๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๊ด€ํ–‰์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์ด WASM์ด ์ฒ˜์Œ์— ๋ธŒ๋ผ์šฐ์ €์— ๋„์ž…๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋ฐฑ๋ถ€์žฅ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋ถˆ๊ฐ€ํ”ผ์„ฑ์„ ๋’ท๋ฐ›์นจํ•˜๋Š” ๋ชจ๋“  ์ฃผ์žฅ. ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ์˜ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง. ๋”ฐ๋ผ์„œ ๊ทธ๋ฆผ์ž ๋งต ๋ฐ€๋„๋„ ์นด๋ฉ”๋ผ ๊ฑฐ๋ฆฌ ๋“ฑ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ €๋Š” ์ด๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ํƒ€์‚ฌ ๋„๊ตฌ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๋Š” ํ•ฉ์˜๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ž ์žฌ์˜์‹์€ ์•„๋‹ˆ๋”๋ผ๋„ ๊ทธ ์ ์„ ์˜์‹ ์†์— ๊ฐ„์งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์•„๋งˆ๋„ Pollyfill์„ ํ™•์ธํ•˜๊ณ  SIMD๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์ง€๋งŒ ๋‹ค์‹œ FPS๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ํ™œ์„ฑํ™” ๋˜๋Š” ๋น„ํ™œ์„ฑํ™”ํ•  ํ•ญ๋ชฉ์˜ ์šฐ์„  ์ˆœ์œ„๋Š” ์‚ฌ์šฉ์ž/์•ฑ๋ณ„ ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๋“ฃ๊ธฐ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ๋” ๋น ๋ฅธ GL์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋ฅผ ๋Šฅ๊ฐ€ํ•  ์ค€๋น„๋ฅผ ํ•ฉ์‹œ๋‹ค.

SIMD์— ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” Nightly์—์„œ SIMD๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์ ์„ ๋ฌด์‹œํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Chrome์˜ ์„ฑ๋Šฅ์ด ๋งค์šฐ ๊ถ๊ธˆํ•˜์ง€๋งŒ ์‹ค์ œ SIMD๊ฐ€ ์žˆ๋Š” ์ตœ์‹  Chromium์€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค. http://peterjensen.github.io/idf2014-simd/
๊ทธ๊ฒƒ์€ ๋‚ก์•˜๋‹ค.

์—…๋ฐ์ดํŠธ:
์ด์ œ SIMD๋Š” Edge์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. about:flags ๋กœ ์ด๋™ํ•˜์—ฌ "์‹คํ—˜์  JavaScript ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”"(Edge ๋‹ค์‹œ ์‹œ์ž‘)๋ฅผ ์„ ํƒํ•˜์—ฌ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
์ด๊ฒƒ์ด ์‹ค์ œ SIMD์ธ์ง€ ํด๋ฆฌํ•„์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํ…Œ์ŠคํŠธ๋Š” ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ~40% ๋” ๋Š๋ฆฐ SIMD๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค./ https://jsfiddle.net/tk6zx5dm/6/

Matrix4 ๊ฐœ์ฒด์— ์บ์‹œ๋œ SIMD ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ํ…Œ์ŠคํŠธ ๋ณ€ํ˜•, ์ด๊ฒƒ์ด ์œ ์šฉํ• ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ
https://jsfiddle.net/tk6zx5dm/15/
ํฅ๋ฏธ๋กœ์šด ์ ์€ ์บ์‹œ๋œ SIMD ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ polyfill SIMD(...? ์ด์ƒํ•œ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Chrome์—์„œ๋„ _๋•Œ๋•Œ๋กœ_ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

THREE.Matrix4.prototype.multiplyMatrices = function(a, b) {
  var i = 4;
  while(i--) {
    SIMD.Float32x4.store(this.elements, i * 4, 
      SIMD.Float32x4.add(
        SIMD.Float32x4.add(
          SIMD.Float32x4.mul(
            a.cacheSIMDRow1,
            b.cacheSIMDSplat[i * 4]
          ),
          SIMD.Float32x4.mul(
            a.cacheSIMDRow2,
            b.cacheSIMDSplat[i * 4 + 1]
          )
        ),
        SIMD.Float32x4.add(
          SIMD.Float32x4.mul(
            a.cacheSIMDRow3,
            b.cacheSIMDSplat[i * 4 + 2]
          ), 
          SIMD.Float32x4.mul(
            a.cacheSIMDRow4,
            b.cacheSIMDSplat[i * 4 + 3]
          )
        )
      )
    );
  }
}

์บ์‹ฑ - ๊ฒฐ๊ตญ์—๋Š” ์ „์ฒด ์†”๋ฃจ์…˜์„ ๋Š๋ฆฌ๊ฒŒ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  updateMatrix()์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

THREE.Matrix4.prototype.updateSIMDCache = function() {
  this.cacheSIMDRow1 = SIMD.Float32x4.load(this.elements, 0);
  this.cacheSIMDRow2 = SIMD.Float32x4.load(this.elements, 4);
  this.cacheSIMDRow3 = SIMD.Float32x4.load(this.elements, 8);
  this.cacheSIMDRow4 = SIMD.Float32x4.load(this.elements, 12);

  if(!this.cacheSIMDSplat) {
    this.cacheSIMDSplat = [];
  }
  for(var i = 0; i < 16; i++) {
    this.cacheSIMDSplat.push(SIMD.Float32x4.splat(this.elements[i]));
  }
};

ES6 ์Šคํƒ€์ผ์ด ์žฌ๊ฒ€ํ† ๋˜์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋Š” ์—ฐ๊ฒฐ๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋Š” ๋ผ์ด๋ธŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ babel๋„ ์‹คํ–‰ํ•˜๊ณ  ์ ์ ˆํ•œ ๊ณณ์—์„œ ES6 ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

์ „์ฒด ์ฝ”๋“œ๋Š” ์—ฐ๊ฒฐ๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋Š” ๋ผ์ด๋ธŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ babel๋„ ์‹คํ–‰ํ•˜๊ณ  ์ ์ ˆํ•œ ๊ณณ์—์„œ ES6 ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

์ฃผ๋กœ babel ์ƒ์„ฑ ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ ์˜ํ–ฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ let/const ๋Œ€์‹  var๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ V8์ด ๋” ๋น ๋ฅธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ €๋Š” ์ตœ๊ทผ์— "์ปดํŒฉํŠธํ•˜๊ณ  ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ES5๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋Š” ES ๊ธฐ๋Šฅ์œผ๋กœ ์ œํ•œ๋˜๋Š”" bublรฉ ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋งํฌ์˜ ํ•˜๋‹จ์€ var ๋Œ€ let in ๋ฃจํ”„๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
http://stackoverflow.com/questions/21467642/is-there-a-performance-difference-between-let-and-var
๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๊ฐ€ ์—†๋Š” ์†”๋ฃจ์…˜์ด ๋ธŒ๋ผ์šฐ์ €์— ๋„๋‹ฌํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 'await'๋Š” ๋น ๋ฅผ์ˆ˜๋ก ์ข‹์ง€๋งŒ ์ง€๊ธˆ์€ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์ž‘์„ฑ๋˜๊ณ  ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋”์ฐํ•˜๊ฒŒ ์†์ƒ๋จ). ํ•˜์ง€๋งŒ Chrome์—์„œ ์ž‘๋™ํ•œ๋‹ค๋ฉด?! ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ? ๋‚˜๋Š” '์ผ€์ดํฌ๋ฅผ ๋จน๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ํฌ๋กฌ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋ผ'๊ณ  ๋งํ•œ๋‹ค. (๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ํ‘œํ˜„).
'let'์€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋” ๋‚˜์€ ๊ฒƒ์œผ๋กœ ์ž…์ฆ๋œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋ฒ”์œ„ ์ง€์ •์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด 'var'๊ฐ€ ํ˜ธ์ด์ŠคํŠธ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ 'let'์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ƒํ™ฉ์—์„œ๋„ 'let'์ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋” ์ž‘๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” ์†์œผ๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๋น ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JSPerf๊ฐ€ ๋‹ค์šด๋œ ๊ฒƒ์€ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๊ตฌ๊ธ€๋ณด๋‹ค ๋” ์ž์ฃผ ๋ฐฉ๋ฌธํ•˜๊ณค ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํŽธ์ง‘: JSPerf.com์€ ๋‹ค์šด๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค! 1๋…„ ๋™์•ˆ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜์›ํžˆ ์ฃฝ์€ ์ค„ ์•Œ์•˜์–ด
let ๋‚ด Chrome Canary์—์„œ var ๋ณด๋‹ค 3๋ฐฐ ๋Š๋ฆผ: https://jsperf.com/let-vs-var-performance/14
Firefox์™€ Edge์—์„œ๋Š” ์†๋„ ์ฐจ์ด๊ฐ€ ์—†์ง€๋งŒ Chrome์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๋ˆ„๊ตฐ๊ฐ€ Safari์—์„œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ˆ˜์—…์€ ํ›Œ๋ฅญํ•˜๊ณ  ํ˜„๋Œ€์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ์ด๊ฒƒ์ด ์ด๋ฏธ ์ผ์ •์— ์žˆ๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ Rubinhuang9239 ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด Chrome Canary์—์„œ var๋ณด๋‹ค 3๋ฐฐ ๋” ๋Š๋ฆฝ๋‹ˆ๋‹ค: https://jsperf.com/let-vs-var-performance/14

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Chrome 66, Firefox 59 ๋ฐ Edge 42์—์„œ let ๋ฐ const ๊ฐ€ ์ด์ œ var ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋น ๋ฆ…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ์ „ํ™˜์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ ๊ฝค ์˜ค๋ž˜ ์ „์— ์ˆ˜ํ–‰๋œ ๋กค์—…์˜ ์ฑ„ํƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์˜์›…์ด ThreeJS์—์„œ ๋ช‡ ์‹œ๊ฐ„ ๋งŒ์— ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธ€์Ž„, ์ˆ˜์—…์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋™์œผ๋กœ ํ–ˆ๋‹ค๋ฉด ์•„๋งˆ 8์‹œ๊ฐ„ ์ •๋„ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์†Œ๊ทœ๋ชจ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์ˆ˜ํ•™ ์ˆ˜์—…์„ ๋จผ์ € ๋ณ€ํ™˜ํ•˜๊ณ  ํ™๋ณด๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋กœ ๋„˜์–ด๊ฐ€์‹ญ์‹œ์˜ค.

@looeee 1๋…„์ด ๋„˜์—ˆ์œผ๋ฏ€๋กœ ES6์ด ์„ฑ๋Šฅ์„ ๋”ฐ๋ผ์žก์„ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์€ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

2019๋…„์€ ๋งˆ์นจ๋‚ด ์˜ˆ์ œ/๋ฌธ์„œ์—์„œ ์ผ๋ถ€ ES6 ์ฝ”๋“œ๋ฅผ ์ฑ„ํƒํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ํ•ด์ž…๋‹ˆ๋‹ค. @mrdoob? ๐Ÿ˜„

ES6์€ ๊ฝค ์˜ค๋žซ๋™์•ˆ ํ‘œ์ค€์ด์—ˆ์œผ๋ฉฐ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๋Š” ES6์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ๋˜ํ•œ #16220์—์„œ ๋…ผ์˜ํ•œ ๋Œ€๋กœ ์˜ˆ์ œ์—์„œ IE11 ์ง€์›์„ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐœ๋ฐœ์ž๊ฐ€ IE11์„ ์‚ฌ์šฉํ•˜์—ฌ three.js ์˜ˆ์ œ๋ฅผ ๋ณด๋‚˜์š”? ๐Ÿ˜‚

์ƒˆ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ํด๋ž˜์Šค์™€ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด์ด๋ฉฐ ํ˜„์žฌ ๊ธฐ๋ณธ const/let์„ ์žŠ์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ๊ณ„๋ณ„๋กœ. ์ง€๊ธˆ์€ three.module.js ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์˜ˆ์ œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹จ๊ณ„๋ณ„๋กœ. ์ง€๊ธˆ์€ three.module.js๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์˜ˆ์ œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋‹จ๊ณ„๋Š” ์ž ์‹œ ๋™์•ˆ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ณต์‹์ ์œผ๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๋‘ ๋ช…์˜ ํ›„๋ณด์ž:

  1. const/let
  2. ํด๋ž˜์Šค

ํด๋ž˜์Šค๋Š” ์ด๋ฏธ ์ƒ์ž ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ์—์„œ ์–ผ๋งˆ ๋™์•ˆ ์‚ฌ์šฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์— ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๋™์‹œ์— ๋‘˜ ๋‹ค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ: #11552, #18863

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๋Š” ์˜ˆ์ œ์— ์˜ํ•ด ํ™•์žฅ๋œ ๊ฒฝ์šฐ ์˜ˆ์ œ๋„ ๋ณ€ํ™˜๋  ๋•Œ๊นŒ์ง€ ES6 ํด๋ž˜์Šค๋กœ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ examples/js ์ด ์‚ฌ๋ผ์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? modularize ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค๋ฉด examples/js ํŒŒ์ผ์„ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ๋™์‹œ์— ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด examples/js ๋Š” ์–ด์จŒ๋“  ๋ฉ‹์ง„ ๋ชจ๋“  ์ดˆ๊ณผ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ธฐ๋ณธ src/... ๋˜๋ฉด ๋น„์œจ์ด ์ดˆ๊ณผ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ '์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” x, y, z์˜ ์˜ˆ์ œ/์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ?'๋ผ๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” three.js์˜ ๋Œ€๋‹ต์ด ๋Œ€๋ถ€๋ถ„ ์˜ˆ์ด์ง€๋งŒ ์›น ์‚ฌ์ดํŠธ ๋‚ด์˜ ๊ต์œก ์ž๋ฃŒ๋ผ๊ณ  ์ถ”์ธกํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. examples/js ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ์‹œ์ ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. examples/js ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฐธ์กฐ/์‚ฌ์šฉ๋˜๋Š”์ง€ ์ œ๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ–ˆ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๐Ÿค” ์•Œ๋ ค์ฃผ์„ธ์š”.

examples/js ๋ฅผ ์›น ์‚ฌ์ดํŠธ/๊ต์œก์šฉ์œผ๋กœ๋งŒ ๋‚จ๊ฒจ๋‘๋ฉด ํ•ด๋‹น ํด๋”๊ฐ€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์Šคํฌ๋ฆฝํŠธ/์ปจํ…์ธ /ํ”„๋กœ์ ํŠธ/๊ธฐํƒ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์š”์ ์˜ ์ผ๋ถ€๋ฅผ ๋†“์น˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๊ณต์œ ํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€๋งŒ ๊ทธ ์ˆ˜๊ฐ€ ๋‘ ๋ฐฐ๋กœ ์ค„์–ด๋“ค๊ณ  ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ €๊ฒƒ.

๋‚˜๋Š” ํƒˆ์„ ํ•œ๋‹ค.

์˜ˆ์ œ๋„ ๋ณ€ํ™˜๋  ๋•Œ๊นŒ์ง€.

๋‚˜๋Š” ์šฐ๋ฆฌ์˜ ์ฐจ์„ ์ฑ…์œผ๋กœ ์ด ์†Œ๋ฆฌ๋ฅผ ์ข‹์•„ํ•œ๋‹ค.

@DefinitelyMaybe ์šฐ๋ฆฌ๋Š” examples/js ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ ์ฃผ๋ชฉํ• ๋งŒํ•œ ๋‘ ๊ฐœ์˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • examples/js/*
  • examples/jsm/*

์ฒซ ๋ฒˆ์งธ๋Š” ๋ ˆ๊ฑฐ์‹œ ํŒŒ์ผ์„ ํฌํ•จํ•˜๊ณ  ํ›„์ž๋Š” ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ํ•ด๋‹น ํŒŒ์ผ์—์„œ ์ƒ์„ฑ๋œ ES ๋ชจ๋“ˆ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ์ฒซ ๋ฒˆ์งธ๋ฅผ ์ œ๊ฑฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋Š” ํ˜„์žฌ ES ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€ examples/js ์žˆ๋Š” ํŒŒ์ผ์€ ES ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๋Š” src/ ํŒŒ์ผ์„ ํ™•์žฅํ•˜๊ณ  ES ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋Š” ES ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ์ฐจ๋‹จ ์ข…์†์„ฑ์ž…๋‹ˆ๋‹ค.

์•„, ์ด์ „ ๋Œ“๊ธ€์ด ํ—ท๊ฐˆ๋ ธ๋„ค์š”

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ examples/js๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์ œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

moduleize.js๋Š” ๋‚˜๋ฅผ ์—ฌ๊ธฐ๋กœ ๋ฐ๋ ค์˜จ ์ดˆ๊ธฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ๊ฐ๋‚˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜๊ธฐ . ์—ฌ๊ธฐ์—์„œ ES6 ์ˆ˜์—…์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋Œ“๊ธ€์„ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ examples/js ๊ฐ€ ์–ด๋–ค ์‹์œผ๋กœ๋“  src ๋ฅผ ํ™•์žฅํ•˜๋ฉด ๋‘˜ ๋‹ค ๋™์‹œ์— ES6 ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋˜๋Š”...
ํด๋ž˜์Šค/es6์„ ์ƒ์„ฑํ•  ๋•Œ๊นŒ์ง€ ๋ชจ๋“ˆํ™” ์ž‘์—…์„ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์˜ˆ์ œ๋กœ ํ™•์žฅ๋œ ๊ฒฝ์šฐ ES6 ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ์—์„œ ํ™•์žฅ๋˜์ง€ ์•Š์€ ์ฝ”์–ด์— ์—ฌ์ „ํžˆ ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ž˜ ๋“ค๋ฆฐ๋‹ค.

@Mugen87 ES ํด๋ž˜์Šค ๋ณ€๊ฒฝ์„ ๋ฐฉํ•ดํ•˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด

์˜ˆ์ œ์—์„œ ํ™•์žฅ๋˜์ง€ ์•Š์€ ์ฝ”์–ด์— ์—ฌ์ „ํžˆ ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

์˜ˆ์ œ์—์„œ ํ™•์žฅ๋˜์ง€ ์•Š์€ ์Šคํฌ๋ฆฝํŠธ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค .

ํŽธ์ง‘: ๋ชฉ๋ก์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

์ฐจ๋‹จ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„น์…˜์ž…๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/blob/6865b8e6367d0ce07acbacfae6663c4cce3ac21e/examples/js/loaders/ColladaLoader.js#L6 -L12

https://github.com/mrdoob/three.js/blob/6865b8e6367d0ce07acbacfae6663c4cce3ac21e/examples/js/cameras/CinematicCamera.js#L38 -L39

https://github.com/mrdoob/three.js/blob/6865b8e6367d0ce07acbacfae6663c4cce3ac21e/examples/js/controls/OrbitControls.js#L1149 -L1150

THREE.<class>.call ๋ฐ Object.create( THREE.<class> ์ด ๊ฐ€์žฅ ๊ฐ€๋Šฅ์„ฑ ์žˆ๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์ด๋Š” Loader, EventDispatcher ๋ฐ PerspectiveCamera(์•„๋งˆ๋„ ๋งŽ์€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค ์ค‘)๋ฅผ ์•„์ง ํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/commit/1017a5432eede4487436d6d34807fda24b506088

์ข‹์Šต๋‹ˆ๋‹ค. let ๋ฐ const ์—์„œ src/ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@DefinitelyMaybe ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ๋„์™€์ฃผ๊ณ  ์‹ถ์€ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

๐ŸŽ‰ ๐Ÿ’ฏ ์  ์žฅ ์˜ˆ!

ํ•ซ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ const๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์ด๋ผ๋Š” ์šฐ๋ ค๋ฅผ ์ œ๊ธฐํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  JavaScript์—์„œ ๊ฐ์ฒด๊ฐ€ const๋ฅผ ์™„์ „ํžˆ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•„์•„, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  const๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ํ•ด๋‹น ๊ฐ์ฒด ํŠธ๋ฆฌ(๊ตฌ์กฐ์ฒด์™€ ๊ฐ™์€)์˜ ํ‚ค์— ํ• ๋‹น๋œ ์ฝ”๋“œ ๊ธฐ๋Šฅ๊ณผ ๋ณ‘ํ•ฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ let ๋˜๋Š” const๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์–ด์จŒ๋“  ๊ทธ๊ฒƒ์€ ์ƒ๊ฐํ•ด๋ณผ ๋ฌธ์ œ์ด๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ const๋Š” ์ ˆ๋Œ€ ์‚ฌ์šฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ์ •๋ง ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ํ•ซ์ฝ”๋“œ ๋กœ๋”ฉ์— ๋Œ€ํ•œ ์šฐ๋ ค ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์—ฌ์ „ํžˆ ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋งŒํผ ์ผ์ •ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ ๋” ๋งŽ์€ ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์ด import reloading ๋˜๋Š” ๋ฌด์—‡์ด๋“ ์— ๋Œ€ํ•œ ๋ฌด์˜๋ฏธํ•œ ๊ด€์‹ฌ์‚ฌ๋ผ๊ณ  ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜๊ณ  ์ž…๋ ฅํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
'ํ•˜์ž'๊ฐ€ ๋˜์ž! ๋งˆ์นจ๋‚ด.

Crockford๋Š” var๊ฐ€ ํฐ ์‹ค์ˆ˜์˜€์ง€๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 'let'์ด ์ƒ์„ฑ๋˜์—ˆ์ง€๋งŒ var๋Š” ๊ฒฐํ•จ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๊ณ  'let'์˜ ์ฝ”๋“œ๋Š” var์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด์–ด์•ผ ํ–ˆ์ง€๋งŒ ์ž˜๋ชป ์ฝ”๋”ฉ๋œ ๋ช‡ ๊ฐ€์ง€ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๋‚จ๊ฒผ์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ผ์ƒ์— ์ˆจ์–ด. ์—„๊ฒฉํ•œ ๋ชจ๋“œ์™€ ํ˜ธ์ด์ŠคํŒ…์€ ์ด ์ฃผ์ œ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@MasterJames const๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•ซ ๋ฆฌ๋กœ๋”ฉ์—๋Š” ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ €๋Š” React ํ™˜๊ฒฝ์—์„œ ์ผํ•˜๋ฉฐ ํ•ซ ๋ฆฌ๋กœ๋”ฉ์ด ํ‘œ์ค€์ด๋ฉฐ ์˜ค๋Š˜๋‚  ํ‘œ์ค€์ธ const์™€ let์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•ซ ๋ฆฌ๋กœ๋”ฉ์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ const ๋ฅผ Object.freeze ๊ฐ์ฒด๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์ฐฉ๊ฐํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰