0

iOS から Android にゲームを移植しています。ほとんどの場合、問題なく動作しています。私はほとんどの場合、NDK / JNI を使用した C/C++ コードと、アプリのライフサイクルを管理し、タッチと加速度計の情報をゲームに送信するための小さな Java を使用しています。

私が知る限り、メインの UI スレッドと、GLSurfaceView によって作成され、表示や OpenGL バックバッファの反転などを処理する 2 つのスレッドがあります。

したがって、タッチを除いて、すべてがうまく機能しています。私が自分のデバイスで試した他のアプリと比べて、動作が遅く、反応が鈍いように感じます。いくつかの調査を行った後、問題はスレッドの使用方法に関連している可能性があると考えています。具体的には、表示スレッドが機能した後にスリープ状態にならないことに関連している可能性があるため、メインの UI スレッドで問題が発生している可能性があります。それはもっともらしく聞こえますか?

GLSurfaceView ディスプレイ スレッドがスリープ状態になるまでに必要なミリ秒数を計算してから、sleep() を実行すると、タッチが改善されますが、アニメーションはデバイスで一定の 60FPS ではなくなりました。私の疑いは、前のフレームでスリープするミリ秒数を計算し、その数値を使用して現在のフレームでスリープしているということです。

それとも、まったく違うものになるのでしょうか?知らない。私はまだAndroidに非常に慣れていません...

誰かがこの問題に光を当てるか、正しい方向に向けてくれることを願っています.

ありがとう、

4

1 に答える 1

0

GLスレッドをスリープ状態にする必要はありません。実際、GLスレッドをスリープ状態にすると、画面上に画像をレンダリングするため、さらに遅くなると思います。

UIの動作が遅いのは、主にメインUIスレッドが保持されていることが原因です。メインスレッドで多くの処理を行っている場合(たとえば、加速度計データ)、メインスレッドが最初に作業を実行し、次にユーザー入力を処理する必要があります。これは、鈍感の「感覚」を与える可能性があります。すべてのタッチイベントと非opengl描画イベントは、UIスレッドで発生する必要があります。それ以外のことは、UIスレッドを長期間ブロックしないバックグラウンドスレッドで発生する可能性があります。

それとは別に、他の可能性は、単にプロセッサに過負荷をかけていることです。GLスレッドの描画に時間がかかる場合があります。おそらくタッチイベントと加速度計データを受信して​​処理しています。ただし、レンダリングに非常に長い時間がかかる場合は、古いデータが表示されます。したがって、それは再び「鈍い」と感じます。一定の60FPSではないため、これは非常に現実的な可能性であるとおっしゃいました。描画コードを最適化して、レンダリングを高速化した可能性があります。

于 2012-09-05T13:56:56.773 に答える