プログラムというのは上から下に流れていくので
一人用ゲームでも自機と敵機が同時に動き同時に攻撃し同時に被弾しても優先順位ができてしまうわけですよね?
これは当たり判定や衝突判定を別のメソッドに作ればいいのだと思ってます。
(それでも判定順位はあると思いますが)
二人用ゲーム(通信対戦)とかだと、みなさんはどうしてますか?
こうしたほうがいい!ってアドバイスお願いします
ゲームはどのへんからマルチスレッドにするべきでしょうか?
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: ゲームはどのへんからマルチスレッドにするべきでしょうか?
1PCの多人数用ゲームと多PCの通信対戦ではまた全く違う設計になりますが、
1PCで処理する場合は、一人用でも二人用でも基本的に設計は大きく変わらないと思います。
まず、1PCで2つのコントローラーを受けて処理する場合についてです。
現在どのような設計になっているか分かりませんが、
「弾を計算する」
というモジュールに「弾1」を渡して計算させるような仕組みになっていれば、
渡す変数を「弾2」にすることで計算出来ると思います。
同様にプレイヤーを計算するモジュールに「プレイヤー1」を渡して計算する仕組みであれば「プレイヤー2」を渡して計算すればよいでしょう。
http://dixq.net/g/d_05.html
こちらに書いているように、引数を計算するような設計になっていれば追加が簡単です。
質問はマルチスレッドと関係あるのでしょうか?
「二つ処理するものがあるから2つのスレッドで計算する」という考えであれば安直には実現出来ないと思います。
シングルスレッドにおいて、被弾の優先順位はそこまで重要だとは思いませんが、スレッドを分けるならこの辺重要になってくると思います。
特にリプレイを再生する時などはタイミングによって異なる計算結果にならない工夫が必要かと思います。
次に異なるPCでオンラインゲームのように、またはアドホックで処理を行う処理についてです。
異なるPC間で処理を行うのであれば同期処理が必要になってきます。
このことについては、
この本がとても参考になったのでオススメです。
1PCで処理する場合は、一人用でも二人用でも基本的に設計は大きく変わらないと思います。
まず、1PCで2つのコントローラーを受けて処理する場合についてです。
現在どのような設計になっているか分かりませんが、
「弾を計算する」
というモジュールに「弾1」を渡して計算させるような仕組みになっていれば、
渡す変数を「弾2」にすることで計算出来ると思います。
同様にプレイヤーを計算するモジュールに「プレイヤー1」を渡して計算する仕組みであれば「プレイヤー2」を渡して計算すればよいでしょう。
http://dixq.net/g/d_05.html
こちらに書いているように、引数を計算するような設計になっていれば追加が簡単です。
質問はマルチスレッドと関係あるのでしょうか?
「二つ処理するものがあるから2つのスレッドで計算する」という考えであれば安直には実現出来ないと思います。
シングルスレッドにおいて、被弾の優先順位はそこまで重要だとは思いませんが、スレッドを分けるならこの辺重要になってくると思います。
特にリプレイを再生する時などはタイミングによって異なる計算結果にならない工夫が必要かと思います。
次に異なるPCでオンラインゲームのように、またはアドホックで処理を行う処理についてです。
異なるPC間で処理を行うのであれば同期処理が必要になってきます。
このことについては、
この本がとても参考になったのでオススメです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: ゲームはどのへんからマルチスレッドにするべきでしょうか?
マルチスレッドにした所で同期は必要ですから現実世界と違い順番は発生します。と言うよりも面倒になるだけでスレッドにする意味がありません。
>二人用ゲーム(通信対戦)とかだと、みなさんはどうしてますか?
これはクライアントPC間の同期の問題ですので結構難しい問題で、市販ソフトでも遅延すると怪しいものが沢山あります。
Dixq (管理人) さんの推薦された本を一度読まれてみてはどうでしょうか?
その本に書かれたことが全て正解ではなく、色々と試行錯誤しながら作っていくしかないと思います。
>二人用ゲーム(通信対戦)とかだと、みなさんはどうしてますか?
これはクライアントPC間の同期の問題ですので結構難しい問題で、市販ソフトでも遅延すると怪しいものが沢山あります。
Dixq (管理人) さんの推薦された本を一度読まれてみてはどうでしょうか?
その本に書かれたことが全て正解ではなく、色々と試行錯誤しながら作っていくしかないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: ゲームはどのへんからマルチスレッドにするべきでしょうか?
しばしばゲームプログラムはマルチスレッドに向いているという意見を目にしますね。
でも、ゲームキャラクタはそれぞれが影響しあって動くので同期を取る必要があります。
マルチスレッドにすると同期処理が死ぬほど難しくなってしばしば潰せないバグの原因になります。
ゲームプログラムにおいて優先順位は決まっている方が作りやすいのです。
音楽再生や3D描画など、投げっぱなしで良きに計らってくれる類の処理は既に見えないところで並行処理されているので、活用すれば良いと思います。
あとは、通信のネゴシエーションや外部メディアのデータの読み書きあたりはマルチスレッドにするとユーザーを待たせない演出の実装が楽になります。
でも、ゲームキャラクタはそれぞれが影響しあって動くので同期を取る必要があります。
マルチスレッドにすると同期処理が死ぬほど難しくなってしばしば潰せないバグの原因になります。
ゲームプログラムにおいて優先順位は決まっている方が作りやすいのです。
音楽再生や3D描画など、投げっぱなしで良きに計らってくれる類の処理は既に見えないところで並行処理されているので、活用すれば良いと思います。
あとは、通信のネゴシエーションや外部メディアのデータの読み書きあたりはマルチスレッドにするとユーザーを待たせない演出の実装が楽になります。
Re: ゲームはどのへんからマルチスレッドにするべきでしょうか?
ゲームでマルチスレッドを使用する主な場面として、以下のようなものが挙げられます。
具体的には、複数を並列に実行するので単純に他の個体への依存をさせることはできません。
各個体に処理する前の状態、処理した後の状態を持たせ、依存させる場合は処理する前の状態(並列処理することで変わらない情報)のみを参照する必要があります。
個人でゲームを制作する場合、マルチスレッドを使用する場面としては上記のどれにも関わることはなく進められると思います。
ゲームライブラリ(DXライブラリ等)を使用する場合はなおさらでしょう。
もしあるとするのであれば、サウンド処理や、アルゴリズムの高速化辺りではないでしょうか。
企業レベルでも、むやみやたらにマルチスレッドは使いません。
あるとしても上記の場面ぐらいです。
ハイクオリティな3Dゲームだと、描画・モデル制御に関する処理にマルチスレッドを使用しているところが多いようです。
あと、GPGPUにおける並列処理もありますね。
- 読み込み・書き込み処理
- 膨大な計算処理(3Dモデルの姿勢計算や、物理計算・ゲームシステムにおけるアルゴリズムの計算など)
- サウンド処理
- 通信周り(送受信の一連の処理)
- 個体単位の中間処理
具体的には、複数を並列に実行するので単純に他の個体への依存をさせることはできません。
各個体に処理する前の状態、処理した後の状態を持たせ、依存させる場合は処理する前の状態(並列処理することで変わらない情報)のみを参照する必要があります。
個人でゲームを制作する場合、マルチスレッドを使用する場面としては上記のどれにも関わることはなく進められると思います。
ゲームライブラリ(DXライブラリ等)を使用する場合はなおさらでしょう。
もしあるとするのであれば、サウンド処理や、アルゴリズムの高速化辺りではないでしょうか。
企業レベルでも、むやみやたらにマルチスレッドは使いません。
あるとしても上記の場面ぐらいです。
ハイクオリティな3Dゲームだと、描画・モデル制御に関する処理にマルチスレッドを使用しているところが多いようです。
あと、GPGPUにおける並列処理もありますね。
This article was written by "Mitsunagi".