2013-08-23 54 views
0

如果有人可以給我一個小代碼,說明如何計算我的屏幕每秒的幀數,那就太好了。ANDROID:如何在SurfaceView類中計算每秒幀數(FPS)?

這是我的基本代碼,雖然你可能不需要這個。

import java.util.Random; 

import android.app.Activity; 
import android.content.Context; 
import android.content.pm.ActivityInfo; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.Window; 
import android.view.WindowManager; 

public class MainGame extends Activity implements OnTouchListener 
{ 
MyBringBackSurface ourSurfaceView; 
inr xpos = 0; 

@ Override 
    protected void onCreate (Bundle savedInstanceState) 
{ 
    // TODO Auto-generated method stub 
    super.onCreate (savedInstanceState); 
    ourSurfaceView = new MyBringBackSurface (this); 
    ourSurfaceView.setOnTouchListener (this); 
    x [0] = 0; 
    y [0] = 0; 
    x [1] = 0; 
    y [1] = 0; 

    requestWindowFeature (Window.FEATURE_NO_TITLE); 
    getWindow().addFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); /////////////////////check this NEWLY ADDED 
    getWindow().setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); /////////////////////////////////////////////////CHECK THIS MIGHT NOT WORK 
    setContentView (ourSurfaceView); //ourSurfaceView 
} 


@ Override 
    protected void onPause() 
{ 
    // TODO Auto-generated method stub 
    super.onPause(); 
    ourSurfaceView.pause(); 
} 


@ Override 
    protected void onResume() 
{ 
    // TODO Auto-generated method stub 
    super.onResume(); 
    ourSurfaceView.resume(); 
} 






public class MyBringBackSurface extends SurfaceView implements Runnable 
{ 
    //vertical 
    SurfaceHolder ourHolder; 
    Canvas canvas = (Canvas) ourHolder; 
    Thread ourThread = null; 
    boolean isRunning = false; 


    public MyBringBackSurface (Context context) 
    { 
     // TODO Auto-generated constructor stub 
     super (context); 
     ourHolder = getHolder(); 
    } 

    public void pause() 
    { 
     isRunning = false; 
     while (true) 
     { 
      try 
      { 
       ourThread.join(); 
      } 
      catch (InterruptedException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      break; 
     } 
     ourThread = null; 
    } 
    public void resume() 
    { 
     isRunning = true; 
     ourThread = new Thread (this); 
     ourThread.start(); 
    } 

    public void run() 
    { 
     // TODO Auto-generated method stub 


     while (isRunning) 
     { 

      if (!ourHolder.getSurface().isValid()) 
       continue; 

      canvas = ourHolder.lockCanvas(); 

      Paint paint = new Paint(); 
      paint.setColor(Color.BLUE); 
      canvas.drawCircle(xpos,33,23,paint); 
      if(x<canvas.getWidth()){ 
      xpos++; 
      } 


        ourHolder.unlockCanvasAndPost(canvas); 
      } 



} 

請給我一個簡單的工作代碼 感謝

回答

0

讓一個線程執行此30次:

Call SurfaceHolder.lockCanvas(). 
Draws into the Canvas (must completely redraw all pixels). 
Call SurfaceHolder.unlockCanvasAndPost(). 

事實上,如果你的線程只是坐在那裏做,如果沒有嘗試暫停時,它將被抑制到屏幕的幀速率。

您需要確保該線程與表面視圖的管理正確同步 - 例如,如果表面正在更改或被銷燬,那麼您的代碼應該與線程同步以確保線程停止運行有時候是這樣的。

當然這意味着你正在軟件渲染到畫布中。根據你在做什麼,這可能很好,給你30幀/秒的動畫。如果沒有,你需要使用GLSurfaceView。無論如何,您可能會考慮使用它,只是因爲它會爲您處理線程部分。

+0

我已經在另一個問題中看到了這個答案...請寫一些新的,有效的 –