'입력'에 관한 질문입니다.

HDNua의 이미지

한꺼번에 질문을 두 개나 올리네요.

처음 C 프로그래밍을 시작하면 보통 입력을 scanf 함수를 이용해 받는데,
전 iPhone 게임 애플리케이션을 직접 개발해보기 전까지
입력이 모두 이런 식으로 이루어지는 줄 알았습니다.
항상 사용자로부터 입력이 있을 때는 입력이 완료될 때까지 대기하는 식이요.

하지만 여러 프로그램들이 보여주듯, 실제로는 마우스를 움직이는 동안,
키보드를 움직이는 동안에 음악이 나오거나 영상이 나오는 등
한 번에 여러 작업을 수행할 수 있습니다.

예전에 읽어본 C# 자료에선 이를 위해서는 '멀티스레드'라는 개발 방식을 알아야 한다고 설명되어있어서, 이렇게 한꺼번에 두 개 이상의 작업을 하는 경우는 반드시 멀티스레드를 이용해야 한다고 생각했었는데,
최근에 찾아본 다른 글로는 일반적인 게임은 웬만해선 스레드를 여러 개 만들지 않는다 하더군요.

말이 좀 정리가 안 되는 느낌이지만 질문드리려는 건,
저는 게임 내의 몬스터가 100마리, 플레이어가 1명이면 스레드가 101개 필요한 줄 알았는데
읽어보는 글을 보니 그게 아닌 것 같습니다.

질문입니다.
1. 지금까지 배운 프로그래밍 개념이 순차적 프로그래밍인지라, 아직 이벤트에 대한 이해가 온전하지 않은 것 같습니다. 도대체 어떻게 해야 그런 프로그래밍이 가능한지... 이 질문은 좀 모호한 감이 있네요.
2. 일반적인 게임 개발 루틴이 다음과 같다고 알고 있습니다.

while (입력()) {
 논리진행();
 업데이트();
}

아직 저는 이 말이, 입력 함수를 완전히 완료하기 전까지 논리진행 함수를 실행할 수 없다는 말로 보입니다. 입력에 scanf()를 집어넣은 느낌이라고 해야 하나요?

죄송스럽게도 굉장히 이상한 질문이지만, 떠오르는 게 있으시다면 답변해주시면 감사하겠습니다.
KLDP 분들의 도움을 구합니다.

다시 한 번 읽어주셔서 감사합니다.

klyx의 이미지

이벤트라고 해서 특별한 건 없습니다.
루프 돌때마다 이벤트큐가 비었는지 차있는지 검사하고 차있으면 다 처리해서 비워주면 됩니다.
비었으면 그냥 할거 하고 다음 루프로 넘어가면되고요.

HDNua의 이미지

좀 더 이벤트에 대한 모델을 생각해보고 다시 한 번 질문드려보겠습니다.

저는 이렇게 생각했습니다.

mirheekl의 이미지

scanf랑 별다를것은 없되 입력이 없으면 그냥 곧바로 리턴하는 거라고 생각하셔도 됩니다.

사실 스레드라는것도 개념적으로 생각하면 마찬가집니다. 몬스터 한마리 플레이어 한명 이것을 두개의 스레드로 구현할 수 있다면, 그 두 개의 스레드가 할 일을 하나의 스레드에서 번갈아가면서 수행하면 하드웨어가 충분하다고 가정할 경우 거의 동일한 결과가 나오겠지요. (엄밀히 말하면 양자는 전혀 다른 것이지만, 대충 개념적으로 보면 이렇다는 겁니다.) 멀리 갈 것도 없이 20~30여년전 멀티스레딩같은건 상상도 못할 시절에는 게임 프로그래밍을 어쩔 수 없이 그런 방식으로 할 수밖에 없었습니다. 루프에 몰아놓고 쪼개서 처리하는..

다만 scanf가 문제가 되는 것은 입력이 들어오기 전까진 블로킹된다는 건데, 그렇지 않은 함수를 쓰면 그만인 것입니다. 즉 그냥 계속 루프를 돌면서 _kbhit()를 호출하는 상황을 생각하시면 되지요. 키 입력이 없으면 원래 하던 일을 계속 하고 말이죠. 대기가 필요한 다른 입출력 함수들도 마찬가지죠. 대개는 논블러킹 방식으로 처리 가능한 대안이 함께 존재합니다.

--

HDNua의 이미지

_kbhit() 함수가 제가 생각하는 문제의 중요 키워드였네요.

소중한 답변 감사합니다.

저는 이렇게 생각했습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.