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

0. 시작하면서...


강좌를 많이 건너뛴듯합니다. 맹장염이 갑자기 걸리는 바람에 또다시 날짜를 넘겨버리고 말았네요. 역시 나이 먹으니 잘먹고 잘생활하는 게 중요한거같습니다. 애들도 크고 좀더 제대로된 내집을 좀 마련해 보려고 식비라도 줄여 돈을 아끼려 몇달간 라면만 먹고 살았더니 내장일부가 썩고 맹장은 완전히 썩어서 결국 수술을 하게 되었습니다. 내장이 썩어 간다는게 생각보다 끔찍하더군요. 내장곳곳이 검게 그을듯한 모습이 좀 끔직하더군요. 젊은 분들도 마찬가지겠지만 마흔넘어서는 되도록 라면같은 음식은 자주 먹어선 안되겠다는 생각이들었습니다.

운이 없는 지 좋은 건지는 몰라도 6인실 병실에 저말고 모두 시한부 판정받은 암환자 분들만 모여있는 방으로 배정을 받았습니다. 그런분들하고있다보니 인생이 참 별거없다는 생각이 들더군요. 그리고 우리의 시간은 매우 한정되 살고있다는 생각도들고요. 그러기 때문에 잠시도 무의미해게 하기 억지로 싫은걸하고 살기엔 너무 짧다는 생각도 들었습니다. 잠시나마 억지로 돈을 아껴가며 무리하게 살았던 제가 어리석었다는 생각이 들었습니다.


1. coroutine(동시루틴)


언어에 따라서 컴파일러 차원에서 지원해주는 개념입니다. 유니티의 자바스크립트의경우는 컴파일러 차원에서 코루틴을 지원해줍니다. 

StartCoroutine 함수에 인자로 코루틴을 호출하는 형태로 넣어줍니다. (언제든지 yield문을 만나면 중간에 함수에서 일시적으로 나올수있도록 함수를 호출 하라는 뜻)


예>


...

StartCoroutine(WaitAndPrint(2.0)); 

...



그러나 유니티의 자바스크립트에서는  만약 호출되는 함수측에 yield 구문이 존재하면 자동으로 StartCoroutine을 하는 해주게됩니다. 유니티엔진에서 사용되는 자바스크립트는 언어차원에서 코루틴을 지원하기 때문입니다. 여기서 쓰인 StartCoroutine는 이전의 소스와 호환을 유지하기위해 존재할뿐 별의미는 없습니다.( 생략해도 됩니다!)

표준 자바스크립트(ECMA script)는 아직 언어수준에서 코루틴을 지원하고 있지는 않습니다. 차기 버전에서 부분적으로 코루틴을 지원할예정이라고합니다.

물론 코루틴이라는게 언어차원에서 지원하지않는다고 못할것은 없기 때문에 관련 라이브러리등이 나와있습니다.


일반적인 함수호출은 함수가 종료되어 return이 되면 호출했던 측으로 돌아와 실행을 재개하지만 코루틴으로 호출이되면 종료되지않아도 yield를 만나면 언제든지 이전 호출 단계로 다시 돌아왔다가 적당한 시점에(게임에서는 그 다음 애니메이션 프레임루프인경우가 대부분임, WaitForFixedUpdate 같은것을 써서 실행 타이밍을 고정프레임으로 지정할수도 있음) 그다음부터 다시 실행을 재개하는 방식입니다.


2. 동시 루틴 적용예


아래 예제에서 WaitAndPrint함수는 그안에 yield구문이 존재 하므로 컴파일러가 알아서 코루틴으로 호출을합니다.

16번 라인은 주석처럼

StartCoroutine(WaitAndPrint(2.0)); 과 같고 또한


StartCoroutine( "WaitAndPrint",2.0); 과도 같습니다.





위의 소스에서 화살표옆에 있는 숫자들은 실행의 순서를 표시한것입니다. 색깔별로 화살표를 구분했는데요 그 이유는 색깔별로 실행단계의 평행성을 구분 지어 놓은것입니다. 

예를 들어 3번 실행단계 이후에 4번 실행단계가 오는 것은 이 자바스크립트안에서는 순차적으로 바로 다음 단계이지만 그사이에 다른 실행 단계들이 끼어 들어 올수 있는 일종의 시간의 틈새 역활을 해주게됩니다.(이부분의 평행 세계 이론에서 나오는 시간의틈의 개념과 많이 유사합니다. )


이 자바스크립트소스가 하나의 실행컴포넌트로써 동작하는 것은 하나의 평행세계가 되고 이세계에서는 다른 평행셰계가 틈세로 겹쳐있지만 전혀 인지를 못하는 것이지요.(마치 우리가 다른 평행세계의 나를 전혀 알수없듯이 말이죠.)


[실행결과]





3. 그럼 평행세계를 구현해서 멋에 쓰게요?


맞습니다. 쓰얄대기 없는 짓일수도있습니다. 그리고 코루틴은 엄밀히 말해서 멀티쓰레드 처럼 마법이 아닙니다. 그냥 조잡해 보이는 단일쓰레드 눈속임이라고 무시해버릴수도 있습니다. 더구나 이거 안쓴다고 경찰출동 할일도 없고요. (이거 안쓰고도 게임 만드는데 전혀 지장없습니다.^^)

그러나 비동기적인 방식으로 처리해야하는 많은 게임상의 로직을 복잡한 추상클래스나 상속 다중상속들으로 해결하는 기존의 객체지향적인 방법론들이 꼭 정답이라는 생각을 하기에는 우리의 상상력이 너무 삭막해지지않을까? 하는 잉여로운 생각을 해봅니다.






혹시 시간 되시면 영화 소스 코드를 한번 보시고 시간의 틈사이에 존재 하는 사바 세계에서 헤메이는 주인공처럼 코딩을 시작해보시는 것은 어떨지요.^^; 











댓글을 달아 주세요

  1. neolith 2012.09.25 11:19  댓글주소  수정/삭제  댓글쓰기

    코루틴을 이용할 경우의 장점은, 오브젝트의 행동을 (시간순서=코드순서) 로 표현할 수 있다는 것이지요.

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

      오! 한방먹었습니다. 정확하면서도 아주 간단명료하게 찝어내어주세요^^;
      근데 아이디가 예전 하이텔게제동에서 많이 본거같은데...아이디가 제가 아는 그분이 맞나요?

  2. neolith 2012.09.25 16:31  댓글주소  수정/삭제  댓글쓰기

    예. 김학규입니다 :)

  3. 김용준 2012.09.25 18:03  댓글주소  수정/삭제  댓글쓰기

    전주의 맛난 음식들 놔두고 라면같은거 드시지 마세요~~

  4. Favicon of http://rhea.pe.kr/ Rhea 2012.10.04 15:45  댓글주소  수정/삭제  댓글쓰기

    으억, 추석 연휴동안 쾌차하셨기를 바랍니다.