본문 바로가기
끄적끄적

[일상] 게임 스레드 분할 방법 궁금

by 소리쿤 2022. 7. 6.

문득 상기 던전앤파이터 업데이트 내역을 보고, 제목과 같은 의문을 가졌다.
얼추 요즘 게임은 둘을 분리해서 사용하는 경우가 많다고 알고 있었는데, 막상 흐름을 생각해보니 어떻게 하는 거지 싶어
생각해보기로 했다.

단순히 생각하면 로직 스레드가 한 프레임에 해야할 일을 마무리하면, 버퍼같은 곳에 담아두고,
렌더 스레드는 프레임마다 로직 스레드에서 꺼내와서 렌더하면 될 것 같다.

> 실제로 회사에서도 이런 식으로 쓴다고 함

근데 CPU 개수가 늘고 있는데
로직, 렌더 스레드 등처럼 스레드의 행위를 기반으로 나누게 되면
언젠간 논리적으로 스레드를 나눌 수 없겠다는 생각을 했다.

https://www.youtube.com/watch?v=M1e9nmmD3II

Logic / Render 별로 나누는 것보단,
여러 개의 스레드가 개체에 대하여 동시에 Logic을 수행하고,
모든 스레드가 수행을 마치면 다같이 Render를 수행하는 등의 방식을 제시된 영상임

늘어나는 CPU 갯수에 대응하기 좋은 방법인 듯.

문득 유니티 Job System이 생각났는데,
Job System에 대해 알아보자.. 알아보자.. 해놓고 귀찮아서 던져놓고 있었으니 이 기회에 알아보도록 하자.

https://www.youtube.com/watch?v=3o12aic7kDY

아래 유튜브는 잡 시스템을 이용하여 여러 번의 무거운 연산을 수행하는 실험이다.

Job System이 자동으로 워커 스레드에다가 일 던져서 처리하는 모습을 볼 수 있는데, 프로파일러를 보면 성능도 상승하고 기존 스레드처럼 UnityEngine 내 API를 쓸 때 터지는 현상도 없어보임.

엥.. 그럼 진짜 이것만 있으면 멀티스레딩할 수 있나...? 라는 의구심이 든다.
엄청나보이는데 왜 풍문으로만 들었지

https://docs.unity3d.com/kr/2018.4/Manual/JobSystemOverview.html

 

C# 잡 시스템 개요 - Unity 매뉴얼

Unity C# 잡 시스템을 통해 사용자는 나머지 Unity 기능과 잘 연동하고 수정 코드 작성을 용이하게 해주는 멀티스레드 코드를 작성할 수 있습니다.

docs.unity3d.com

항상 문서만 보고는 애매함

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=canny708&logNo=221557618976

 

C# Job System

C# Job System은 유니티의 새로운 멀티 스레드 프로그래밍 기법입니다. 구조적으로는 멀티 스레드가 맞...

blog.naver.com


대충 유니티의 Job System은 스레드를 생성하는 게 아니라,
기존에 유니티가 생성해놓은 Worker Thread에 사용자의 Job을 의탁하는 형태의 시스템인 듯함

유니티의 워커 스레드에 탑승하는 개념이므로 무거운 기능의 스레드를 파기엔 애매하고,
정말 하나의 일 단위 (Job)를 추가하는 데에 사용하는 것이 적절할 듯하다.
> 위에서 말한 '개체'의 단위가 되기 좋아보인다.

또한 클래스를 사용할 수 없는 등 제약이 심해 범용적으로 여기저기 사용하긴 힘들어보이고,
Job System을 사용할 수 있도록 환경을 구축해야 사용이 가능해보인다.

https://www.youtube.com/watch?v=IzTbKdL8w8Q&t=2497s

간단한 사용 예제

https://www.youtube.com/watch?v=yi4nTDQcC78

ECS는 뭐고,
버스트 컴파일러는 뭐임? 담에 하자.