在android中我应该将主游戏循环放在初始活动类中吗?

时间:2011-09-15 18:46:31

标签: android opengl-es render game-loop

我正在尝试使用this tutorial创建游戏循环。

我试图在初始活动类中实现它,如下所示,但我遇到了一些问题。我已经请求了全屏,没有显示的标题功能,但是我没有得到它们,requestRender不起作用。

当“running”设置为false时,将跳过游戏循环并且渲染器渲染一帧(rendermode设置为脏)

这不是它在运行= true时所做的事情。

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;



public class Practice extends Activity {

private Input input;
private GLSurfaceRenderer glSurfaceRenderer;
private final static int maxFPS = 30;
private final static int maxFrameSkips = 5;
private final static int framePeriod = 1000 / maxFPS;
public final static String TAG = "input";

public boolean running = true;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    input = new Input(this);
    setContentView(input);

    long beginTime;
    long timeDiff;
    int sleepTime;
    int framesSkipped;

    sleepTime = 0;
    while (running) {
        Log.d(TAG, "gameRunning");
        beginTime = System.currentTimeMillis();
        framesSkipped = 0;
        this.input.update();
        this.input.requestRender();
        timeDiff = System.currentTimeMillis() - beginTime;
        sleepTime = (int)(framePeriod - timeDiff);

        if (sleepTime > 0) {
            try{
                Thread.sleep(sleepTime);
            }catch(InterruptedException e){}
        }

        while(sleepTime < 0 && framesSkipped < maxFrameSkips){
            this.input.update();
            sleepTime += framePeriod;
            framesSkipped++;
            Log.d(TAG, "Frames Skipped");
        }

    }
}
}

目前游戏逻辑正在更新,但渲染器根本没有渲染(只是黑屏)

我很确定这只是一个简单的重新代码重组,但有人有任何建议吗?

1 个答案:

答案 0 :(得分:3)

问题的根本原因是不让onCreate()返回。这是应用程序运行所必需的,这是处理所有UI输入和更改的线程。我在这里看到很多精力,没有重点检查教程,基本UI tutorials,阅读有关Android Lifecycle并注意ANR's。它们将使您更好地了解事物的工作方式以及如何将您的活动与第二个线程相结合。