単純なゲームでは、ゲームループの別のスレッドが必須ですか?


10

ゲーム開発は初めてです。学ぶために、Androidプラットフォームでこのゲームを再現しています。上記のリンクでゲームプレイのビデオを見ることができます。シンプルなゲームです。

私はゲーム開発の開始に関する多くの記事を読みました。それらのほとんどすべてが、別のスレッドでゲームループを使用することを推奨しました。ただし、この特定のゲームでは、別のスレッドを開始する必要がありますか?



これはAndroidに関するものであるため、これが重複しているかどうかはわかりません。Javaベースのプラットフォームでのスレッド処理については、その質問とは異なる考慮事項がいくつかあります。
Sean Middleditch、2014

回答:


8

ゲームループはシンプルであるため、一般的に推奨されます。ほとんどすべてのゲームは、ループを使用して適切に開発および実行できます。ほとんどのゲームは、適切に機能するために1つ必要です。

たとえば、ほとんどの物理エンジンは、適切なシミュレーションのために信頼できる一定の更新を必要とします。アニメーションやその他の動的なコンテンツやグラフィックは、変更などを行うたびに更新する必要があります。別名ループを使用することで、実質的に無料で取得できるものもあります。

ここで、ループを別のスレッドで実行する必要がないことに注意してください。実際、ほとんどのゲームでは、単純にするためにメインスレッドでループを実行します。私のAndroidプロジェクトでもこの原則に従っています。

ここで本当の問題は、あなたが提案する代替案は何ですか?確実に入力を取得し、更新を行い、自分に合ったフレームを描画する方法について別のアイデアがある場合先に進んでください!それ以外の場合は、ゲームループが最も簡単な方法かもしれません。


私が考えている別の方法は、すべてのアクションが連続しているため、メインスレッド自体を使用して画面を更新することです。
ジン

だからループが必要かどうか尋ねていませんか?あなたの主な懸念は、それが別のスレッド上にある必要があるかどうかです、そうですか?
AturSams

1
正しい。私の質問は、ループではなくスレッドについてです。そのような単純なゲームの場合(そのようなゲームを作成できるのは幸運ですが)新しいスレッドを生成する必要がありますか、それともすべてメインスレッドで実行できますか?
ジン

1
いいえ、必要ありません。ループある限り、2番目のループを作成する必要はありません。

@jinあなたは本当にタイトルとあなたが質問をどのように書くかを変更すべきです。
バレンティン2014年

5

いいえ、別のスレッドは必要ありません。あなたがあまりにも激しいことをしていない場合(これは、あなたが私たちに示したゲームではそうではないようです)、すべてをメインスレッドで行うことができます。

多くの処理を行っている場合や、UI /入力が応答しなくなるという問題が発生している場合は、2番目のスレッドが必要です。たとえば、より複雑なゲームでは、AIが次の動きを計算しているときにUI /入力が応答しなくならないようにします。ゲームは主にユーザー入力に応答し、ビジュアルを更新しているように見えるため、2番目のスレッドは必要ありません。


「ループは必要か」という元の質問への回答。

いいえ。ただし、代替手段はより複雑で、実装が難しく、ほとんど使用されません

ゲームは本質的にインタラクティブです。少なくとも、それは入力を待って出力を更新しています。これを行う最も簡単な方法は、with a loopです。そのために新しいスレッドを生成する必要はありません。

あなたが言及したゲームはシンプルに見えますが、インタラクティブなビジュアルとサウンドがあり、ユーザー入力に基づいてそれらを常に更新します。

ゲームループに代わるものはあまりありません。ある種の割り込みベースのシステムが可能かもしれません。ただし、このようなシステムは複雑さを増し、決定論などの他の要因を減らします。ゲームループが非常に一般的であり、実装が簡単で、理解しやすく、柔軟性があり、優れた仕事をするのには理由があります。


私が低レベルの割り込みに遭遇したのは、特定のハードウェアタスクが実行され、CPU / OSに通知して、適切に処理できるようにしたとき(ディスクからメモリにデータを読み込んでから、準備ができたことを通知して戻ってきたとき)だけでした。アプリケーションを制御し、それを処理することを許可します)。
AturSams

2

実際の質問への回答(ゲームループは別のスレッドにある必要がありますか):

多くの場合、別のスレッドの使用を推奨するのは、UIの対話性を妨げるような重い処理を望まないためです。あなたは、別のスレッドがために必要とされている場合伝えることができる唯一の一つですあなたのゲーム。現在のデザインのメインゲームループがUIの応答時間を妨げるかどうかは、エンジンとフレームワークに完全に依存します。他のことを考える理由がない限り、(小規模なプロジェクトでは)通常はそうならないと思います。

コードを別々のスレッドに保持するもう1つの理由は、コードをモジュール化してシンプルにすることです。無関係な2つのコードが混在していると、多くの場合、長期的にはコードの可読性や保守性が低下します。

ゲームループはそれ自身の別のスレッドで実行する必要がありますか?たぶん。応答時間またはコードに問題があり、重い処理に関係なく応答するために複数のUIアイテムが必要な場合、または設計上の理由で同時に発生する特定のタスクにコードを分割したい場合は、それに合わせてください。ただし、高度なプログラミング手法と見なされます。

単純な、しかしおそらく素晴らしい例ではない2人のプレイヤーのゲームです。ユーザー入力を処理し、プレーヤーキャラクターインスタンスの状態変化に変換するクラスの2つのインスタンスを実行することができます。

一部のフレームワークは、ActionScript3.0のように、イベント/割り込みベースのシステムを利用することを推奨/要求します。これらの場合、ループコードは通常、OnEnterFrame1秒あたり20〜60または120回発生するイベントまたは同様のものに移動します。


元の質問への回答(メインループが必要ですか):

すべては、プログラムカウンターに要約されます。所定の時間を超えて実行され、コード生成されないゲームを作成している場合、ユーザーのPCに、処理済みの命令と、何が変更される可能性があるかを繰り返すように親切に要求する必要があります。一方、状態(ゲームのオブジェクトとグローバルに格納されている値)です。

指示を繰り返す必要があることがわかっているので、このタスクを完了して同じ指示を継続的に処理するにはいくつかの方法があります。これらの方法はすべて、プログラムカウンターを現在関連する命令に戻すことを含みます。コードが繰り返される原因となる最も一般的な制御フローステートメントはループと呼ばれ、もう1つはgoto最近のコードではほとんど使用されず、この場合も同様の効果を持つステートメントです(完全には関係ありません)。

前の質問に答えるために、ループが必要ですか?そうです。


1
私の知る限り、AS3のようなイベントベースのフレームワークでは、その下でゲームループが実行されています。イベントシステムを実装するフレームワークではなく、低レベルの割り込みについて話しています。
MichaelHouse

うーん..私は人々がゲームで低レベルの割り込みを頻繁に使用するとは思わない。私の知る限り、それらは主にCPUによってIO操作を監視するために使用されます。フレームごとにいくつかの命令を実行してHWに結果をレンダリングするように指示するのではなく、ユーザー入力またはハードウェアアクティビティ(ポーリングなし)に応答するデザインプラクティスとして、より高いレベルの抽象化を考えていました。
AturSams 2014年

1
はい、人々はそれらを頻繁に使用しなくなりました。私が言ったように、それらは使いづらく、私達は今より良い方法を持っています。私はあなたの言っていることを理解し、確かにそれは物事を考える別の方法ですが、同じタイプのループの下に、それが異なるように見えるのは表面上だけです。
MichaelHouse

私が@ Byte56に同意するのは、IO割り込みを使用するカーネルレベルのイベントについて話していない限り、ループに要約されます。
concept3d 2014年

1
私は知っていますが、私たちが行うすべてのことは、表面下でも同じです(私が言ったように、プログラムカウンターの値を変更します)。これは秘密ではありません、そして私は答えでそれを指摘しました。イベントベースのプログラミングは、さまざまなイベントが発生したときにプログラムカウンターをさまざまな関数に移動するため、一見異なっています。明らかに、これらのイベントが最近発生したかどうかをチェックするループポーリングが存在する可能性がありますが、設計原則としては一見異なるようです。
AturSams

0

ここに他の人の答えを追加するために、誰も明示的に述べていないことです。ゲームループを2番目のスレッドで実行するリスクを負い、それが応答しなくなると、OSがアプリケーションを終了する危険があります。そのため、別のスレッドを使用することをお勧めします。したがって(たとえば)NDKのnative_app_glue.c/ .hは、ループ用に別のスレッドを生成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.