16

コルーチンはゲームを構造化するための良い方法だと聞きましたが(たとえば、PEP 342:「コルーチンはシミュレーションやゲームなどの多くのアルゴリズムを表現する自然な方法です...」)、コルーチンをラップするのに苦労しています。これが実際にどのように行われるかを考えてみましょう。

この記事から、コルーチンはスケジューラーを使用して相互に遷移するステートマシンの状態を表すことができることがわかりますが、これが複数のプレーヤーからの動きに基づいてゲームの状態が変化するゲームにどのように適用されるかはわかりません。

コルーチンを使用して作成されたゲームの簡単な例はありますか?または、誰かがそれがどのように行われるかについてのスケッチを提供できますか?

4

5 に答える 5

10

コルーチンを使用すると、協調マルチタスクを使用して非常に軽量な「マイクロスレッド」を大量に作成できます(つまり、マイクロスレッドは他のマイクロスレッドを実行できるように意図的に中断します)。このテーマに関するDaveBeazleyの記事を読んでください。

さて、そのようなマイクロスレッドがゲームプログラミングにどのように役立つかは明らかです。数十のユニットがあり、それぞれが独自の心を持っているリアルタイム戦略ゲームを考えてみましょう。シミュレートされたマルチタスク環境でそのようなマイクロスレッドとして実行することは、各ユニットのAIにとって便利な抽象化である可能性があります。これはほんの一例ですが、もっとたくさんあると思います。

Googleでの「コルーチンゲームプログラミング」検索は、興味深い結果をもたらすようです。

于 2009-08-08T04:35:05.260 に答える
10

コルーチンの最も顕著なケースは、おそらく古いグラフィカルなポイントアンドクリックアドベンチャーゲームであり、ゲーム内のカットシーンやその他のアニメーションシーケンスのスクリプトを作成するために使用されていました。簡単なコード例は次のようになります。

# script_file.scr
bob.walkto(jane)
bob.lookat(jane)
bob.say("How are you?")
wait(2)
jane.say("Fine")
...

bob.walkto(jane)このシーケンス全体を通常のコードとして記述することはできません。次の行にジャンプするのではなく、ボブが歩いた後に歩行アニメーションを実行するのを確認したいからです。ただし、歩行アニメーションを再生するには、ゲームエンジンに制御を戻す必要があり、コルーチンが機能します。

このシーケンス全体はコルーチンとして実行されます。つまり、必要に応じて中断および再開することができます。このようなコマンドbob.walkto(jane)は、エンジン側のボブオブジェクトにそのターゲットを通知し、コルーチンを一時停止して、ボブがターゲットに到達したときにウェイクアップ呼び出しを待機します。

エンジン側では、次のようになります(擬似コード)。

class Script:
    def __init__(self, filename):
        self.coroutine  = Coroutine(filename)
        self.is_wokenup = True

    def wakeup(self):
        self.is_wokenup = False;

    def update():
        if self.is_wokenup:
          coroutine.run()            


class Character:
   def walkto(self, target, script):
       self.script = script
       self.target = target

   def update(self):
       if target:
           move_one_step_closer_to(self.target)
           if close_enough_to(self.target):
               self.script.wakeup()

               self.target = None
               self.script = None

objects = [Character("bob"), Character("jane")]
scripts = [Script("script_file.scr")]

while True:
    for obj in objects:
        obj.update()

    for scr in scripts:
        scr.update()

ただし、コルーチンを使用するとこれらのシーケンスのコーディングが非常に簡単になりますが、それらのすべての実装がシリアル化を念頭に置いて構築されるわけではないため、コルーチンを多用するとゲームの保存が非常に厄介な問題になります。

この例は、ゲーム内のコルーチンの最も基本的なケースでもあります。コルーチン自体は、他の多くのタスクやアルゴリズムにも使用できます。

于 2009-08-09T09:11:34.750 に答える
7

コルーチンをゲームで使用できる1つの方法は、 Kamaeliaのように、モデルのような俳優の軽量スレッドとして使用することです。

ゲーム内の各オブジェクトは、Kamaeliaの「コンポーネント」になります。コンポーネントは、一時停止が許可されているときに譲歩することで実行を一時停止できるオブジェクトです。これらのコンポーネントには、非同期で相互に安全に通信できるようにするメッセージングシステムもあります。

すべてのオブジェクトは同時に独自のことを行い、相互作用が発生するとメッセージが相互に送信されます。

したがって、これは実際にはゲームに固有のものではありませんが、同時に動作する多数の通信コンポーネントがある場合は、コルーチンの恩恵を受ける可能性があります。

于 2009-08-08T04:37:30.623 に答える
2

あなたが面白いと思うかもしれない2つのリンク:

http://aigamedev.com/open/articles/coroutine-state-machine/

http://www.dabeaz.com/coroutines/(このページとPDFで「タスク」を検索してください)

于 2009-08-08T04:28:34.650 に答える
1

個々のアクターAIスクリプトを表すためにコルーチンを使用することは非常に一般的です。残念ながら、コルーチンには、スレッドと同じ同期と相互排除の問題があることを、より高いレベルで忘れがちです。したがって、最初にローカル状態を排除するためにできる限り多くのことを行う必要があり、次に、参照しているものが存在しなくなったときに発生するコルーチンのエラーを処理するための堅牢な方法を作成する必要があります。

したがって、実際には、コルーチンの類似性を使用するUnrealScriptのような言語は、有用なロジックの多くをアトミックイベントにプッシュします。一部の人々はそれらから良い効用を得ます、例えば。EVE Onlineの人々ですが、彼らはコンセプトに基づいてシステム全体を設計する必要がありました。(そして、共有リソースをめぐる競合をどのように処理するかについては、十分に文書化されていません。)

于 2009-08-10T14:16:26.897 に答える