gpt4 book ai didi

android - 游戏开发用SurfaceView编程和线程策略

转载 作者:可可西里 更新时间:2023-11-01 18:47:44 28 4
gpt4 key购买 nike

我正在使用 SurfaceView 和渲染线程来开发基于结构的游戏,例如 LunarLander。

但是,我遇到了很多问题,在这里我想一一指出来。我希望任何想要开发游戏的人都不需要再与他们斗争。任何对结构有更好想法的人都可以分享他们的经验,因为我对android还是新手并且渴望学习:)

[1] 不应多次调用函数 thread.start()

许多文章提到在创建表面时创建一个线程,以便在 Activity 暂停后使用该方法再次渲染:

public void surfaceCreated(SurfaceHolder holder) {
// start the thread here so that we don't busy-wait in run()
// waiting for the surface to be created
if (thread.getState() == Thread.State.TERMINATED)
{
thread = new LunarThread(getHolder(), getContext(), getHandler());
}
thread.setRunning(true);
thread.start();
}

您可以看到,如果线程未终止并调用函数,则 Activity 会崩溃。

[2] 如果您按下“电源”或“红色电话”按钮,或者电话闲置几分钟, Activity 将处于onPause() 状态,但是线程仍在运行。这是一个非常糟糕的做法,所以我需要找出一种方法让线程停止,并在 onResume() 时重新启动。

[3] 如果屏幕锁定是纵向/横向,并且您的游戏固定在另一个方向,则屏幕锁定会强制您“调整方向”一次。这意味着再次开始 Activity 。我仍然找不到解决方案。 (正如我在 Android screen orientation bug 中提到的)

这是我解决这些问题的代码:

UI线程

public class UIThread extends Activity
{
private gameView gameview;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
gameview = (gameView) findViewById(R.id.gameview);
}
protected void onPause()
{
super.onPause();
Log.v("MY_ACTIVITY", "onPause");
gameview.terminateThread();
System.gc();
}
protected void onResume()
{
super.onResume();
Log.v("MY_ACTIVITY", "onResume");
if (gameview.surfaceCreated == true)
{
gameview.createThread(gameview.getHolder());
}
}
}

游戏 View

public class gameView extends SurfaceView implements SurfaceHolder.Callback
{
boolean surfaceCreated;
class gameThread extends Thread{}
public gameView(Context context, AttributeSet attrs)
{
super(context, attrs);context.getResources();
Log.v("MY_ACTIVITY", "gameView");
surfaceCreated = false;
}
public void createThread (SurfaceHolder holder)
{
thread = new gameThread(holder);
thread.run = true;
thread.start();
}
public void terminateThread ()
{
thread.run = false;
try
{
thread.join();
}
catch (InterruptedException e)
{
Log.e("FUNCTION", "terminateThread corrupts");
}
}
public void surfaceCreated(SurfaceHolder holder)
{
Log.v("MY_ACTIVITY", "surfaceCreated");
if (surfaceCreated == false)
{
createThread(holder);
surfaceCreated = true;
}
}
public void surfaceDestroyed(SurfaceHolder holder)
{
Log.v("MY_ACTIVITY", "surfaceDestroyed");
surfaceCreated = false;
}
}

list

<activity android:name=".UIThread"
android:screenOrientation="landscape"
android:configChanges="orientation">

我使用 onResume() 而不是 surfaceCreated() 到新线程。我设置了一个 bool 值 surfaceCreated 来知道 onResume() 来自第一次创建应用程序,或者来自“屏幕关闭”情况。

因此每次调用 onPause() 时线程都会死亡。似乎是个好习惯。另一种让线程停止然后再次恢复的方法是同步一个对象并调用 wait/notify。但我不知道这样好还是不好。

有没有更好的方法来控制渲染线程?

最佳答案

解决方法在这里

public void surfaceCreated(SurfaceHolder holder){

if (plot_thread.getState() == Thread.State.TERMINATED) {
plot_thread = new WaveformPlotThread(getHolder(), this);
plot_thread.setRunning(true);
plot_thread.start();
}
else {
plot_thread.setRunning(true);
plot_thread.start();
}
}

关于android - 游戏开发用SurfaceView编程和线程策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4059526/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com