Pixi.js: ๋งŽ์€ ํ…์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ์œ„์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด์„œ ๋†’์€ FPS๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2020๋…„ 09์›” 25์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pixijs/pixi.js

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ํ˜„์žฌ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด PixiJS๋ฅผ ์กฐ์‚ฌ ์ค‘์ด๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค! ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์€ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋งŽ์€ ํ…์ŠคํŠธ ๋ ˆ์ด๋ธ”์ด ํ‘œ์‹œ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์„ ๋” ํ–ฅ์ƒ์‹œํ‚ฌ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์œผ๋ฉฐ ๋งˆ์ง€๋ง‰ ํฌ๋ง์€์ด ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋„์›€์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณจ

1500 ๊ฐœ์˜ ํ…์ŠคํŠธ ๋ ˆ์ด๋ธ”
์ดˆ๋‹น 60 ๊ฐœ์˜ ์œ„์น˜ ์—…๋ฐ์ดํŠธ
60FPS

ํ”ฝ์‹œ ๋†€์ดํ„ฐ

๋‚˜๋Š” ์ด๋ฏธ BitMapText๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MacBook Pro์—์„œ ~ 28 FPS์˜ ์ตœ์†Œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
https://www.pixiplayground.com/#/edit/rLbAN_xrw7yUU_cg_c8Xv

์ด๊ฒƒ์„ ๊ฐœ์„  ํ•  ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋งŽ์€ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๐Ÿค” Question

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

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋“  ํ…์ŠคํŠธ์—์„œ ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์Šคํ”„๋ผ์ดํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์™œ ๊ทธ๋Ÿฐ์ง€ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋ฉฐ ๋†€์ดํ„ฐ์—์„œ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ 60FPS๋กœ ๋ชจ๋“  ํ”„๋ ˆ์ž„์— 1500 ๊ฐœ์˜ ๋ ˆ์ด๋ธ” ์œ„์น˜๋ฅผ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งค์ดˆ๋งˆ๋‹ค ํ…์ŠคํŠธ ๋‚ด์šฉ์ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋งค์ดˆ ์งง์€ ๋™๊ฒฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์ด๋Ÿฌํ•œ ํ…์ŠคํŠธ ์—…๋ฐ์ดํŠธ๋ฅผ ๋น„๋™๊ธฐ ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์˜ˆ : ์›น ์ž‘์—…์ž). ํ˜„์žฌ ImageBitmap ๋ฐ OffscreenCanvas์— ๋Œ€ํ•ด ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

_ ๋ชจ๋“  _ ๋ฒˆ ํ™”๋ฉด์— 1500 ๊ฐœ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ์˜คํ”„ ์Šคํฌ๋ฆฐ ๋ ˆ์ด๋ธ”์„ ์ œ๊ฑฐํ•˜๋ฉด ์„ฑ๋Šฅ์— ๋งŽ์€ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. Pixi๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปฌ๋ง์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์ง€๋งŒ ์—ฌ๊ธฐ์— ๋„์›€์ด ๋  ์ˆ˜์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ (์˜ˆ : @SukantPal์˜ @pixi-essentials/cull )์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1500 ๊ฐœ์˜ ๋ ˆ์ด๋ธ”์ด ๋ชจ๋‘ ๊ณ ์œ ํ•ฉ๋‹ˆ๊นŒ? ์ค‘๋ณต ํ•ญ๋ชฉ์ด ๋งŽ์œผ๋ฉด RenderTexture๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Sprite๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ฐธ์กฐ๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ChristophWalter ์—ฌ๋Ÿฌ๋ถ„์ด ๋ณด์—ฌ์ค€ ์˜ˆ์ œ๋Š” @bigtimebuddy๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ปฌ๋ง์œผ๋กœ๋ถ€ํ„ฐ ์ž ์žฌ์ ์œผ๋กœ ์ด์ต์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 112 ๊ฐœ์˜ ๋ฌธ์ž๊ฐ€์žˆ๋Š” 1500 ๊ฐœ์˜ ๋ ˆ์ด๋ธ”์€ ๋ Œ๋”๋ง ํ•  _ ๋งŽ์ด _์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ด€๋ จ ์ตœ์ ํ™”๋ฅผ ์ œ์•ˆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ…์ŠคํŠธ๊ฐ€ ๋Œ€๋ถ€๋ถ„ ๊ฒน์นฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋„ˆ๋ฌด ์กฐ๋ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ์„ ์ˆ˜์—†๋Š” ๋’ค์ฃฝ๋ฐ•์ฃฝ ๋œ ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

MESH.BATCHABLE_SIZE๋ฅผ 200๊ณผ ๊ฐ™์ด ๋” ๋†’์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. iMac์—์„œ 6x CPU ์†๋„ ์ €ํ•˜ ํ›„์—๋„ ์—ฌ์ „ํžˆ 45FPS๋ฅผ ํ†ตํ•ด ์ „์›์ด ๊ณต๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ํ”„๋กœํŒŒ์ผ ๋งํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์—…์šฉ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—… ์ค‘์ด๊ณ  ์ด๊ฒƒ์ด GPU ์ธก ๋ณ‘๋ชฉ์œผ๋กœ ํŒ๋ช…๋˜๋ฉด ๊ฐ ๋ฌธ์ž (๋ชจ๋‘ As, ๋ชจ๋“  B, ๋ชจ๋“  C ๋“ฑ)๋ฅผ ํ•จ๊ป˜ ๋ Œ๋”๋งํ•˜๋Š” ๋น„ ์ˆœ์ฐจ์  ๋ฌธ์ œ๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์Šค์ฒ˜ ์ง€์—ญ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ผ ์—”์ง„ ๊ฐœ๋ฐœ ๋ฐ / ๋˜๋Š” ํ™”๋ฉด์—์„œ _changed_๊ฐ€์žˆ๋Š” ๋ถ€๋ถ„์„ ๋ Œ๋”๋งํ•˜๋Š” diff-rect ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, 1500 ๊ฐœ์˜ ๋ ˆ์ด๋ธ” ์ค‘ 60 ๊ฐœ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ). ์ด๊ฒƒ์€ ๋‹จ์ง€ ์•„์ด๋””์–ด์ด๋ฉฐ ๊ทธ๋Œ€๋กœ ๋ฐ›์•„ ๋“ค์—ฌ ์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค.

๋„์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” ์ปฌ๋ง์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฉฐ ๋™์‹œ์— ๋งŽ์€ ๋ ˆ์ด๋ธ”์„ ํ‘œ์‹œ ํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฒค์น˜ ๋งˆํฌ ์ด์œ ๋กœ ์šฐ๋ฆฌ๋Š” ์›น์ด ์•„๋‹Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฒฝ์Ÿํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์— ์˜๋ฌธ์„ ์ œ๊ธฐํ–ˆ์ง€๋งŒ webgl์ด์ด๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ ˆ์ด๋ธ”์€ ๊ณ ์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ๊ทธ๋ ‡๊ฒŒ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋Š” ํ…์ŠคํŠธ ๋‚ด์šฉ์„ ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์ ํ™” ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์น˜ ( ๋†€์ดํ„ฐ )๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•„๋„ FPS๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ๋งŒ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

MESH.BATCHABLE_SIZE๋ฅผ ์„ค์ •ํ•ด๋„ ๋‚ด ํŽธ์ด ๋ฐ”๋€Œ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋ฅผ ์‚ดํŽด ๋ณด๊ฑฐ๋‚˜ iMac ๊ตฌ์ž…์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜ ์ €๋Š” ๋ Œ๋”๋ง์—๋ณ„๋กœ ๊ด€์‹ฌ์ด ์—†์œผ๋ฏ€๋กœ์ด ์•„์ด๋””์–ด๊ฐ€ ์ •๋ง ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค!

์•„, ํŠน์ • ์˜ˆ๋ฅผ ์‹ค์ œ๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ๊ณ ์˜ ๋ฐฉ๋ฒ•์€ @bigtimebuddy๊ฐ€ ๋งํ•œ๋Œ€๋กœ ํ•œ

์ด๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ฐฐ์น˜ ๋ Œ๋”๋Ÿฌ์˜ ๋ฒ„ํผ๋ง ๋‹จ๊ณ„์˜ ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  • ์ •์ ์˜ ์ˆ˜๋Š” 112 ๋ฐฐ (4 / ๋ฌธ์ž ๋Œ€์‹  4 / ํ…์ŠคํŠธ)๋กœ ์ž˜๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ •์ ์ด 6K๋กœ ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.
  • ์žฅ๋ฉด์— DisplayObject๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. BitmapText๋ฅผ RenderTexture๋กœ ๋ Œ๋”๋ง
  2. 1500 * 4 ์ •์ ์œผ๋กœ ๋ฉ”์‹œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  3. ์ •์ ์„ ์ง์ ‘ ์• ๋‹ˆ๋ฉ”์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ๋‹น 4 ๊ฐœ์˜ ์ •์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : ์ง์‚ฌ๊ฐํ˜•). ๋”ฐ๋ผ์„œ ์ฒซ ๋ฒˆ์งธ ์ •์ ์˜ ์œ„์น˜๋ฅผ โ€‹โ€‹๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ์„ธ ๊ฐœ๋Š” (x + ๋„ˆ๋น„, ๋†’์ด), (x + ๋„ˆ๋น„, y + ๋†’์ด), (x, y + ๋†’์ด)์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ๊ณผ์ •์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”!

์ด๋ด, ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ œ์•ˆ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. BitmapText๋ฅผ ํ…์Šค์ฒ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ ๋ฉ”์‹œ์— ํ…์Šค์ฒ˜๋ฅผ ํ‘œ์‹œํ•˜๋ ค๊ณ  ๋…ธ๋ ฅ ์ค‘์ž…๋‹ˆ๋‹ค. PIXI.Mesh ๋ฐ PIXI.SimpleMesh๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋งŒ์˜ ์…ฐ์ด๋”๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด PIXI.MeshMaterial์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

const bitmapFontText = new PIXI.BitmapText(
    'Lorem ipsum dolor\nsit amet consetetur\nsadipscing elitr sed', 
    { font: '55px Desyrel', align: 'left' }
);

const texture =  PIXI.RenderTexture.create({ width: 800, height: 600 });
app.renderer.render(bitmapFontText, texture);

const vertices = [
    -0.5, -0.5,
    0.5, -0.5,
    0.5, 0.5,
    -0.5, 0.5
];
const uvs = [
    0, 0,
    1, 0,
    1, 1,
    0, 1,
];
const indices = [0, 1, 2, 0, 2, 3];
const geometry = new PIXI.MeshGeometry(vertices, uvs, indices);
const shader = new PIXI.MeshMaterial(texture);

const mesh = new PIXI.Mesh(geometry, shader);
app.stage.addChild(mesh);

https://www.pixiplayground.com/#/edit/7RHqFti0tdSzw -6iOtylk

-
_Edit_ : ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ผญ์ง“์ ์€ ํ”ฝ์…€ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค. _ ๋‹ค์Œ ๋‹จ๊ณ„ _ : ๋ฉ”์‹œ์— ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const vertices = [
    0, 0,
    500, 0,
    500, 500,
    0, 500
];

-
_ ํŽธ์ง‘ 2_ : ๋ชจ๋“  ๋ผ๋ฒจ์— ํ•˜๋‚˜์˜ ํ…์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ? ๋‚ด๊ฐ€ ์ž˜๋ชป ํ‘œํ˜„ํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ”์€ ๊ณ ์œ ํ•˜์ง€๋งŒ ๋ชจ๋“  ํ”„๋ ˆ์ž„์—์„œ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์น˜ ( ๋†€์ดํ„ฐ )๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•„๋„ FPS๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ๋งŒ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

PIXI.Mesh๊ฐ€ ๋„์›€์ด ๋ ๊นŒ์š”? PixiJS์˜ ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ์ฝ์„ ์ˆ˜์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@ChristophWalter (์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ ) ์ง์ ‘ ๋ Œ๋”๋Ÿฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žฅ๋ฉด์ด ๋ณ€๊ฒฝ ๋  ๋•Œ Renderer.render _only_๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ‹ฐ์ปค ๋ฃจํ”„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์˜ต์…˜์— autoStart: false ๋ฅผ ์ „๋‹ฌํ•œ ๋‹ค์Œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด์žˆ์„ ๋•Œ app.render() ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์ฐจ์ด.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋“  ํ…์ŠคํŠธ์—์„œ ํ…์Šค์ฒ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์Šคํ”„๋ผ์ดํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์™œ ๊ทธ๋Ÿฐ์ง€ ์ดํ•ด๊ฐ€ ์•ˆ๋˜๋ฉฐ ๋†€์ดํ„ฐ์—์„œ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ 60FPS๋กœ ๋ชจ๋“  ํ”„๋ ˆ์ž„์— 1500 ๊ฐœ์˜ ๋ ˆ์ด๋ธ” ์œ„์น˜๋ฅผ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งค์ดˆ๋งˆ๋‹ค ํ…์ŠคํŠธ ๋‚ด์šฉ์ด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋งค์ดˆ ์งง์€ ๋™๊ฒฐ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์ด๋Ÿฌํ•œ ํ…์ŠคํŠธ ์—…๋ฐ์ดํŠธ๋ฅผ ๋น„๋™๊ธฐ ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์˜ˆ : ์›น ์ž‘์—…์ž). ํ˜„์žฌ ImageBitmap ๋ฐ OffscreenCanvas์— ๋Œ€ํ•ด ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ช‡ ์ฃผ ์ „์— ์กฐ์‚ฌ๋ฅผ ์ค‘๋‹จ ํ•œ ์งง์€ ์—…๋ฐ์ดํŠธ
์‹ค์ œ๋กœ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์—… ํ•œ ์›น ์ž‘์—…์ž๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

// render-text-worker.js
onmessage = function(event) {
    const textLines = event.data.text.split(/\n/);
    const index = event.data.index;
    const offscreen = new OffscreenCanvas(150,45);
    const ctx = offscreen.getContext("2d");
    ctx.font = "15px monospace";
    textLines.forEach((text, index) => {
        ctx.fillText(text, 0, 15 + index * 15)
    })
    const imageBitmap = offscreen.transferToImageBitmap();
    postMessage({imageBitmap, index});
};
// index.js
const worker = new Worker("render-text-worker.js");
const callbacks ={}
function getLabelTexture(index, text, callback) {
  callbacks[index] = callback
  worker.postMessage({ index, text });
}
worker.onmessage = function({ data }) {
  const callback = callbacks[data.index]
  callback(PIXI.Texture.from(data.imageBitmap));
}

๋ถˆํ–‰ํžˆ๋„ ๋‚ด ์œ ์Šค ์ผ€์ด์Šค์—๋Š” ๊ฐœ์„ ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ ํ”„๋ ˆ์ž„์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋–จ์–ด์ง‘๋‹ˆ๋‹ค. ์ž‘์—…์ž๋กœ๋ถ€ํ„ฐ ์ด๋ฏธ์ง€ ๋น„ํŠธ ๋งต์„ ์ „์†กํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž‘์—… ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๋ ˆ์ด๋ธ”์˜ ํ…์ŠคํŠธ ๊ธธ์ด๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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