2013-08-23 2 views
0

если кто-то может просто дать мне небольшой код, как рассчитать кадры в секунду моего экрана, что было бы просто здорово.ANDROID: как рассчитать кадры в секунду (FPS) в классе SurfaceView?

Это мой базовый код, хотя вам может и не понадобится это.

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); 
      } 



} 

Пожалуйста, дайте мне SIMPLE рабочий код Благодарности

ответ

0

Сделать нить, которая делает это 30 раз в секунду:

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

В самом деле, если ваш поток просто сидит там делать, что не пытаясь для паузы он будет затухать до частоты кадров экрана.

Необходимо убедиться, что эта нить правильно синхронизирована с управлением видом поверхности - например, если поверхность изменяется или разрушается, ваш код там должен синхронизироваться с потоком, чтобы убедиться, что нить перестает работать, пока Бывает.

Конечно, это означает, что вы выполняете рендеринг программного обеспечения в холсте. В зависимости от того, что вы делаете, это может быть хорошо, чтобы дать вам 30 кадров в секунду. Если нет, вам нужно использовать GLSurfaceView. Возможно, вы захотите использовать это, просто потому, что он заботится о части резьбы для вас.

+0

Я уже видел этот ответ в другом вопросе ... напишите что-нибудь новое и эффективное –

Смежные вопросы