이전에 이웃 블로거이신 cagetu님의 관련 포스트를 본적 있었는데, 그때는 이런 것도 있구나 하고 그냥 지나쳤지만 최근 관련글들을 보면서 그 필요성을 느끼고 있습니다. 특히 요즘 화두인 병렬 프로그램밍과 연관 되는 주제라 더욱 관심이 가네요. 기본적인 목표는 관련 데이터를 묶어 데이터 처리 효율을 높이고, 병렬성을 높이는 것입니다.

다음은 너티독의 발표 자료의 일부입니다. 보통 게임의 메인루프를 생각하면 밑의 그림과 같은 형식을 떠올리게 됩니다.



씬그래프 구조라면 UpdateScene() 내부 구조는 이렇게 되어있겠죠.



이런 구조는 데이터가 연속적으로 되어 있지 않기 때문에 캐시미스가 굉장히 많이 일어나고, 서로 다른 데이터가 묶여 있기 때문에 병렬처리도 굉장히 힘듭니다. 이것을 데이터 중심 디자인 ( Data Oriented Design, DOD ) 으로 바꿔 본다면 밑의 그림과 같은 형태가 됩니다.


같은 종류의 데이터를 연속적으로 묵어놨기때문에 캐시미스도 적어지고, 병렬성도 높아졌습니다. 처리 효율은 당연히 올라가겠죠. 다음은 DICE에서 발표한 자료입니다. 실제 어떤식으로  OOD에서 DOD 형태로 코드가 변경되는지 간단한 예가 있습니다.

이하 관련 자료도 한번씩 보시면, DOD가 어떤것인지 대충 감을 잡을수 있을겁니다.

관련 자료 : Multiprocessor Game Loops : Uncharted2.pdf
관련 자료 : http://gamesfromwithin.com/data-oriented-design-now-and-in-the-future
관련 자료 : Pitfalls_of_Object_Oriented_Programming_GCAP_09.pdf
관련 자료 : Practical Examples in Data Oriented Design
관련 자료 : http://www.asawicki.info/news_1422_data-oriented_design_-_links_and_thoughts.html
관련 자료 : http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

출처 : http://www.lameproof.com/zboard/zboard.php?id=bbs2&no=790
출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&no=204&z=

+ Recent posts