간단한 게임의 경우 게임 루프에 대한 별도의 스레드가 필수입니까?


10

게임 개발이 처음입니다. 배우기 위해 안드로이드 플랫폼 에서이 게임을 재현 하고 있습니다. 위의 링크에서 게임 플레이 비디오를 볼 수 있습니다. 간단한 게임입니다.

게임 개발을 시작하는 방법에 대한 많은 기사를 읽었으며 거의 ​​모든 게임은 별도의 스레드에서 게임 루프를 사용하는 것이 좋습니다. 그러나이 특정 게임의 경우 별도의 스레드를 시작해야합니까?



이것은 Android에 관한 것이므로 복제본인지 확실하지 않습니다. Java 기반 플랫폼에서의 스레딩에 대한 다른 고려 사항은 해당 질문과 다릅니다.
Sean Middleditch

답변:


8

게임 루프는 단순 하기 때문에 일반적으로 권장 됩니다. 루프를 사용하여 거의 모든 게임을 올바르게 개발하고 실행할 수 있으며 대부분의 게임이 제대로 작동하려면 게임이 필요합니다.

예를 들어, 대부분의 물리 엔진은 적절한 시뮬레이션을 위해 안정적인 지속적인 업데이트가 필요합니다. 애니메이션 및 기타 동적 컨텐츠 및 그래픽은 매번 변경 될 때마다 업데이트해야합니다 .

이제 루프가 별도의 스레드에서 실행될 필요가 없습니다. 실제로 대부분의 게임은 단순성을 위해 메인 스레드에서 루프를 실행합니다. 내 안드로이드 프로젝트 조차도이 원칙을 따릅니다.

여기서 실제 질문은 어떤 대안 제안합니까? 입력을 안정적으로 얻는 방법, 업데이트를 수행하고 적합한 프레임을 그리는 방법에 대한 다른 아이디어가 있다면 계속하십시오! 그렇지 않으면 게임 루프가 가장 쉬운 방법 일 수 있습니다.


대안은 메인 스레드 자체를 사용하여 화면을 업데이트하는 것입니다. 모든 작업이 직렬로 이루어지기 때문에 플레이어는 동일한 색상 볼을 가로 질러 스 와이프 한 다음 모든 터치 된 볼이 사라지고 나머지 볼은 교체 볼과 함께 중력에 빠집니다.
jin

루프가 필요한지 묻지 않습니까? 주요 관심사는 별도의 스레드에 있어야하는 경우입니다. 맞습니까?
AturSams

1
옳은. 내 질문은 루프가 아닌 스레드에 관한 것입니다. 그런 간단한 게임 (나는 그런 게임을 할 수 있기 때문에 운이 좋을지라도)에 대해 새로운 스레드를 생성해야합니까 아니면 모든 주요 스레드에서 수행 할 수 있습니까?
jin

1
아니요, 필요하지 않습니다. 당신이 가지고 루프를 , 다음 생성 할 필요가 없습니다 두 번째 루프는 .

@jin 당신은 정말로 제목과 질문을 쓰는 방법을 바꿔야합니다.
vallentin

5

아니요 , 별도의 스레드가 필요하지 않습니다. 너무 강렬한 일을하지 않으면 (우리가 보여준 게임의 경우와 같지 않음) 모든 것이 메인 스레드에서 수행 될 수 있습니다.

많은 처리를 수행하거나 UI / 입력이 응답하지 않는 문제가 발생하는 경우 두 번째 스레드가 필요합니다. 예를 들어,보다 복잡한 게임에서는 AI가 다음 움직임을 계산할 때 UI / 입력이 응답하지 않게하고 싶지 않습니다. 게임이 주로 사용자 입력에 반응하고 비주얼을 업데이트하는 것처럼 보이므로 두 번째 스레드는 필요하지 않습니다.


"루프가 필요합니다"라는 원래 질문에 대한 답변.

아니요 , 그러나 대안은 더 복잡하고 구현하기가 어렵고 거의 사용되지 않습니다.

게임은 정의상 대화식입니다. 최소한 입력 대기 및 출력 업데이트입니다. 가장 간단한 방법은 with 루프입니다. 이를 위해 새로운 스레드를 생성 할 필요는 없습니다.

언급 한 게임은 단순 해 보이지만 대화 형 시각 효과와 사운드가 있으며 사용자 입력에 따라 지속적으로 업데이트합니다.

게임 루프에 대한 대안도 많지 않습니다. 어떤 종류의 인터럽트 기반 시스템이 가능할 수 있습니다. 그러나 이러한 시스템은 복잡성을 증가시키고 결정론과 같은 다른 요소를 줄입니다. 게임 루프가 매우 일반적인 이유는 구현하기 쉽고 이해하기 쉽고 유연하며 훌륭한 일을하는 것입니다.


낮은 수준의 인터럽트가 발생한 유일한 시간은 특정 HW 작업이 완료되고 CPU / OS가 제대로 처리 할 수 ​​있도록 통지해야 할 때였습니다 (디스크에서 메모리로 데이터를 읽은 다음 준비가 완료되었다는 알림을 받아 반환 할 수 있음) 응용 프로그램을 제어하고 처리 할 수 ​​있도록) 그래서 나는 당신이 무엇을 의미하는지 알지 못하고 단순히 잘못 해석했습니다.
AturSams

2

실제 질문에 대한 답변 (게임 루프는 별도의 스레드에 있어야 함) :

사람들이 종종 별도의 스레드를 사용하도록 권장하는 이유는 UI 상호 작용을 방해하기 위해 많은 처리를 원하지 않기 때문입니다. 당신은 별도의 스레드가 필요한 경우 알 수있는 유일한 사람입니다 당신의 게임. 현재 디자인의 주요 게임 루프가 UI의 응답 시간을 방해 할 수 있다면 엔진과 프레임 워크에 전적으로 달려 있습니다. 다르게 생각할 이유가 없다면 일반적으로 (작은 프로젝트에서는) 그렇지 않다고 생각합니다.

코드를 별도의 스레드로 유지하는 또 다른 이유는 코드를 모듈 식으로 단순하게 유지하기 위해서입니다. 서로 관련이없는 두 개의 코드 조각을 혼합하면 장기적으로 코드를 읽기 어렵고 유지 관리하기 어려워 질 수 있습니다.

게임 루프는 별도의 스레드에서 실행해야합니까? 혹시. 응답 시간이나 코드에 문제가 있고 많은 처리와 상관없이 응답하기 위해 여러 UI 항목이 필요하거나 단순히 디자인상의 이유로 동시에 발생하는 특정 작업으로 코드를 나누고 싶다면 함께 진행하십시오. 그러나 고급 프로그래밍 실습으로 간주됩니다 .

간단하지만 설명하기 어려운 예는 2 인용 게임입니다. 사용자 입력을 처리하고 플레이어 캐릭터 인스턴스의 상태 변경으로 변환하는 클래스의 두 인스턴스를 실행할 수 있습니다.

일부 프레임 워크는 ActionScript3.0과 같은 이벤트 및 인터럽트 기반 시스템을 사용하도록 권장 / 요구합니다. 이러한 경우 루프 코드는 일반적으로 OnEnterFrame이벤트 또는 초당 20-60 또는 120 회 발생하는 유사한 이벤트 로 이동합니다 .


원래 질문에 대한 답변 (주 루프가 필요합니까) :

그것은 모두 프로그램 카운터 로 귀결됩니다 . 미리 결정된 시간 이상 실행되는 코드를 생성 하지 않는 게임을 만드는 경우, 사용자의 PC에 이미 처리 한 지침과 변경 될 수있는 사항을 반복하도록 요청해야합니다. 그 동안의 상태는 게임의 오브젝트와 글로벌에 저장된 값입니다.

지시 사항을 반복해야한다는 것을 알고 있으므로이 태스크를 완료하고 동일한 지시 사항을 계속 처리하는 몇 가지 방법이 있습니다. 이 모든 방법에는 프로그램 카운터를 현재 관련 명령으로 다시 이동시키는 것이 포함됩니다. 코드를 반복하게하는 가장 일반적인 제어 흐름 문을 루프라고하며, 다른 하나는 goto현대 코드에서 거의 사용되지 않으며이 경우에도 비슷한 영향을 미칩니다 (완전히 사용자와 관련이 없음).

따라서 이전 질문에 대답하려면 루프가 필요합니까? 예, 그렇습니다


1
내가 아는 한 AS3와 같은 이벤트 기반 프레임 워크에는 여전히 게임 루프가 있습니다. 이벤트 시스템을 구현하는 프레임 워크가 아닌 하위 레벨 인터럽트에 대해 이야기하고 있습니다.
MichaelHouse

흠 .. 사람들이 게임에서 하위 레벨 인터럽트를 사용하지 않는 것 같아 AFAIK는 주로 CPU에서 IO 작업을 모니터링하는 데 사용됩니다. 프레임마다 여러 명령을 실행 한 다음 결과를 렌더링하도록 HW에 알리는 대신 폴링없이 사용자 입력 또는 하드웨어 활동에 응답하는 설계 실습으로 더 높은 수준의 추상화를 생각했습니다.
AturSams

1
예, 사람들은 더 이상 자주 사용하지 않습니다. 내가 말했듯이, 그들은 사용하기가 어렵고 지금 우리는 일을하는 훨씬 더 좋은 방법이 있습니다. 나는 당신이 말하는 것을 이해하고, 분명히 생각하는 다른 방법이지만, 그것은 같은 유형의 루프 아래에서 다르게 나타나는 표면에만 있습니다.
MichaelHouse

IO 인터럽트를 사용하는 커널 수준 이벤트에 대해 이야기하지 않는 한 @ Byte56에 동의합니다.
concept3d

1
나는 알고 있지만 대부분의 작업은 표면 아래에서 동일합니다 (내가 말했듯이 프로그램 카운터의 값 변경). 이것은 비밀이 아니며 대답에서 지적했습니다. 이벤트 기반 프로그래밍은 다른 이벤트가 발생할 때 프로그램 카운터를 다른 기능으로 이동하기 때문에 다르게 보입니다. 분명히 이러한 이벤트가 최근에 발생했는지 확인하기위한 루프 폴링이있을 수 있지만 디자인 원칙에 따라 다르게 보입니다.
AturSams

0

여기에 다른 사람들의 대답을 추가하기 위해 아무도 언급하지 않은 것 : 두 번째 스레드에서 게임 루프를 실행할 위험이 있고 응답이 없으면 OS가 응용 프로그램을 종료 할 위험이 있습니다. 따라서 별도의 스레드를 사용하는 것이 좋습니다. 따라서 (예를 들어)는 NDK의 native_app_glue.c/ .h급부상 루프에 대한 별도의 스레드를.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.