'입력'에 관한 질문입니다.
한꺼번에 질문을 두 개나 올리네요.
처음 C 프로그래밍을 시작하면 보통 입력을 scanf 함수를 이용해 받는데,
전 iPhone 게임 애플리케이션을 직접 개발해보기 전까지
입력이 모두 이런 식으로 이루어지는 줄 알았습니다.
항상 사용자로부터 입력이 있을 때는 입력이 완료될 때까지 대기하는 식이요.
하지만 여러 프로그램들이 보여주듯, 실제로는 마우스를 움직이는 동안,
키보드를 움직이는 동안에 음악이 나오거나 영상이 나오는 등
한 번에 여러 작업을 수행할 수 있습니다.
예전에 읽어본 C# 자료에선 이를 위해서는 '멀티스레드'라는 개발 방식을 알아야 한다고 설명되어있어서, 이렇게 한꺼번에 두 개 이상의 작업을 하는 경우는 반드시 멀티스레드를 이용해야 한다고 생각했었는데,
최근에 찾아본 다른 글로는 일반적인 게임은 웬만해선 스레드를 여러 개 만들지 않는다 하더군요.
말이 좀 정리가 안 되는 느낌이지만 질문드리려는 건,
저는 게임 내의 몬스터가 100마리, 플레이어가 1명이면 스레드가 101개 필요한 줄 알았는데
읽어보는 글을 보니 그게 아닌 것 같습니다.
질문입니다.
1. 지금까지 배운 프로그래밍 개념이 순차적 프로그래밍인지라, 아직 이벤트에 대한 이해가 온전하지 않은 것 같습니다. 도대체 어떻게 해야 그런 프로그래밍이 가능한지... 이 질문은 좀 모호한 감이 있네요.
2. 일반적인 게임 개발 루틴이 다음과 같다고 알고 있습니다.
while (입력()) { 논리진행(); 업데이트(); }
아직 저는 이 말이, 입력 함수를 완전히 완료하기 전까지 논리진행 함수를 실행할 수 없다는 말로 보입니다. 입력에 scanf()를 집어넣은 느낌이라고 해야 하나요?
죄송스럽게도 굉장히 이상한 질문이지만, 떠오르는 게 있으시다면 답변해주시면 감사하겠습니다.
KLDP 분들의 도움을 구합니다.
다시 한 번 읽어주셔서 감사합니다.
이벤트라고 해서 특별한 건 없습니다. 루프 돌때마다
이벤트라고 해서 특별한 건 없습니다.
루프 돌때마다 이벤트큐가 비었는지 차있는지 검사하고 차있으면 다 처리해서 비워주면 됩니다.
비었으면 그냥 할거 하고 다음 루프로 넘어가면되고요.
답변 감사합니다.
좀 더 이벤트에 대한 모델을 생각해보고 다시 한 번 질문드려보겠습니다.
저는 이렇게 생각했습니다.
.
scanf랑 별다를것은 없되 입력이 없으면 그냥 곧바로 리턴하는 거라고 생각하셔도 됩니다.
사실 스레드라는것도 개념적으로 생각하면 마찬가집니다. 몬스터 한마리 플레이어 한명 이것을 두개의 스레드로 구현할 수 있다면, 그 두 개의 스레드가 할 일을 하나의 스레드에서 번갈아가면서 수행하면 하드웨어가 충분하다고 가정할 경우 거의 동일한 결과가 나오겠지요. (엄밀히 말하면 양자는 전혀 다른 것이지만, 대충 개념적으로 보면 이렇다는 겁니다.) 멀리 갈 것도 없이 20~30여년전 멀티스레딩같은건 상상도 못할 시절에는 게임 프로그래밍을 어쩔 수 없이 그런 방식으로 할 수밖에 없었습니다. 루프에 몰아놓고 쪼개서 처리하는..
다만 scanf가 문제가 되는 것은 입력이 들어오기 전까진 블로킹된다는 건데, 그렇지 않은 함수를 쓰면 그만인 것입니다. 즉 그냥 계속 루프를 돌면서 _kbhit()를 호출하는 상황을 생각하시면 되지요. 키 입력이 없으면 원래 하던 일을 계속 하고 말이죠. 대기가 필요한 다른 입출력 함수들도 마찬가지죠. 대개는 논블러킹 방식으로 처리 가능한 대안이 함께 존재합니다.
--
답변 감사합니다.
_kbhit() 함수가 제가 생각하는 문제의 중요 키워드였네요.
소중한 답변 감사합니다.
저는 이렇게 생각했습니다.
댓글 달기