2017-01-19 12 views
-1

LWJGLゲームで私が3つのスレッド持って作ってるんだ - グラフィックスのための1つ、処理/物理学と世界へのアクセスを提供し、マルチ接続に対処するための1対1に。 問題は、物理スレッドでKeyboard.isKeyDown()を呼び出すと、何かが起こる前に半分程度待たなければならないことです。これは、スレッドがゆっくり実行されているためではありません。ループの瞬間にスレッドが唯一のものであり、println呼び出しによって更新中であることが示されます。 これは、OpenGLコンテキストがグラフィックススレッドに存在し、物理スレッドからキーボード呼び出しを呼び出すという事実と関係があるのでしょうか?私がグラフィックススレッドのチェックを行うとうまくいきますが、そこに入力を入れて別のスレッドに送ることは、別のスレッドを持つことに多少なりとも反対します。マルチスレッドLWJGLキーボードディレイ

私のキーボードのチェックは現在、次のようになります。別のスレッドからメソッドを呼び出すときに遅延がある理由

boolean escPressed = false; 
private void process(){ 
    if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){ 
     if(!escPressed){ 
      escPressed = true; 
      GameStateManager.pauseUnpause(); 
     } 
    } 
    else{ 
     escPressed = false; 
    } 
} 

マイスレッドのセットアップは、単にこの

public class Client { 

    public static GraphicsThread graphics; 
    public static PhysicsThread physics; 
    public static ConnectionThread server; 

    public static void main(String[] args) { 
     GameStateManager.setState(GameStateManager.EnumState.MENU); 
     graphics = new GraphicsThread(); 
     physics = new PhysicsThread(); 
     server = new ConnectionThread(); 


     physics.start(); 
     graphics.start(); 
     server.start(); 
    } 

} 

あるので、誰も私を伝えることができます?

更新 は、私は簡単なテストを行なったし、それキーボードへの呼び出しは、ちょうど完了するまでに非常に長い時間がかかるように見えます。そのテストを実行

while(true){ 
    start = System.currentTimeMillis(); 
    Keyboard.isKeyDown(Keyboard.KEY_ESCAPE); 
    end = System.currentTimeMillis(); 
    System.out.println(end-start); 
} 

は途方もなく高い1100ms、という高い結果を示しました。グラフィックススレッドで実行すると、ミリ秒未満で完了し、0を出力します。ここで何が起こっているのかはわかりません。

+0

どこでキーボードイベントを待つ/ポーリングするのですか?または、試合中に特定の押されたキーだけをチェックしていますか? – n247s

+0

現在、すべてのゲームのダニで押されたキーがチェックされています – DestinySpork

答えて

0

LWJGL 2または3?本当に問題ありません。 OpenGLコンテキストがバインドされているスレッドで呼び出すと、とにかく良いアイデアですが、このメソッドを他のスレッドで呼び出すと問題はありません。私のセットアップについては

私はすべてのOpenGLコンテキストに関連するものに捧げつのスレッドを持っています。 (たとえば、OpenGL呼び出しのみ)。したがって、あなたのケースでは、IlはグラフィックススレッドのkeyPressed状態をチェックします。物理スレッドにヒントを渡します。物理スレッドはすべてのheavyliftingを行います(存在する場合)。詳細はもちろんあなた次第です。

私はこれがあなたに

編集役に立てば幸い


を、同様にこの問題に対処するとき、私は基本的に不可能ためLWJGLことにより、設計の選択の、this postに出くわしました。 (上記のように)ヒントで手動で区切ったり、Keyboardsクラスを使用せずに他のスレッドからチェックインするすべての入力デバイス(グラフィックススレッドで更新された)の状態を追跡することができます。