2014년 5월 12일 월요일

싱글스레드 게임루프



사실 새로운 아이디어는 아닌데.. 이렇게 철저히 게임루프 전체는 싱글 스레드로 구성하고 나머지를 전부 job(또는 task) 시스템으로 만드는 엔진을 거의 못봤네요. 뭐 결론적으론 dx11 드라이버들이 멀티스레드를 잘 지원안한게 문제였을수도 있지만요...

비디오에서 잠시 말했던 IRC 대화방은 여기입니다. 많이 놀러들 오세요
IRC 서버:
irc.ozinger.org
(UTF-8, 포트 6661–6669, 8080 /
SSL: 16666–16667)
채널들:#GDF
#indie

댓글 4개:

  1. 포프님 동영상 잘 보았습니다.
    논리적인 태스크 별로 스레드를 실행하도록 만들면 코드를 이해하기에도 쉬울 것 같습니다.
    한 가지 질문드리고 싶은게 있는데요.
    멀티 스레드 프로그래밍하면서 가졌던 질문인데
    제가 알기론 힙에서 메모리를 할당할 때 락이 걸리는 것으로 알고 있습니다.
    이러한 경우에 락을 피하기 위해 힙을 스레드 별로 만들어 주는게 좋을까요?
    아니면 스레드마다 자동 변수로 사용하기 적당한 크기의 배열로 생성하는게 좋을까요?
    스택에 큰 크기의(4kb 이상) 배열을 선언하는게 성능이나 안전성에 문제는 없을까요?
    또는 힙에서의 락이 고려할 필요가 없을 정도로 빠른건지 궁금합니다.

    답글삭제
    답글
    1. 1) 우선 스택은 최대한 이용하는게 좋습니다. 그리고 스택 크기는 보통 컴파일시에 바꿔줄수 있는데.. 4kb 이상이라고 별로 크게 보이진 않는데요?

      2) 스레드마다 힙을 만들어주는 경우는 본적이 없구요.. thread local변수를 따로 선언해주는 경우는 봤어요.. 콘솔 게임쪽에서는 보통 OS에서 제공하는 new/delete를 쓰는대신 미리 메모리를 다 잡아두고 거기서 custom allocator를 써서 메모리 할당을 주로 해요.. .OS보다 훨씬 더 단순하고 빠르게 내부구현이 가능하고.. 이렇게 custom allocator를 잡아주면 필요에 따라 스레드마다 메모리 힙을 구현해줄수도 있겠지만요..
      3)
      정말 미친짓으로는 게임루프가 도는도중엔 아예 메모리 할당 삭제가 안일어나게 하는 법도 있습니다. 실제 블루캐슬 게임스(현 캡콤 밴쿠버)에 있을때는 그렇게 코딩을 했고요. 메모리 할당/삭제는 로딩중에만 일어남 -_-;

      4)
      어쨌든 제 생각은 힙에 걸리는 락을 걱정하기 전에 다른걸 먼저 최적화 한뒤 그게 정안되면 손을 댈거 같네요. 여태까지 게임 만들어본 경험으로는 custom allocator를 돌리긴 했지만(그리고 당연히 그 allocator내부적으로 lock을 걸긴 했지만) 스레드별로 힙을 만들정도로 이게 성능문제가 큰 적은 없었어요. 다른걸 먼저 최적화했죠.

      삭제
    2. 이상하기도 하고 사소한 질문 같아서 누구에게 물어 보기가
      망설였는데 답변 감사합니다.
      작년 말부터 우연히 이곳을 알게되었습니다.
      동영상 잘 보고 있습니다.

      삭제
    3. 다 그런 망상(?)들을 하다가 새로운 방법도 찾아내고 그러는게 프로그래머죠.. 저도 이상한 망상들 많이 합니다. 그걸 서로 토론하면서 더 나은 방법을 찾는걸 좋아하죠.

      삭제