Graphics Programming

OpenGL에서 멀티쓰레딩하기 (2/3) 본문

Season 2

OpenGL에서 멀티쓰레딩하기 (2/3)

minseoklee 2022. 4. 20. 00:38

 

https://codeonwort.tistory.com/367

 

OpenGL에서 멀티쓰레딩하기 (1/2)

회사 다니면서 내팽겨쳐둔 OpenGL 렌더링 엔진을 다시 꺼내서 손보고 있다. 그래도 엔진 프로그래머랍시고 3년을 굴렀더니 잘못된 게 너무 많이 보여서 아키텍처에 또다시 대규모 공사를 하고 있

codeonwort.tistory.com

멀티쓰레딩 1편.. 이런 글을 쓴 기억도 없었는데 블로그 정리하다 문득 발견했다;;

 

https://codeonwort.tistory.com/381

 

렌더링 챌린지 일지 1

목적도 없이 토이 프로젝트를 만드니 진도가 잘 안 나가서 세운 계획이 있는데, 바로 인터넷에서 수집한 사진들을 따라 만들어보는 "렌더링 챌린지"다. 몇 가지 기준에 따라 챌린지에 적합한 사

codeonwort.tistory.com

렌더링 관련 가장 최근 일지. 이후로 몇 달 주기로 자잘한 수정만 하다가 간만에 대규모 작업을 했다. 엔진 자체는 싱글쓰레드로 돌아갔지만 렌더 커맨드 리스트, 씬 프록시 등 멀티쓰레딩을 위한 아키텍처는 예전부터 쌓아올렸다.

 

메인 루프는 장기간 리팩토링을 거치며 이런 식으로 바뀌어왔고,

  1. 월드 업데이트 → 월드 정보를 가지고 바로 GPU 작업 실행
  2. 월드 업데이트 → 월드 정보를 가지고 렌더 커맨드를 생성해 리스트에 누적 → 리스트 실행 (GPU 작업)
  3. 월드 업데이트 → 씬 프록시 생성 → 씬 프록시 정보를 이용해 렌더 커맨드를 리스트에 누적 → 리스트 실행 (GPU 작업)

 

 

최종적으로 이런 식으로 돌아가고 있었다.

 

그래서 렌더 쓰레드만 만들어서 이렇게 돌리면 간단하게 멀티쓰레딩을 완성할 줄 알았지만 온갖 크래시, 데드락, 실행 순서 꼬임, 하이젠버그 등을 겪고 나서야 겨우 멀티쓰레딩이 제대로 돌아가게 되었다.

 

https://github.com/codeonwort/pathosengine/pull/24

 

이 토이 프로젝트에 todo가 수십 개 쌓여있지만 그 중에서도 가장 큰 todo를 처리했다. 멀티쓰레드 디버깅하다 때려치고 싶은 생각이 많이 들었는데 결국 완료하고 마스터에 머지하니 뿌듯하다.

Comments