Pixi.js: gl ๋งคํŠธ๋ฆญ์Šค๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 06์›” 30์ผ  ยท  39์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pixijs/pixi.js

์ด๊ฒƒ์€ ์ด๋‹จ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์— ์•„์ด๋””์–ด๋ฅผ ๋˜์ง€๊ณ  ์‚ฌ๋žŒ๋“ค์ด ํ”ผ๋น„๋ฆฐ๋‚ด ๋‚˜๋Š” ์‚ด์ธ์„ ์™ธ์น˜๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค... ์šฐ๋ฆฌ๋Š” ๊ฐ์ฒด ๊ธฐ๋ฐ˜ ๋Œ€์‹  ๋ฐฐ์—ด ๊ธฐ๋ฐ˜ ํฌ์ธํŠธ์ธ ํ–‰๋ ฌ๋กœ ํ‘œ์ค€ํ™”ํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ƒ๊ฐํ•ด ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? WebGL์€ ๋Œ€๋ถ€๋ถ„์˜ vertex/texture/etc api์—์„œ ๋ฐฐ์—ด์„ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๊ตฌํ˜• ๋˜๋Š” ๊ธฐ๋ณธ ์–ด๋ ˆ์ด(์˜ˆ: https://github.com/toji/gl-matrix)๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๋Š” ๊ธฐ์กด ์—์ฝ”์‹œ์Šคํ…œ ๋ชจ๋“ˆ๋„ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ”Œ๋ž˜๊ทธ ๋’ค์— ํ•˜๋“œ์›จ์–ด SIMD๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ gl-matrix๊ฐ€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. , ๊ทธ๋ฆฌ๊ณ  ๊ณง ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์‚ฌ์‹ค gl-matrix๋Š” ํ˜„์žฌ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.)

๋‚˜๋Š” ์ด๊ฒƒ์ด pixi์— ๋Œ€ํ•œ ๊ฑฐ๋Œ€ํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์™„์ „ํžˆ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค...์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ๋ฒ„๋ฆฌ๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์ด ๊ทธ ์•„์ด๋””์–ด๋ฅผ ์–ผ๋งˆ๋‚˜/์–ผ๋งˆ๋‚˜ ์‹ซ์–ดํ•˜๋Š”์ง€ ๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค ;)

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

@GoodBoyDigital ์•„๋งˆ๋„ ๋‹น์‹ ์ด ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์นœ๊ตฌ ๋ถ€์ธ์—๊ฒŒ ์˜์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๊ธ€, ๋‚˜๋Š” ์ด๊ฒƒ์„ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ๋‹ค :

https://stackoverflow.com/questions/15823021/when-to-use-float32array-instead-of-array-in-javascript

์ตœ๊ณ  ๋“ฑ๊ธ‰์˜ ๋‹ต๋ณ€(ํ˜„์žฌ 44ํ‘œ)์€ ํ•ฉ๋ฆฌ์ ์ด๊ณ  ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

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

1) SIMD๊ฐ€ ์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/rwaldron/tc39-notes/blob/a66df6740eec3358d5e24f81817db99d6ee41401/es8/2017-03/mar-21.md#10if -simdjs-status-update

2) ๋‹จ์ˆœํ•œ 6๊ฐœ์˜ ํ•„๋“œ "a,b,c,d,tx,ty"๋Š” Float32Array(9) ํ–‰๋ ฌ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋‚˜์™€ @GoodBoyDigital ๋ชจ๋‘ ์ด๋ฏธ ํ†ตํ•ฉ์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

3) JS๋Š” ํฐ ์ขŒํ‘œ๋กœ ์ž‘๋™ํ•˜๋Š” ์•ฑ์— ์ค‘์š”ํ•œ ๋ฐฐ์ •๋ฐ€๋„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”ฝ ๋ฐ ์Šคํ”„๋ผ์ดํŠธ์— ๋Œ€ํ•œ "ํ”„๋กœ์ ์…˜ x ๋ณ€ํ™˜"์€ JS ์ธก์— ์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” v5์—์„œ Float32Array(9)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ๋‚ด jsperf ํ…Œ์ŠคํŠธ์—์„œ ๋™์ผํ•œ ์„ฑ๋Šฅ์€ ์•„๋‹์ง€๋ผ๋„ ์œ ์‚ฌํ–ˆ์œผ๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ toArray ๋ฐ transpose ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/pixijs/pixi.js/blob/455c059e8d155c1d9a05fc2ece2c02b3bdf8bf84/plugins/core/src/math/Matrix.js

gl-matrix ๋Š” SIMD(Ivan์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ฃฝ์€ ์‚ฌ์–‘์ž„)๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•˜์ง€๋งŒ ๊ตฌํ˜„ ์‹œ์—๋„ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 3x3 ํ–‰๋ ฌ( Float32Array(9) )์ด GPU์— ๋‹ฟ๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ๊ณ„์‚ฐ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด 2D ํ–‰๋ ฌ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. gl-matrix ์—๋Š” ์ด์— ๋Œ€ํ•œ ์ข‹์€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—†์Šต๋‹ˆ๋‹ค.

v5 ๋ฒ„์ „์€ GPU์— ์ง์ ‘ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ด€์‹ฌ ์žˆ๋Š” 2D ๋ถ€๋ถ„์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ SharedArrayBuffers ๋ฐ ์›น ์ž‘์—…์ž์— ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํƒ€ ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์œผ๋กœ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@englercj ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Math.fround๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. perf Float64Array๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค.

Float64Array๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•ด ๋‹จ์ •๋ฐ€๋„๋กœ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ GPU์— ์—…๋กœ๋“œํ•  ๋•Œ float32๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ˆ˜ํ•™์„ ์ด์ค‘์œผ๋กœ ํ•œ ๋‹ค์Œ ๋‹จ์ผ๋กœ ์ž๋ฆ…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ •ํ™•ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—…๋กœ๋“œํ•˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ GL 4.0๊นŒ์ง€๋Š” ๋‹จ์ •๋ฐ€๋„๋ฅผ ์˜๋ฏธํ•˜๊ณ  WebGL 2๋Š” GL ES 3.0์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

๋งคํŠธ๋ฆญ์Šค ์—…๋กœ๋“œ๋Š” ๊ฒฐ์ฝ” ์šฐ๋ฆฌ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ์œ„์น˜์—์„œ "uniform3fv"๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ์ž‘์—…์ด ์•„๋‹ˆ๋ฉฐ drawCall์ด ๋’ค๋”ฐ๋ฅด๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํฐ ๋ฒ„ํผ ์—…๋กœ๋“œ์ž…๋‹ˆ๋‹ค. Heavy pixi ์•ฑ์€ ํ”„๋ ˆ์ž„๋‹น ์•ฝ 400๊ฐœ์˜ ๋“œ๋กœ์ฝœ๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํฐ ์ขŒํ‘œ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„์—๋Š” ์—…๋กœ๋“œํ•  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์„ ๋ฐฐ์ •๋ฐ€๋„๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ "a,b,c,d,tx,ty" ํ‘œ๊ธฐ๋ฒ•์€ "0,1,3,4,6,7"๋ณด๋‹ค ์“ฐ๊ธฐ์™€ ์ฝ๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ฒ™์ถ”์—๋„ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ทธ ์œ„์— ๋งค์šฐ ์ •๊ตํ•œ ๋ณ€ํ™˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ–‰๋ ฌ๋กœ ์ „ํ™˜ํ•˜๋ฉด ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ํ–‰๋ ฌ ์—ฐ์‚ฐ์„ ์ƒ์ƒํ•˜๊ธฐ ์–ด๋ ต์ง€๋งŒ ์ €๋Š” ์‰ฝ๊ฒŒ ์ฝ์Šต๋‹ˆ๋‹ค.

UPD. ๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์ด ํ–‰๋ ฌ์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์šฐ๋ฆฌ์—๊ฒŒ ๋” ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค: https://github.com/gameofbombs/gobi/blob/master/src/core/math/FlatTransform2d.ts , ์ด๋Š” "Flat" ๋ณ€ํ™˜์ด๋ฉฐ ํ•„์š”ํ•œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ํ–‰๋ ฌ์˜ ๊ณ„์‚ฐ์„ ์œ„ํ•ด.

UPD2. ๊ทธ๋Ÿฌ๋‚˜ 3d ๋ณ€ํ™˜์˜ ๊ฒฝ์šฐ Float32Array(16)๊ฐ€ ๋” ์ข‹์œผ๋ฉฐ ์ด์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ํˆฌํ‘œ๋Š” ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ•˜๋‚˜์— ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฐ์—ด์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•œ ๊ฒƒ์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์—ฌ์ „ํžˆ ์‚ฌ์‹ค์ธ์ง€ 100% ํ™•์‹ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ์•„๋งˆ๋„ ๋ฐ”๋€Œ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

3d์˜ ๊ฒฝ์šฐ ์ฃผ๋กœ GPU์— ํ•ญ๋ชฉ์ด ๋งŽ์ด ์—…๋กœ๋“œ๋˜๊ธฐ ๋•Œ๋ฌธ์— gl-matrix ์Šคํƒ€์ผ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค! Pixi์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์กฐ์ž‘์€ js ๋žœ๋“œ(์˜ˆ: ์Šคํ”„๋ผ์ดํŠธ ๋ฐฐ์ฒ˜)์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

https://jsperf.com/obj-vs-array-view-access/1

์—ฌ๊ธฐ ๋‚ด๊ฐ€ ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด ๋ฐฉ๋ฒ• ๋Š๋ฆฐ ์ผ๋ฐ˜ ๋ฐฐ์—ด๋ณด๋‹ค ๋‘˜, Float32Array๋ณด๋‹ค uniform3fv ๋Š” ์ผ๋ฐ˜ Array ๊ฐœ์ฒด๋ฅผ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๊ฐœ์ฒด๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘: Array ๊ฒฐ๊ณผ๊ฐ€ ์šฐ์—ฐ์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์žฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

๋‚ด ํˆฌํ‘œ๋Š” ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ•˜๋‚˜์— ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฐ์—ด์„ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•œ ๊ฒƒ์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋งค์šฐ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ํฌ๊ฒŒ ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ธฐ๋ณธ vm์ด ์—ฌ๋Ÿฌ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๊ฐ€ ์ˆœ์ˆ˜ํ•œ ์ˆซ์ž ๋ฐฐ์—ด๋ณด๋‹ค ๋น ๋ฅผ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์€ ์ง๊ด€์ ์ด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด๊ฐ€ ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ๋Š” _์ด์œ _์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ด€๋ จ ๊ฒฐ๊ณผ(i7, Windows 10):

ํฌ๋กฌ 59:

image

Firefox 54.0.1(32๋น„ํŠธ):

image

๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ์—ฃ์ง€ 40.15063.0.0:

image

Array ๊ฐ€ ๋” ๋นจ๋ผ์ง„ ๋‚ด ํฌ๋กฌ ๊ฒฐ๊ณผ๋Š” ์šฐ์—ฐ์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ง€๊ธˆ์€ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•ฝ 50M ops/s์ด์ง€๋งŒ ์ด์ „์— ํ•œ ๋ฒˆ ์‹คํ–‰ํ–ˆ์„ ๋•Œ 500M ops/s์˜€์Šต๋‹ˆ๋‹ค. ๊ธฐ์ด ํ•œ...

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

Float64๋กœ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? :)

์ €๋Š” ๋“œ๋กœ์ฝœ๋‹น ํ•˜๋‚˜ ์ด์ƒ์˜ ๋งคํŠธ๋ฆญ์Šค ์ž‘์—…๋ณด๋‹ค ์ฝ”๋“œ ํ’ˆ์งˆ์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ์šฐ๋ฆฌ๋Š” invert๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. updateTransform()์ด ์šฐ๋ฆฌ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ๋“œ๋กœ์ฝœ๋‹น ํ•˜๋‚˜ ์ด์ƒ์˜ ๋งคํŠธ๋ฆญ์Šค ์ž‘์—…๋ณด๋‹ค ์ฝ”๋“œ ํ’ˆ์งˆ์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

Float64Array๋Š” ์–ด๋–ป๊ฒŒ ๋” ๋†’์€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋” ๋งŽ์€ ์ •๋ฐ€๋„๋ฅผ ์–ป๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ, ์–ด์จŒ๋“  ๋‹จ์ •๋ฐ€๋„๋กœ ์ค„์ผ ๋•Œ ๊ทธ๊ฒƒ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ์šฐ๋ฆฌ๋Š” invert๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. updateTransform()์ด ์šฐ๋ฆฌ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ๋ฒค์น˜๋งˆํ‚นํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๊ทธ ์‚ฌ์ด์˜ ๊ฐ’์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๋“œ๋กœ์ฝœ๋‹น ํ•˜๋‚˜ ์ด์ƒ์˜ ๋งคํŠธ๋ฆญ์Šค ์ž‘์—…๋ณด๋‹ค ์ฝ”๋“œ ํ’ˆ์งˆ์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ๋ฒค์น˜๋งˆํ‚นํ•˜๊ณ ,
๊ด€๋ จ ์—†๋Š” ๊ฐ’ ์‚ฌ์ด์— ์ˆ˜ํ–‰๋œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋ชจ๋‘ ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€ ์ฝ๊ธฐ/์“ฐ๊ธฐ์˜ ์ผ๋ฐ˜์ ์ธ ๋ฒค์น˜๋งˆํ‚น์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Ivan์€ ์ •๋ง ์ข‹์€ ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. updateTransform() ๊ฐ€ ์••๋„์ ์ธ ์—ฐ์‚ฐ์ด๋ผ๋ฉด, ๊ทธ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์ด ๋งค๋ ฅ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

์ €๋Š” "(a,b),(c,d),(tx,ty)" ๋ฐฐ์ •๋ฐ€๋„ ํ–‰๋ ฌ์— ๋Œ€ํ•ด ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•ด float32array๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  "posX,posY,pivotX, pivotY,scaleX,scaleY, ์ „๋‹จX,์ „๋‹จY,๋กœZ". ์–ด์จŒ๋“  ๋‚ด ํฌํฌ์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด์ง€๋งŒ ๋งˆ์Šคํ„ฐ pixi์—์„œ๋„ ๋งคํŠธ๋ฆญ์Šค ๋ฐฐ์—ด์„ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋‚ด ๊ธฐ์ค€์ด์•ผ.

๋‚˜๋Š” ๋˜ํ•œ ์‚ฌ๋žŒ๋“ค์ด js์—์„œ vec ์ˆ˜ํ•™์— ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐœ์˜ ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

Float64Array๋Š” ์–ด๋–ป๊ฒŒ ๋” ๋†’์€ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋” ๋งŽ์€ ์ •๋ฐ€๋„๋ฅผ ์–ป๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ, ์–ด์จŒ๋“  ๋‹จ์ •๋ฐ€๋„๋กœ ์ค„์ผ ๋•Œ ๊ทธ๊ฒƒ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

updateTransform์—์„œ ์Šคํ”„๋ผ์ดํŠธ ๋ณ€ํ™˜(์Šคํฌ๋กค์šฉ)์œผ๋กœ ์นด๋ฉ”๋ผ ๋ณ€ํ™˜์„ ๊ณฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์ž‘์„ ๋•Œ๋งŒ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋ฏ€๋กœ ๊ฒฐ๊ตญ ์ˆซ์ž๋Š” ์ ์ง€๋งŒ ์Šคํ”„๋ผ์ดํŠธ ์œ„์น˜์™€ ์นด๋ฉ”๋ผ ์œ„์น˜ ๋ชจ๋‘ ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธก ์†”๋ฃจ์…˜:

1) ๊ทธ์˜ ํŽธ์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๊ณ„์‚ฐํ•˜์‹ญ์‹œ์˜ค. PIXI๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ์ขŒํ‘œ๋งŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
2) ์„ธ๊ณ„๋ฅผ ํฐ ์ขŒํ‘œ๋กœ ๋ฉ์–ด๋ฆฌ๋กœ ๋‚˜๋ˆ„๊ณ  ์Šคํ”„๋ผ์ดํŠธ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ์ขŒํ‘œ๋ฅผ ๊ฐ–์ง€๋งŒ ํ•˜์œ„ ํ”ฝ์…€ ์นด๋ฉ”๋ผ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค => ์นด๋ฉ”๋ผ๋„ ํฌ๊ณ  ์ž‘์€ ์ขŒํ‘œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํฐ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ํŽธ์— ์„œ๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ ์ž‘์€ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ํ•œ ๋ฒˆ ๋” ๊ณจ์น˜ ์•„ํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์‚ฌ๋žŒ๋“ค์ด js์—์„œ vec ์ˆ˜ํ•™์— ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐœ์˜ ํ‘œ์ค€์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๋ฌด์Šจ ๋ง์ธ์ง€ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š”๋ฐ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

๋ฌด์Šจ ๋ง์ธ์ง€ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋Š”๋ฐ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

ํ•  ์ˆ˜ ์—†์–ด, ๋‚˜ํ•œํ…Œ๋Š” ๋„ˆ๋ฌดํ•ด.

์ €์ˆ˜์ค€ ์ตœ์ ํ™”์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ ์–ธ์–ด ๊ตฌ์„ฑ, DSL-s. ์šฐ๋ฆฌ๋Š” ์–ด๋–ค ์ˆ˜์ค€์—์„œ ์šฐ๋ฆฌ ๋ชจ๋‘๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ํ‘œ์ค€์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ง€๋‚œ 2๋…„ ๋™์•ˆ ์ €๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ pixi(v3 ๋ฐ v4์šฉ) ํฌํฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ž์ฒด ๊ณ ๊ธ‰ ๋ณ€ํ™˜์ด ์žˆ๋Š” "pixi-spine"์„ ๋‹ค๋ฃจ๊ณ  ์žˆ๊ณ  ์„ธ ๋ฒˆ์งธ ํฌํฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. "๊ณผ๊ฑฐ ivan"์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๋ฐฐ์—ด์ด ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ณ  "gl-matrix"๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

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

Float64Array๋กœ ์ €์žฅํ•˜๊ณ  ์—…๋กœ๋“œํ•  ๋•Œ Float32Array๋กœ ๋ณต์‚ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์›น ์ž‘์—…์ž์—๊ฒŒ/์—์„œ ๋ณต์‚ฌํ•˜๊ธฐ ๋” ์‰ฌ์›Œ์•ผ ํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—…์œผ๋กœ ํ˜•์‹ํ™”๋œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Float64Array ๊ทธ๋ ‡๋‹ค๋ฉด (0,1), (3,4), (6,7)์„ X,Y,translate๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํฅ๋ฏธ๋กœ์šด ๊ฒƒ๋“ค, ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜์„ ์‹ค์ œ pixi ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋ฒค์น˜๋งˆํ‚นํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด bunnymark์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ถ„์•ผ์— ๋Œ€ํ•œ ์ œ ๊ฒฝํ—˜์€ ์ €์™€ @ivanpopelyshev๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ bunny mark๋ฅผ ์œ„ํ•ด gl-matrix๋กœ ์ „ํ™˜ํ–ˆ์„ ๋•Œ ์ƒ๋‹นํžˆ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋˜์—ˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค(3๋ถ„์˜ 1 ๋” ๋Š๋ฆผ!).

๊ทธ๊ฒƒ์€ ์กฐ๊ธˆ ์ „์˜ ์ผ์ด์—ˆ๊ณ  ์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ํ‹€๋ ธ์œผ๋ฉด ์ •๋ง ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!
์†๋„ ์ฐจ์ด๊ฐ€ ์ด์ œ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์œ„์—์„œ ์ œ์•ˆํ•œ ๊ฒฝ๋กœ๊ฐ€ ์—์ด์Šค๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Pixi is SPEEED :P ๋ชจ๋“  ์†”๋ฃจ์…˜์„ ์™„์ „ํžˆ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ Float64Array์˜ ๋ฒค์น˜๋งˆํฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌํ˜„์€ ์ €์—๊ฒŒ ์ ํ•ฉํ•˜์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ํฌํฌ์—์„œ ์˜ค๋ž˜๋œ ๋งคํŠธ๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

ํ•œ ๊ฐ€์ง€ ๋”: @mreinstein , ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ํ‘œ์ค€ ์ค‘ ํ•˜๋‚˜๋Š” paper.js ์ „์šฉ ์–ธ์–ด์ธ PaperScript๊ฐ€ ์–ธ์–ด์— ์ง์ ‘ ํฌ์ธํŠธ ์—ฐ์‚ฐ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. JS์— ๋” ๋งŽ์€ ๊ตฌ๋ฌธ ์„คํƒ•์ด ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋„ ๊ทธ๋Ÿฐ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

re: ์ด ์—…๋ฐ์ดํŠธ๋œ bunnymark์— ๋Œ€ํ•ด ์ œ๊ฐ€ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ์‹œ๊ฐ„์„ ๊ธฐ๋ถ€ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์„ ๋”ฐ๋ผ๊ฐ€๋Š” ๋ฐ ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์— ๊ด€๊ณ„์—†์ด. ์–ด๋ ˆ์ด ๊ธฐ๋ฐ˜ ํ•ญ๋ชฉ์ด ์—ฌ์ „ํžˆ ํ›จ์”ฌ ๋” ๋Š๋ฆฌ๋‹ค๋ฉด ๊ทธ ๋’ค์— ์žˆ๋Š” _์ด์œ _๊ฐ€ ์ •๋ง ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ์‚ฌํ•ญ: ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ...ํฌ๋กฌ์˜ v8์€ ์ตœ๊ทผ(v59์—์„œ) ํ„ฐ๋ณดํŒฌ์ด๋ผ๋Š” v8์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ทน์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

https://v8project.blogspot.com/2017/05/launching-ignition-and-turbofan.html

ํ„ฐ๋ณดํŒฌ์ด ์กด์žฌํ•˜๊ธฐ ์ด์ „ ๋ฒ„์ „์—์„œ ํ˜„์žฌ์™€ ๋น„๊ตํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๋œ bunnymark๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@GoodBoyDigital ๋‚˜๋Š”

https://jsperf.com/obj-vs-array-view-access/1
image

Edge์—์„œ๋งŒ ๊ฐœ์ฒด ์†๋„๊ฐ€ Float64Array์™€ ์ผ์น˜/์ดˆ๊ณผํ•˜๊ณ  ์‹ค์ œ๋กœ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‚ด ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธํ–ˆ๊ณ  ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค ... ๋„๋Œ€์ฒด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?! Float64 ๋ฐฐ์—ด ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ๋™๋“ฑํ•œ Float32 ๋ฐฐ์—ด ์ž‘์—…๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋น ๋ฅธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋งˆ์Œ์— ์˜ค๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ 64๋น„ํŠธ ๋ถ€๋™ ์†Œ์ˆ˜์ ์ด ๋‹จ์–ด ๊ฒฝ๊ณ„์— ์ •๋ ฌ๋œ๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‹นํ™ฉํ•œ๋‹ค.

์ œ์•ˆ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค @mreinstein ! ๋‹น์‹ ์ด ํ™•์‹คํžˆ ๋ƒ‰๋‹ดํ•œ ์‚ฌ์‹ค๋กœ ์ „์ฒด ๋…ผ์Ÿ์„ ์ž ์žฌ์šธ ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋กœ ์šฐ๋ฆฌ๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค๋ฉด!

๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ pixi๋ฅผ ๋ถ„๊ธฐํ•œ ๋‹ค์Œ ๋ณ€ํ™˜์„ gl-matrix ๋˜๋Š” @englercj ๋งคํŠธ๋ฆญ์Šค ํด๋ž˜์Šค๋กœ

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ˆ˜์ •๋œ ๋ฒ„์ „์ด ์žˆ์œผ๋ฉด ์—ฌ๊ธฐ์—์„œ ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://pixijs.github.io/bunny-mark/
๋‹ค๋ฅธ ๋ฐฐ์—ด ์œ ํ˜•์œผ๋กœ ์—‰๋ง์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@englercj ๋ฉ‹์ง„ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค! ์ด๋Ÿฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์‹คํžˆ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๊ณ ๋ฌด์ ์ž…๋‹ˆ๋‹ค. v5 ๋ฒ„์ „์€ ๋ฒ„๋‹ˆ๋งˆํฌ๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์— ๊ฐ€๊น์Šต๋‹ˆ๊นŒ?

@mreinstein ๊ทธ๋ƒฅ ์ง๊ฐ, 64๋น„ํŠธ -> 32๋น„ํŠธ์—์„œ ๋ณ€ํ™˜๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
js์˜ ์ˆซ์ž๊ฐ€ 64๋น„ํŠธ ๋งž๋‚˜์š”?

@GoodBoyDigital ์•„๋งˆ๋„ ๋‹น์‹ ์ด ์˜ณ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์นœ๊ตฌ ๋ถ€์ธ์—๊ฒŒ ์˜์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๊ธ€, ๋‚˜๋Š” ์ด๊ฒƒ์„ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ๋‹ค :

https://stackoverflow.com/questions/15823021/when-to-use-float32array-instead-of-array-in-javascript

์ตœ๊ณ  ๋“ฑ๊ธ‰์˜ ๋‹ต๋ณ€(ํ˜„์žฌ 44ํ‘œ)์€ ํ•ฉ๋ฆฌ์ ์ด๊ณ  ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ๋„์™€์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. :)

๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์€ ํ”ฝ์‹œ๋ฅผ ํฌํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@GoodBoyDigital @englercj ์ด ์‹œ์ ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ๋ถ„๊ธฐ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ณ€ํ™˜์„ gl-matrix ๋˜๋Š” @englercj ๋งคํŠธ๋ฆญ์Šค ํด๋ž˜์Šค๋กœ ๊ต์ฒดํ•˜์‹ญ์‹œ์˜ค.
์ด ์˜ˆ์—์„œ๋Š” ์ „์ฒด ์—”์ง„์ด ์•„๋‹ˆ๋ผ ์Šคํ”„๋ผ์ดํŠธ ๋ฐฐ์น˜๋„ ์ž‘๋™ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

์ด์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์„ฑ๋Šฅ ๋ฒค์น˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ์—”์ง„์„ gl-matrix๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค... https://github.com/pixijs/bunny-mark์— sprite ๋ฐฐ์น˜ ํ•ญ๋ชฉ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ† ๋ผ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๋ฃจํŠธ ์š”์†Œ๋กœ์„œ์˜ PIXI.Container. ๋‚ด๊ฐ€ pixi.container, pixi.sprite๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ๊ฑฐ๊พธ๋กœ ์˜์กด์„ฑ ํŠธ๋ฆฌ ์œ„๋กœ ์ž‘์—…ํ•˜์—ฌ ๋ณ€ํ™˜ ํ•ญ๋ชฉ์„ ๊ต์ฒดํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ์œ„์น˜๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค๋Š” ๋ง์”€์ด์‹ ๊ฐ€์š”? ๋™์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

updateTransform์—๋Š” ๋‚ด๋ถ€์— ๋‘ ๊ฐ€์ง€ ํ–‰๋ ฌ ์—ฐ์‚ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์œ„์น˜, ํ”ผ๋ฒ—, ์Šค์ผ€์ผ, ํšŒ์ „์˜ ๊ตฌ์„ฑ - ๊ฐœ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  2. ๋ถ€๋ชจ ํ–‰๋ ฌ์— ์˜ํ•œ ๊ณฑ์…ˆ - ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Float64Array๊ฐ€ ์ง€์›ํ•˜๋Š” ์˜ค๋ž˜๋œ "a,b,c,d,tx,ty" ์†Œํ’ˆ์œผ๋กœ ํ–‰๋ ฌ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  updateTransform์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ @mreinstein ์€ ํ•ต์‹ฌ์—

๊ทธ๋ž˜์„œ ๊ทธ๋Š” ๊ฐ€์ง€์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  ๋†์žฅ์„ ์ง€์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ๋žŒ์ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ fork + PR์ด ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฒ„๋‹ˆ ๋งˆํฌ์—์„œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ 100k ๋ฒ„๋‹ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋กฌ์—์„œ ๋‹ค์–‘ํ•œ ๋ถ„๊ธฐ(๊ฐœ๋ฐœ, ๋ฆด๋ฆฌ์Šค, ๊ธฐํƒ€)๋ฅผ ์‹œ๋„ํ•  ๋•Œ ์ผ๊ด€๋˜๊ฒŒ 10-16fps๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. 8.75์ดˆ ์ด์ƒ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ๋ถ„์„ ์ˆ˜ํ–‰:

screen shot 2017-07-02 at 11 58 03 am

๊ฑฐ์˜ ๋ชจ๋“  ์‹œ๊ฐ„์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜ธ์ถœ์— ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.

screen shot 2017-07-02 at 11 57 50 am

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณด๋‚ธ ์ด ์‹œ๊ฐ„ ์ค‘ ๊ฐ€์žฅ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•˜๋Š” ์‹œ๊ฐ„์€ ์‹ค์ œ๋กœ Sprite.calculateVertices() ์ž…๋‹ˆ๋‹ค. TransformStatic.updateTransform() ์ง€์ถœ๋ณด๋‹ค 4๋ฐฐ ๋” ๋งŽ์Œ

ํŒŒ์ด์–ดํญ์Šค์—์„œ๋Š” ํ”„๋ ˆ์ž„ ์†๋„๊ฐ€ ์•ฝ 2๋ฐฐ์ด์ง€๋งŒ ์†Œ์š” ์‹œ๊ฐ„์€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. calculateVertices() ๋Š” ๋‘ ๋ธŒ๋ผ์šฐ์ € ๋ชจ๋‘์—์„œ ๋งŽ์€ ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ์ผ์ž…๋‹ˆ๊นŒ? bunnymark ์‹คํ–‰์—์„œ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ํ† ๋ผ์—๊ฒŒ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋งํ•˜๋Š” ํ–‰๋ ฌ ์—ฐ์‚ฐ์€ ๊ณฑ์…ˆ์„ ์œ„ํ•œ upateTransform()๊ณผ ํ˜ธ์ถœ๋‹น ํ•œ ๋ฒˆ๋งŒ ํ”Œ๋Ÿฌ์‹œ()ํ•˜๋Š” ๋‘ ๊ณณ์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ๋กœ ํ•ด๋„ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.

ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์š”. :( ๊ทธ ๋ฒค์น˜๋งˆํฌ์˜ ์„ฑ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„ ๋‹ฌ์„ฑ๋œ ์ˆœ์ˆ˜ํ•œ fps๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๋ฉด, ๋‚ด ํ”„๋ ˆ์ž„ ์†๋„๋Š” ์ •์  ๊ณ„์‚ฐ์— ์˜ํ•ด _์‹ฌ๊ฐํ•˜๊ฒŒ_ ์กฐ์ ˆ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ถ™์—ฌ๋„ฃ์€ ์ฒซ ๋ฒˆ์งธ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๋ณด๋ฉด ์œ„์—์„œ ๋ Œ๋”๋ง์€ ์ด ํ”„๋ ˆ์ž„ ์‹œ๊ฐ„์˜ ์•„์ฃผ ์ž‘์€ ๋ถ€๋ถ„์ด๋ฉฐ ์ •์  ๋ฐ ๋ณ€ํ™˜ ์—…๋ฐ์ดํŠธ๋Š” ์ด ํ”„๋ ˆ์ž„ ์‹œ๊ฐ„์„ ์••๋„ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๊ฑฐ์ง“์ด๊ณ  fps๊ฐ€ ๋‚ด pixi ๋นŒ๋“œ์˜ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ธก์ •์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ฃผ์–ด์ง„ ๋นŒ๋“œ๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ธฐ์ค€์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

GPU ์ธก(ํ‘œ์‹œ๋˜์ง€ ์•Š์Œ)์˜ CPU ๋˜๋Š” CPU์—์„œ ์กฐ์ ˆ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FPS๊ฐ€ 60๋ณด๋‹ค ํ›จ์”ฌ ๋‚ฎ์ง€๋งŒ "์œ ํœด"๊ฐ€ ํฐ ๊ฒฝ์šฐ GPU์ž…๋‹ˆ๋‹ค.

์œ ํœด ์ƒํƒœ๊ฐ€ ์ž‘์œผ๋ฉด CPU์ž…๋‹ˆ๋‹ค.

computeVertices์—๋Š” ๋‚ด๋ถ€์— ํ–‰๋ ฌ ์—ฐ์‚ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค ๋ชจ์„œ๋ฆฌ๋ฅผ ํ–‰๋ ฌ๋กœ ๊ณฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

TS ํฌํฌ์— ๋Œ€ํ•œ ์ž‘์€ ์•„์ด๋””์–ด: ํ–‰๋ ฌ ์œ ํ˜•์— ๋Œ€ํ•œ ์†์„ฑ์„ ์ธ๋ผ์ธํ•˜๋Š” ๋ณ€ํ™˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. TS์—๋Š” ์•„์ง ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ณ€ํ˜•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ถ€๋„๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค :(

ํ–‰๋ ฌ ๋ณ€์ˆ˜์— ์ฃผ์„์„ ๋‹ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ฉด babel์—์„œ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋” ์ด์ƒ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Alt text

์—ผ๋‘์— ๋‘์–ด์•ผ ํ•  ์‚ฌํ•ญ: ์ด ๋ฒค์น˜๋งˆํฌ์˜ ๋ชฉํ‘œ๋Š” ์ฒ˜์Œ์— ๊ฐœ์ฒด์™€ gl-๋งคํŠธ๋ฆญ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ƒ๋Œ€๋กœ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ €ํ•˜๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ์˜ ์ฐจ์ด์— ๊ด€๊ณ„์—†์ด ๊ฐ์ฒด ์„ฑ๋Šฅ์ด ๋Œ€๋ถ€๋ถ„์˜ ์–ด๋ ˆ์ด ์ผ€์ด์Šค๋ณด๋‹ค ๋‚˜์˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ผ๊ด€๋˜๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ํ† ๋ผ ๋งˆํฌ๋ฅผ ํ”„๋กœํŒŒ์ผ๋งํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ pixi์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ๊ฒฐ๋ก ์„ ๋„์ถœํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Chrome์—์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ ์ด ์‹œ๊ฐ„์˜ 50% ์ด์ƒ์„ Sprite.calculateVertices() (40% ish)๋กœ ๋ณด๋‚ด๊ณ  TransformStatic.updateTransform() (11% ish) Firefox๋Š” ๋‘ ๋ฐฐ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋น„์œจ์€ ์ด 2๊ฐ€์ง€ ๊ธฐ๋Šฅ์— ์†Œ์š”๋œ ์‹œ๊ฐ„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ผ์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์ œ์—์„œ ๋„ˆ๋ฌด ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ด bunnymark ํ”„๋กœํŒŒ์ผ๋ง์„ ์ˆ˜ํ–‰ํ•  ๋•Œ es5 getters/setters์˜ ์‚ฌ์šฉ์ด ํฌ๋กฌ์˜ ์„ฑ๋Šฅ ์ €ํ•˜์™€ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. https: //jsperf.com/es5-getters-setters-versus-getter-setter-methods/10

์—ฌ๊ธฐ ์Šฌ๋ž™์Šค ํ•˜๊ณ  ๊ณ„์‹œ๋Š” ๋ถ„๋“ค ๊ณ„์‹ ๊ฐ€์š”? ์—ฌ๊ธฐ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฐ˜ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฑ„ํŒ…ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@mreinstein์— ์ด๋ฉ”์ผ ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ ? ์Šฌ๋ž™์œผ๋กœ ์ดˆ๋Œ€ํ•ฉ๋‹ˆ๋‹ค๐Ÿ‘

@englercj๊ฐ€ ๋งํ•œ

์ž‘์€ ์—…๋ฐ์ดํŠธ: Float64Array ๊ธฐ๋ฐ˜ https://github.com/pixijs/pixi-projection/blob/master/src/Matrix2d.ts ์— 3x2 ๋Œ€์‹  3x3 ๋งคํŠธ๋ฆญ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋Š” ๋‹ซํžŒ ํ›„ ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.

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