5

Android SurfaceViewを使用して1秒あたり30フレームを達成する方法を示すサンプルコードサンプルを探していますか?各フレームが位置xとyから始まる円を描き、各フレームがxとyを1つずつインクリメントするとします。

ボーナスの質問:上記に加えて、テキストコンテンツを表示するために別のビューをオーバーレイして、描画されているグラフィックがこのテキストコンテンツの下に表示されるようにします。これはどのように行うことができますか?

4

3 に答える 3

6

高いフレームレートが必要な場合は、GLSurfaceViewで確認する必要があります。通常のサーフェスビューでは、経費レイアウトの計算とCPU中心のレンダリングに翻弄されます。GLSurfaceViewを使用すると、それをGPUにオフロードし、レイアウトを厳密に効率的に制御できます。

于 2011-01-30T20:03:28.603 に答える
3

これを 1 秒間に 30 回実行するスレッドを作成します。

  1. SurfaceHolder.lockCanvas() を呼び出します。
  2. キャンバスに描画します (すべてのピクセルを完全に再描画する必要があります)。
  3. SurfaceHolder.unlockCanvasAndPost() を呼び出します。

実際、スレッドが一時停止しようとせずにただそこに座っていると、画面のフレーム レートに合わせて調整されます。

このスレッドがサーフェス ビューの管理と正しく同期されていることを確認する必要があります。たとえば、サーフェスが変更または破棄されている場合、コードをスレッドと同期して、これが発生している間スレッドの実行が停止するようにする必要があります。

もちろん、これはキャンバスにソフトウェア レンダリングを行っていることを意味します。何をしているかによっては、これで 30 fps のアニメーションが得られる場合があります。そうでない場合は、GLSurfaceView を使用する必要があります。スレッド部分を処理してくれるという理由だけで、とにかくそれを使用することを検討することをお勧めします。

于 2011-01-30T22:15:29.427 に答える
2

これは古いスレッドかもしれませんが、他の人にも役立つと思います。これは、surfaceView の使用に関して私が見つけた素晴らしいチュートリアルです: http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

そして、FPS を 30 に制限するのに役立つゲームループの実装方法に関する素晴らしい記事があります: http://www.koonsolo.com/news/dewitters-gameloop/

必要に応じて、直接 surfaceView にテキストを追加できます。例を次に示します。

public void onDraw(Canvas canvas) {
    ...
    // Add text
    Paint paint = new Paint(); 
    paint.setAntiAlias(true);
    paint.setFakeBoldText(true);               // if you like bold
    paint.setShadowLayer(5, 5, 5, Color.GRAY); // add shadow
    paint.setColor(Color.WHITE); 
    paint.setTextSize(30); 
    canvas.drawText("FPS: " + _fps, 10, 35, paint);             
}
于 2011-11-11T20:54:54.847 に答える