Android游戏圈,更新和绘制是否分开?

时间:2011-12-11 02:08:38

标签: android game-loop

我只是拿起Android开发来制作游戏。以前接触过它,但只接受了基础知识。我有点困惑如何设置主循环。我已经进入XNA(C#),我喜欢分离的更新/绘制循环。

我想知道一个典型的android游戏循环是如何工作的?我在网上搜索过,遇到过两种方法:

public void run() {

         while (running) {

                //Method 1: update is called here 
                view.update();
                Canvas c = null;

                try {

                       c = view.getHolder().lockCanvas();

                       synchronized (view.getHolder()) {

                           //Method 2: update is called inside view.onDraw
                              view.onDraw(c);

                       }

                } finally {

                       if (c != null) {

                              view.getHolder().unlockCanvasAndPost(c);
                       }
                }
         }
   }

让我们将游戏实体的更新作为2种方法的一个例子:

        //METHOD1

public void onDraw(Canvas canvas)
{
    for (GameEntity entity : entities)
    {
        entity.update();
        entity.draw(canvas);
    }
}

//END METHOD 1

//METHOD 2

public void update()
{
    for (GameEntity entity : entities)
    {
        entity.update();
    }
}

public void draw(Canvas canvas)
{
    for (GameEntity entity : entities)
    {
        entity.draw(canvas);
    }
}

//END METHOD 2

现在我没有任何线程经验,所以我不知道XNA如何在xna中的屏幕后面进行更新/绘制循环。 但是使用方法1,我必须遍历所有实体两次,一次用于更新,另一次用于单独绘制。我担心这会破坏性能,但我在网上的样本中看到了这一点。

我错过了什么,或者我是对的,方法2是最好的表现吗?

1 个答案:

答案 0 :(得分:0)

重要的不是你循环多少次,因为它只关心你做了多少次行动。并且完成的操作量基本相同。因为第二个“for”只为每个entety增加了一个假设的“if”。所以它并不多。

但是它让你能够只做其中一个动作,而不是强迫两个动作。 例如:如果我希望游戏每秒更新60次但只能绘制40 fps,我只能在方法2中执行此操作。这样您可以使用更少的计算来获得更流畅的游戏,但前提是您正确使用它。

如果您的darw和更新以相同的速率发生,那么拆分它们是愚蠢的