์์ ์ ์๊ธฐ์ gpgpu์ ์ฐ๋ ๊ฒ์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฐ์ํด์ ์กด์ฌํ๋๊น ์ฐพ์๊ฐ๊ธฐ ์ฝ๋ค... ๋ญ ์ด๋ฐ ์์ ์ค๋ช ์ด ์์๋๊ฑฐ ๊ฐ์๋ .
์๋ฅผ๋ค์ด์, ์ด๋ค ๋์ด ๋ค๋ฅธ ๋์ ๊ณต๊ฒฉํ๋๊ฑธ ECS๋ก ๋ง๋ค์ด๋ณธ๋ค๋ฉด,
entity๋ {entity id: # hp: ##, atk:### } ์ด๋ฐ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด ๊ฐ์๊ฑฐ๊ณ
system์ ์ปดํฌ๋ํธ .. hp๊ฐ ์์ผ๋ฉด ์ณ๋ง์ ์ ์๋ค๋ ๊ฒ, atk์ด ์์ผ๋ฉด ๋๋ฆด ์ ์๋ค๋ ๊ฒ์ ๊ตฌํํ ํจ์ ๊ฐ์ ์น๊ตฌ๋ค.
entity๋ system์ ๊ฐ๊ฐ ์๋์ฒ๋ผ ๋ฐฐ์ด๋ก ๋ชจ์๋๊ณ , component๋ entity๊ฐ ๊ฐ์ง๊ณ ๋ค๋.
entities = [๊ฐ์ข entity ๋ค... ];
systems = [ ๊ฐ์ข system๋ค... ];
๊ฒ์ ๋ฃจํ๋ ์๋์ฒ๋ผ ์์คํ ์ ๋ํ ๋ฃจํ๋ง ๋๋ ๊ต์ฅํ ๋จ์ํ ํํ์.
while(gaming) {
for(var system in systems) {
system(entities);
}
// ๊ฒ์ ๋ฃจํ ์ข ๋ฃ ๋ก์ง ...
}
์์คํ ๋ค์ ์๋์ฒ๋ผ ๋์๊ฐ๋ค๊ณ ์นจ.
// ๊ณต๊ฒฉ ์์คํ ์์ ...
attack(entities) {
for(var entity in entities) {
var me_ = entity;
if( me_.component["atk"] && atk_input) {
for(var entity2 in entities) {
var you_ = entity2;
if(isCollision(me_, you_)) {
attack(me_,you_);
}
}
}
}
}
์ฝ๋๊ฐ ์ฌ๋ฐ๊ฒ ์๊ธฐ๊ธดํ๋๋ฐ, ์ด๊ฒ ์ ์ฑ๋ฅ์ ์ฆ๊ฐ์ํค๋๊ฑด์ง ๋ชจ๋ฆฌ๊ฒ ์; ๋งค๋ฒ ์ ์ฒด ํ์ํ๋๊น ์ํฐํฐ ์ซ์๊ฐ ๋ง์์ง๋ฉด ์ฌ๋ฏธ ๋ชป๋ณด๋๊ฑฐ ์๋๊ฐ ํ๋ ์๊ฐ์ด ๋ค์์.
์ํฐํฐ๋ฅผ entities ๋ฐฐ์ด์ ๋ชจ์๋๊ธด ํ์ผ๋, ๋ฉ๋ชจ๋ฆฌ์์์ ์ ์น๊ตฌ๋ค์ด ์ฐ์์ ์ผ๋ก ์๋๊ฒ ๋ง๋์ง ๋ชจ๋ฅด๊ฒ ์. ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ ์ธ์ด๋ค์ ๋ฐฐ์ด์ด ๋ฆฌ์คํธ์ฒ๋ผ ๋๋๊น ๊ผญ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ์ํด์ ์์๊ฑฐ ๊ฐ์ง ์๋ค๋ ์๊ฐ์ด ๋ค์์.
ํ ...; ์ ์ข์๊ฑด์ง ์๋ชจ๋ฅด๊ฒ ๋ค์. ๊ธฐ์ด๊ฐ ์ค์ํ๋ค๋๊ฒ ์ด๋ด๋ ๋๋ฌ๋๋๋ฏ.
๊ฐ ์์คํ ์ ์ํฐํฐ๋ค์ ํ์ํ์ง ์์. ๊ฐ ์์คํ ์ ๊ฐ๊ฐ์ ์์คํ ์ ์ต์ ํ๋ ๊ตฌ์กฐ๋ก ๋์. ์ฝคํฌ๋ํธ๋ ์ํฐํฐ์ ์ ๋ณด๊ฐ ์์คํ ์์ ๋์ํ ์ ์๊ฒ ํ๋ ๋ฉํ ํด์ฃผ๋ ์ค๊ฐ ์ญํ. ์ดํ ์ฝคํฌ๋ํธ๋ฅผ ์๋ฅผ ๋ค๋ฉด ์ฒ์๊ณผ ๋ง์ง๋ง์๋ง ์ดํ์์คํ ์ ๋ฑ๋ก์ ํ๊ณ ์ดํ ์์คํ ์ ๋ฑ๋ก๋ ์ค๋ธ์ ํธ ๋ผ๋ฆฌ๋ง ์ฒ๋ฆฌ๋ฅผ ํจ.
์ค, ์์คํ ์ ๋ฑ๋กํด๋๋ฉด ๊ฑ๋ค๋ผ๋ฆฌ๋ง ๋ ์ ์๊ฒ ๊ตฐ์.
๋๋ ์ธ๋ฆฌ์ผ์ ์ฝคํฌ๋ํธ๊ฐ ๋์ํ๋ ๋ฐฉ์์ ๋ณด๊ณ ์๊ธฐํ๊ฑด๋ฐ ๋๊ฐ ๋์์ ์ฌ๋ฆฐ๊ฑฐ ๋ณด๋๊น ์์ ECS ๋ผ๋ ๋ณ๋์ ์์คํ ์ด ์ ๋ํฐ์ ์ถ๊ฐ๋ ๊ฑฐ์๋ค. ๋ด๊ฐ ์๊ธฐํ๊ฑด ๋ฌด์ํ๊ณ ์ฐ๊ตฌํด๋ณด๋ ๊ฒ ์ข์๋ฏํจ.
๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ผ๋ก ์ฌ๋ฆด ์ ์๊ฒ ๋ค์ดํฐ๋ธ ์ด๋ ์ด๋ผ๊ณ ๋ฐ๋ก ์์