Android线程困扰着我围绕设计


9

我无法将精力集中在游戏设计上。在android平台上,我有一个活动,并使用自定义表面视图设置了其内容视图。自定义曲面视图充当我的面板,我创建所有类的实例,并在那里进行所有绘图和计算。

问:我应该在活动中创建其他类的实例吗?

现在,我创建一个处理游戏循环的自定义线程类。

问题:如何在所有活动中使用这一课程?还是我每次都要创建扩展线程类的单独实例?

在我以前的游戏中,我有多个级别必须创建线程类的实例,并且在线程类中,我必须为每个单独的级别设置构造函数方法,并在循环中使用switch语句检查它需要呈现的级别和更新。抱歉,这听起来令人困惑。

我只想知道我使用的方法是否效率低下(可能是这样),以及如何设计正确的方法。我已经阅读了许多教程,但是在这个特定主题上仍然遇到很多麻烦。也许是一些解释此问题的教程的链接?谢谢。

Answers:


13

我强烈建议您有一个渲染线程(使用Canvas/ OpenGL ESCanvas可能会更容易设置)和一个放置游戏逻辑的游戏线程。

要实际“加载”游戏,您可以创建GameEngine类,并将其作为应用程序的中心点。准备好渲染器后,您可以创建GameEngine实例的回调,该实例将创建并启动两个线程,其中一个Runnable用于渲染,另一个Runnable用于游戏逻辑。

样例代码:

申请开始

private GameEngine engine;
private CanvasRenderer renderer;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   // Create instances of your two Runnable classes and pass that into
   // the GameEngine constructor.
   // Create an instance of the game engine.
   engine = new GameEngine(canvasRunnable, gamelogicRunnable);
   renderer = new CanvasRenderer(this, engine); 
   setContentView(renderer); 
}

画布渲染器

private GameEngine engine;    

// Save your instance from the GameEngine reference in your constrcutor and make
// a global initializion for your GameEngine instance.  

@Override
public void surfaceCreated(SurfaceHolder holder) {  
   // One time setup here.
   // When your view is ready, make this callback to the 
   // GameEngine.
   engine.surfaceIsReady();
}

游戏引擎

private Thread canvasThread;
private CanvasRunnable canvasRunnable;
// You should be able to figure out how to create a second thread
// where you should put your game logic. :)

// Constructor stuff like creating instances of your threads
// and passing references as you wish to those.
// Don't start the threads here.
// Remember to set references from your Runnable's into your Thread's 
// instances here!

/**
 * Callback. Now your renderer is ready and you
 * can start your threads.
 */
public void surfaceIsReady() {
   thread.setName("Canvas");
   thread.start();
   // Same for game logic.
}

哇谢谢你。我喜欢你的解释。一种解释对我启发了整个概念。
semajhan 2011年

@semajhan:请问您是否还有其他问题。:)

这就是我的想法:GameEngine类,它充当面板上所有其他类的“链接”或“引用”。活动>面板> GameEngine>所有其他类。
semajhan 2011年

@semajhan:是的。因为只有你的知识:如果你决定去与OpenGL ES你应该知道,在渲染OpenGL ES已经有自己的线程,在这种情况下你不需要手动创建并启动新的ThreadRunnable该系统。

忽略此评论。
semajhan

3

通常,您的游戏循环是独立包含在单个活动中的。

当您切换“活动”时,您会暂停/终止游戏循环。无论如何,单独的活动应与暂停游戏相对应(例如,因为您已切换为“向朋友发送电子邮件”或“主菜单”活动)

对于额外的级别,您不应该创建或破坏任何新线程...除非您切换到“完成级别,正在加载下一个级别,请稍候”活动,而您将不得不重新启动“主游戏” ”“还是活动。但是即使在那种情况下,您实际上并没有真正制作“额外”线程,只是在那个活动中创建了一个线程,然后依次杀死/重新启动/杀死/重新启动...等等那个活动。每次完成一个关卡。


3

如果你懂德语, 本教程非常好。

对于英语,我可以推荐本教程

关于线程类:我不知道您是否真的可以从应用程序的所有类中进行引用。在我的游戏中,我是​​这样解决的:

负责绘制主GUI的类具有重写的render方法。在此方法中,将调用线程类,该线程类将更新所有GUI元素并处理用户输入。

该线程还负责保持恒定的帧速率。根据您所开发的游戏,这可能很重要。


那个德语教程很好,但是它是谷歌翻译的,所以很难理解。
semajhan 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.