잡 시스템 개념이 생긴게 PS3 때고, 그 이후로 AAA 개발사는 플스3에 출시하려면
걍 꼬와서라도 잡시스템 기반으로 엔진을 만듬.
잡 시스템이 뭐냐?
걍 간단하게 요약하자면
쓰레드가 많아져도 잡 단위로 잘 쪼개 놓았을때, 그 쓰레드를 다 활용해서 쓴다는거임.
유니티에도 잡시스템 추가 된게 다 그런이유 때문임 ㅇㅇ.
제발 개발자 할거면 컴공가라는 이유가
컴공에선 병렬 프로그래밍, 컴퓨터 구조, OS 등등을 배울때 관련 내용을 공부하기 때문임.
대충 요즘 개발자들은 다들 관련 내용을 들어는 보고 더미나 개인 플젝에서 테스트는 해보는 이유가 다 그런 이유때문임.
대중화 된지 못해도 5~6년은 지났다고 보면 됨 ㅇㅇ.
대충 방식을 설명하자면
예전 2코어 4쓰레드 4코어 4쓰레드, 4코어 8쓰레드 시절에는 걍 대충
렌더러 쓰레드, 피직스 쓰레드, 사운드 쓰레드, IO 쓰레드 등등으로 나눠놓고
거기서 각각 처리를 했다는거임.
그러면 사운드는 알아서 재생하고 있고, IO는 일 있을때만 하고,
그외에 ABA 문제와 연관있는 피직스 먼저 쭉 연산하고, 그다음에 렌더러 쓰레드에서 렌더링 마치고
뭐 이런 식으로 계속 진행이 되던게 옛날 멀티 쓰레딩임.
잡시스템 하면 이걸 쓰레드가 몇개든 메인 쓰레드를 제외한 나머지 쓰레드들은 할당받은 잡을 계속 연산하는거임.
예를 들어 메시 0번부터 메시 255번까지 총 256개의 "다른" 메시가 있다고 생각해보셈.
그러면 이 메시들을 쓰레드 1번부터 7번까지 적절하게 나눠서 37개씩 걍 렌더링을 하는거임.
문제는 기존의 오픈 GL이나 DX11까지도 이런식의 멀티 쓰레딩에 약점이 있어서 렌더링 하는데도 제대로 분배가 안되었고
DX12와 불칸의 시대로 넘어오면서 이런문제가 크게 해결이 됨.
그래서 윈10 출시와 함께 DX12를 유저들이 쓸수 있기 때문에 이제는 PC에서도 본격적으로 적용이 가능했던거임.
그럼 피직스는 왜 문제가 있을까?
피직스의 멀티 쓰레딩의 핵심은 브로드 페이즈에 있는데,
문제는 브로드 페이즈를 구성하는건 엄연히 기하학적 위치를 기반으로 연산을 하기 때문임.
나는 BVH를 메인 BP알고리즘으로 쓰는데, 대충 방식이 위치를 기반으로 각 노드의 관계를 잡고
노드의 바운딩 볼륨이 일정 마진값보다 더 벗어날시 트리의 새 위치로 삽입을 하는거임.
이렇게 되면 왜 문제가 생기냐면 각각의 물체들이 움직이는걸 잡으로 잡았을때
1번 쓰레드가 A물체의 위치를 트리에 삽입하는데 2번 쓰레드가 B물체의 위치를 또 트리에 삽입을 해야함.
둘다 같이 삽입을 해야하면 트리의 노드들이 연산이 덧씌워질수 있고 그래서 락을 걸어야 함.
걍 락-프리 자료구조가 아니게 되는거임. 이렇게 되면 퍼포먼스 저하가 일어남
이걸 굉장히 잘하는 회사가 NC 소프트인데, 서버에서 좁은 공간에 있는 수백? 수천개?의 캐릭터들의 충돌을 구현했더라고 ㅇㅇ.
리니지M이나 리니지 M2의 게임성은 이런데서 나오는거 같더라 ㅋㅋ.
나같은 초보개발자가 추측할만한 방법으로는 걍 그리드를 적당히 깐후에
각 셀마다 BVH를 적용하고 셀을 잡으로 잡아서 잡 시스템을 적용할거 같음.
대신 그리드 자료구조는 메인쓰레드에서 굴려야 할거 같고 ㅇㅇ.
나머지 물리 관련해서는 충돌체 페어간에 충돌 확인이나 충돌 응답이나 다 잡 하나로 할당할수 있으니까
얘네들은 별 문제 없어보임. 걍 락프리 자료구조에 잘 담아두면 알아서 잡시스템에서 처리할수 있으니 ㅇㅇ.
그외에 게임 AI나 게임 로직 같은경우에는 ABA 문제 때문에 멀티 쓰레딩을 적용하기 힘든 경우가 많다고 하더라.
그래서 잡으로 쪼갤수 있는것들은 최대한 잡으로 쪼개고 나머지는 어쩔수 없는듯?
어차피 IO나 나머지 들은 예전에도 다 멀티 쓰레딩 적용해서 개발했으니 상관 없어보임 ㅇㅇ.
근데 몇년 전부터 DOD가 각광받는건 저렇게 멀티쓰레딩을 적용하더라도
OOP로 개발했더니 프로파일러에 잡히지 않는 미친듯한 캐시미스가 발생하여
퍼포먼스를 잡아먹어 버리게 되었다 이런 이야기도 있음.
나도 몇년전에 군대가기 전에 만든 프로젝트에서 물리엔진에
메모리 아레나로 만든거랑 벡터로 만든거랑 리스트로 만든거랑 퍼포먼스가 다 달랐거든...
캐시에 서로 인접할수록 좋고, 할당/해제가 적게 일어날수록 좋은거지 뭐...
그래서 플스3시절 게임보면 기기 성능은 별 차이 없는데 라오어, GTA5 시절이랑 옛날 초창기랑 그래픽 부터 효과까지 차이가 심한편임.
멀티쓰레딩은 항상 오해의 대상인듯. 전후관계가 경직된 로직에는 못쓰는경우가 많은데 유저들은 그게 만능의 기능인줄 알고있음. '왜 ##겜은 코어하나만 갈구냐!'하면서 AAA급 개발사조차 허접취급하더라.
공부하면 할수록 NC 기술력이 대단한거 같더라고 ㅋㅋ
분할정복이랑 병렬화가 쉬운 개념은 아니지
아하 그렇구나
솔직히 지식의 견해가짧아 이해가 안되는 부분도 있지만 정말 좋은 글 감사합니다. 재밌었어요 - dc App