15

Android向けのゲームを開発しています。多くのことが起こっていますが、かなりスムーズに実行されています。もちろん、それはユーザーが画面に触れるまでです。

彼らがそれに触れている間、フレームレートを完全に消去するため、かなり高い優先度であると思われるもので、約10ミリ秒ごとに( 、および で)onTouchEvent呼び出されます。タッチが終了するとすぐに、フレームレートは良好な状態に戻ります。action = ACTION_MOVEx = 0y = 0

私はもう試した

  • onTouchEventいつものようにゲームの入力を処理する
  • すぐにonTouchEvent戻ってきたtrue
  • まったくonTouchEvent実装していない

この問題は、3 つの状況すべてで持続します。

誰かがこれに遭遇しましたか?イベントが生成される速度を下げる方法ACTION_MOVE、または実際の動きがあるときにのみイベントが生成されるようにする方法、またはタッチの現在の位置を取得するだけのポーリング方法を使用する方法はありますか? それとも完全に無効にする方法ですか?

4

5 に答える 5

14

このスレッドを読んでください。基本的に、イベント スレッドをスリープ状態にする必要があります。そうしないと、システムが処理する必要のある多くのイベント (x、y と圧力の間で常に何らかの動きが発生します) を送り出すためです。

于 2009-04-27T17:43:53.397 に答える
1

私はあなたたちが話していることすべてに従おうとしてきましたが、あなたが提案したことを実装するいくつかの方法を試した後、まだ良い結果を得ることができなかったことを認めなければなりません. 誰かがサンプルコードを提供できますか? 具体的には、メイン/UI スレッドをスリープ状態にする方法を知りたいです。私のゲームに当てはまる場合は、Jon が実装したようなポーリング モデルの設定方法を知っておくとよいでしょう。

私のコードは次のようになります。UI スレッドで:

public boolean onTouchEvent(MotionEvent event) {
    // Store event somewhere the game thread can see it:
    // ...

    synchronized (someObject) {
        try {
            someObject.wait(1000L);
        } catch (InterruptedException e) {
        }
    }

    return true;
}

そしてゲームスレッドで:

void myGame() {
    while (!stopping) {
        // ...

        // Get a touch event:
        synchronized (someObject) {
            someObject.notify();
        }
        Thread.yield();

        // ...
    }
}
于 2010-01-01T14:32:36.627 に答える
0

当たり前の解決策かもしれませんが… 1/10くらいしか扱ってみませんでしたか?UI スレッドで 10 ミリ秒ごとにトリガーされる処理を行っている場合、フレームレートが遅くなる可能性があります。では、代わりにカウンターをいくらか蓄積し、最小限のしきい値を超えた場合にのみ処理を行うとしたらどうなるでしょうか?

于 2009-04-27T13:09:00.780 に答える
0

同期スレッドに対処する必要のない解決策が必要な場合は、ハンドラー インターフェイスを使用して、メッセージ/バンドルを使用してイベントと関連データをゲーム レンダリング スレッドに送信することをお勧めします。ここで示唆されているスリープ回避策は引き続き適用されます。

于 2011-11-14T19:20:56.100 に答える