프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 밥을먹는선비

0. 들어가며...

물리학에서 물질은 중성자, 양성자,전자 3개로 되어있습니다.(물론 이거말고도 더있는것으로 알고있습니다만..) 3가지 요소는 각각의 속성을 가지고있습니다.

이중에서 중성자는 주로 질량에 관여는하는 요소이고 나머지 두개는 물질의 성질을 결정하는 역활을 한다고합니다.(양성자와 전자 갯수에의해 원자가 결정됨, 단 중성자만 질량에 관여하지는 않습니다.)


사실 갑자기 소프트웨어개발 관련글쓰면서 웬 물리? 할수도있겠지만..


우리가 많이 쓰는 MVC 패턴을 보면 이것들과 많이 닮아있다는것을 알수있습니다.


Model은 중성자 ,View는 양성자, Controller는 전자가 하는 역활이 비슷합니다. 


학생들을 교육하다가 느끼는점은 프로그래밍언어를 배울때 어떤 언어가 배우기 쉬운것인가 하는 부분인데...

Model요소가 가장 배우기 어렵고(사실 너무 무겁죠..) 그다음이 Controll 그리고 제일 쉬운것이 View입니다.


사실 모델에 비해 상대적으로 배우기쉬운 VC만으로 코드를짤수도있으나 그런 코드는 마치 반물질처럼 코드가 만들어 지면서 부식이되어 더이상 쓸모없어지는 코드가 되어져 버림니다. 매우 불안정한 상태의 코드가 만들어 집니다. 그래서 아주 유지보수는 생각도 못하는 소모적인 코딩이 됩니다.

그러나 게임프로그램밍처럼 아주 에너지가 넘치는 작업을 하기 위해서는 무턱대고 중성자로 무질서를 제어 한다는것도 방법은 아닙니다.

현재 물리학에서 반물질을 연구하는것처럼 소프트웨어 개발에서도 코루틴같은 반물질을 도입해서 그것을 마음대로 제어만 할수있다면 엄청난 생산성의 향상을 가져올수도 있습니다.


이번에 kgc강연에서 코루틴관련해서 발표를 했었는데 가장 많이 나왔던 질문이 이것 도대체 어따쓰냐는 질문이 많았던거같습니다.(실제 사용예가 궁금해 하시는 분들이 많았습니다^^)


1. 빗나간 탄도의 정리 문제


슈팅게임같은 데서 목표물을 명중시키지못한 총알들은 화면밖으로 사라지게되는데요. 이런것들을 정리하기 위해서 일정시간이되면 메모리상에서 객체를 지워버리는 처리가 필요합니다.




가장 쉽게 생각할수있는 코드가 다음과 같습니다.





델타타임값을 계속 누적시켜서 일정시간이 경과 됐는지를 판단하여 시간이 넘었으면 객체를 지워버리는 코드입니다. 

발사후 2초동안 별일이 없으면 무조건 삭제가되도록 하는 코드입니다.

비록 이정도는 간단한 코드이지만 우리가 요구했던 일에 비하면 매우 번잡스러운 코드가됩니다. 일단 함수 두개에서 하나의 전역 변수(엄밀히 말하면 전역은 아니지만...)에 접근해서 양쪽에서 서로 읽고 쓰기등을 수행합니다.


2. 코루틴으로 문제 해결하기


이것을 코루틴을 써서 구현 해보면 다음과 같습니다.






놀랍지 않습니까? 단 2줄로 똑같은 기능을 구현했습니다. 전역변수를 쓴것도 없으며 따로 두개 이상의 함수에 따로 처리 해줄일도 없고 오직 Start함수에서 그흔한 제어 구문없이 단지 선언식으로 지정을 해준것입니다. 

또한 마치 쓰레드를 쓴것처럼 어떠한 블럭킹도 없습니다.


단, 이것은 실용적인 예는 아니고 Destroy(오브잭트,딜래이시간) 으로도 같은 일을 할수있습니다.


3. 결론


사실 코루틴을 쓰고 안쓰고가 중요한것은 아닙니다. 소프트웨어 개발은 문제 해결의 연속된 고된 작업입니다. 세상에 한가지 해법만 존재하는 문제는 없습니다. 해답에 집중하기 보다는 해법에 집중할수록 좀더 완벽한 소프트웨어가 나오지 않을까 생각합니다. 













댓글을 달아 주세요

  1. 껍데기 2012.11.05 09:22  댓글주소  수정/삭제  댓글쓰기

    코루틴 얘기는 아니지만 오브젝트 삭제는 Destory( this.gameObject, 2 ); 가능하죠

    • Favicon of https://gamedevforever.com 밥을먹는선비 2012.11.05 12:37 신고  댓글주소  수정/삭제

      이해하기 쉬운 예를 찾다보니 그렇게 됐네요. ^^;
      암튼 좋은 지적 감사합니다.

    • Favicon of https://gamedevforever.com 밥을먹는선비 2012.11.05 16:09 신고  댓글주소  수정/삭제

      관련해서 내용은 좀 수정했고요. 다음에는 간단하면서도 좀더 실용적인 예를 찾아보도록 하겠습니다.

    • Favicon of https://perpet.tistory.com perpet 2012.11.11 00:13 신고  댓글주소  수정/삭제

      저는 좋은 예시라 봅니다.
      만약 기획자가 a몬스터 b 몬스터 c 몬스터가 3초 간격으로 죽는 연출을 하고 싶다고 합니다.
      코루틴으로 하면 기획자가 스크립트로
      destroy("a";)
      yield wait(3)
      destroy("b";)
      yield wait(3)
      destroy("c";)
      하면됩니다.
      물론 Destroy(3,"a","b","c";)
      뭐 이런식으로 만들어서 기획자한테 주면되지 않나요? 할 수 있습니다.
      중요한건 매번 시퀀스 기반의 연출이 필요할때마다 그기능을 함수로 만들어서 제공해야 한다는 겁니다.
      코루틴을 쓰면 그런로직 따로 짜서 함수로 만들어서 줄 필요 없습니다.
      그게 기획자던 프로그래머든...
      코루틴 지원해주고 작은단위의 기능함수들만 주면 됩니다.

  2. TZN 2012.11.05 11:29  댓글주소  수정/삭제  댓글쓰기

    잘못된 예로 망한글

  3. Favicon of https://gamedevforever.com 대마왕J 2012.11.05 12:51 신고  댓글주소  수정/삭제  댓글쓰기

    예가 더 어려워요 으헝헝헝헝 ㅠㅠㅠ

  4. 마루 2012.11.05 13:42  댓글주소  수정/삭제  댓글쓰기

    딴지 거는거 같아서 죄송합니다만... ㅜ.ㅜ
    양성자도 질량에 영향을 줍니다. 중성자와 양성자는 질량이 거의 같습니다.

  5. 드류 2012.11.07 00:42  댓글주소  수정/삭제  댓글쓰기

    올려주신 예제에서 코루틴의 장점을 하나 더 추가 하자면,
    매 프레임마다 자동으로 호출되는 업데이트함수보다 제어에 용이해서 CPU의 자원을 덜 소비하는 장점도 있는 것 같습니다.

    • Favicon of https://gamedevforever.com 밥을먹는선비 2012.11.08 22:18 신고  댓글주소  수정/삭제

      네 ^^; 제어쪽전공하신 교수님이 그러시는데 제어쪽에선 예전부터 많이 쓰이는 개념이라고하네요.(특히 실시간 운영시스템(RTOS) )

    • Favicon of https://perpet.tistory.com perpet 2012.11.11 00:26 신고  댓글주소  수정/삭제

      그래서 ms 가 msrds 란걸 만들었습니다.
      http://msdn.microsoft.com/en-us/library/bb648752.aspx

      ccr 이라고 로봇제어처럼 분산 병렬이 극단적인 환경의 프로그래밍을위한 c# 라이브러리 입니다.
      c# 에서 코루틴으로 떡을 치는 프로그래밍 방식입니다..^^;
      오히려 이건 서버 프로그래머들에게 도움이 많이 됩니다.

    • 도플광어 2012.11.12 01:21  댓글주소  수정/삭제

      @perpet 참고하겠습니다. 좋은 정보 감사드림니다.

  6. 히이로유이 2013.04.10 11:40  댓글주소  수정/삭제  댓글쓰기

    코드가 C#일경우는 이렇게 된다고 합니다.

    public class CoRoutineTimer : MonoBehaviour {

    IEnumerator Start () {
    yield return new WaitForSeconds(2);
    Destory(this.gameObject);

    }

    void Update () {

    }
    }



    C#에선 코루틴은 언제나 아래와 같은 구문을 통해서 선언되어야 한다고 하네요.
    IEnumerator 함수이름 (인자);
    IEnumorator 는 우리말로 열거자라고 하는데, 데이터의 목록을 하나씩 넘겨줄 때 사용되는 인터페이스입니다.