1

私のゲームデザインでは、ロジックスレッドとレンダリングスレッドを可能な限り並列に実行できるようにしようとしています。これを考えると、ゲームロジックからレンダリングスレッドに更新をプッシュする方法が必要です。これを行うための最もクリーンな方法を見つけたいと思います。

私はただの趣味で、デザインパターンや正しい用語がわからないので、最初に申し訳ありません。説明している内容が別の名前で知られている場合は、お知らせください。

レンダリングスレッドによって継続的にアクセスされる、次のようなオブジェクトがあると仮定します。

public class Renderable {
   void functionA(int foo)          { ... }
   void functionB(int foo, int bar) { ... }
   void functionC()                 { ... }
}

functionAロジックスレッド中に、、、functionBおよびをランダムなポイントで呼び出す必要がありfunctionCますが、オブジェクトが異なるスレッドにあるため、同時実行の問題なしにRenderableに直接触れることはできません。私が本当にやりたいのはRenderableProxy、と同じインターフェイスでプロキシオブジェクトを作成することです。これにより、すべての呼び出しが保存され、スレッドを整列させたときに同期ウィンドウ中にRenderable呼び出しが転送されます。Renderable

オブジェクトは次のようになります。

public class RenderableProxy {
    Renderable target;

    void functionA(int foo)            { ? }
    void functionB(int foo, int bar)   { ? }
    void functionC()                   { ? }

    void execute()   {
        foreach( called_function )
           target.???      
    }             
}

関数を表す列挙型などの情報を保持する構造体を作成し、パラメーターを格納して、を呼び出すまでこれをすべて保持すれば、おそらくこれを実装できると信じていますexecute

しかし、これについて本当に私を悩ませているのは、インターフェイスを更新するたびに、Renderableインターフェイスに戻ってRenderableProxy変更し、変更executeを処理するように変更する必要があることです。これは私には本当に厄介で、これを処理するための言語機能があるかもしれないと感じています。そのため、Renderableインターフェイスを変更するたびにRenderableProxy、新しい関数を処理するために書き直す必要はありません。

2つの異なるオブジェクト(オブジェクトとそのプロキシ)のインターフェイスを常に同期させようとせずに、目標を達成できるような魔法の機能はありますか?私はJavaにいくつかのリフレクション機能があることを知っていますが、60Hzゲームで1秒間に数千回リフレクションルックアップを実行することのパフォーマンスへの影響について心配しているので、それに触れるのは少し怖いです。

4

1 に答える 1

2

これを実現するには、Proxyクラス(http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Proxy.html)を使用できます。
これを使用する方法の優れたチュートリアルについては、 http://www.ibm.com/developerworks/java/library/j-jtp08305/index.htmlを参照してください

基本的に、InvocationHandlerを実装するにはRenderableProxyが必要です。
-RenderableProxyのinvoke()メソッドに、呼び出されるメソッドをメモリ内に格納します-
格納されているすべてのメソッド呼び出しを実行する新しいexecuteAll()メソッドをRenderableProxyに追加します-executeAll()メソッドを自由に呼び出します

于 2012-04-11T05:13:28.590 に答える