[英]ANDROID: How To Calculate Frames Per Second (FPS) in SurfaceView Class?
如果有人可以给我一个关于如何计算屏幕每秒帧数的小代码,那就太好了。
这是我的基本代码,尽管您可能不需要此代码。
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);
}
}
请给我一个简单的工作代码谢谢
制作一个每秒执行30次此操作的线程:
Call SurfaceHolder.lockCanvas().
Draws into the Canvas (must completely redraw all pixels).
Call SurfaceHolder.unlockCanvasAndPost().
实际上,如果您的线程只是坐在那里而不试图暂停,那么它将被限制为屏幕的帧速率。
您需要确保此线程与表面视图的管理正确同步-例如,如果表面正在更改或被破坏,则您的代码应与该线程同步,以确保在此情况下线程停止运行。
当然,这确实意味着您正在将软件渲染到画布中。 根据您的操作,可以为您提供30fps的动画。 如果没有,则需要使用GLSurfaceView。 您可能仍要考虑使用它,只是因为它会为您处理线程部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.