DOD는 데이터 지향 디자인이고, 캐시미스를 줄이는 형태의 코드 디자인이라 요약할수 있음.

OOP는 객체 지향 프로그래밍이고 코드를 명령어 목록이 아니라 객체들의 집합으로 보는 프로그래밍으로 요약할수 있음.


일단 OOP와 DOD는 다른 패러다임이 맞음.

DOD는 데이터의 구조를 캐시친화적으로 잡아라가 원칙임.

OOP는 유명한 SOLID 원칙에 따라 짜여짐.

DOD는 가능하다면 객체를 분해하더라도 OK인데 

그렇게 연결된 데이터와 메쏘드가 분리되면 OOP에서 말하는 캡슐화가 깨진거임.


객체지향 코드로 짜여진 프로그램의 경우에는

a->GetB()->GetC()->GetD().x 

뭐 이런식으로 간접 참조가 많이 일어나게 되는 경우가 의외로 많음.

저게 좋은 코드냐? 하면 전혀 아니라는게 바로 그 문제임.

결국엔 간접 참조를 여러번 하면서 램 여기저기를 돌아다니다가 원하는 x에 도달하는게 위의 코드임.


캐시미스의 가장 큰 문제는 프로파일러로 문제를 찾는게 힘든것도 있고,

멀티쓰레딩까지 적용을 하더라도 퍼포먼스가 별로 오르지 않는데 있음.

결국 CPU 레지스터가 캐시에서 값을 못찾으니 아이들 하면서 시간을 잡아먹는거임.

간단하게 요약하면 구시대의 최적화 방법이라고 올라오는것중에 루프내에서 생성하지말고 루프 밖에서 생성하라 뭐 이런게 있음.


Vec temp;

for(auto var : list)

{

temp = var->Get()->GetVec();

}


뭐 이런 코드가 가장 큰 예임.

이런식으로 최적화를 하더라도 간접 참조를 하는순간 루프는 힙의 다른부분에서 데이터를 가져올거고 왔다갔다 하면서 시간 다 잡아먹는다는거임.


그럼 DOD는 어디서 볼수 있냐?

가장 유명하고 널리 쓰이는 예제는 물리엔진에서 쓰는 island라는 기법임. (물론 가장 유명한건 아닐수도 있음 ㅋㅋ)


물리엔진은 빠른속도가 생명이다보니 어쩔수 없이 DOD를 쓴건데

물체의 위치와 속도를 각각 벡터나 배열로 만들고

실시간으로 여러번 불리는 연산 도중에는 모든 데이터들이 램상에 인접하여 캐시미스를 줄이는 방법의 디자인임.

이게 뭐냐면 걍 ECS의 컴포넌트와 시스템임.


전통적인 엔진 개발자들은 애초에 핵심은 DOD로 코드를 짜왔고, 

그건 기본이기 때문에 DOD가 적용되더라도 OOP로 엔드 유저들은 편하게 쓸수 있게 만들어온거임.


유니티에서 ECS를 알리고, DOD가 유행하는건 물리엔진이 아닌 다른 코드들도 이제 성능이 모자라다고 보기 때문에 그런게 아닐까 싶음.


일부 코드를 DOD로 짜고 OOP로 감싸느냐, 전체 코드를 DOD로 짜느냐의 차이인데

모든 코드를 DOD를 적용시킨걸로 짜려면 C++ 존나 3~4년은 공부해야할걸?

아님 대학에서 컴구조, OS를 열심히 공부하거나...


몇년 전에 포프TV에서 DOD 이야기 나왔을때도 당연히 저렇게 되면 아무나 코드를 짜는게 힘들어지니 

OOP하고 공존할거 같다 이런식으로 이야기 나왔던거 같은데 뭐 그렇다고 ㅇㅇ.


흠터레스팅...