0

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

我想知道典型的 android gameloop 是如何工作的?我在网上搜索并遇到了两种方法:

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);
                       }
                }
         }
   }

让我们以游戏实体的更新为例来说明这两种方法:

        //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 是最好的表现吗?

4

1 回答 1

0

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

但它使您能够仅执行其中一项操作,而不是被迫同时执行两项操作。例如:如果我希望游戏每秒更新 60 次但仅绘制 40 fps,我只能在方法 2 中做到这一点。这可以让您获得更流畅的游戏,减少计算,但前提是您使用得当。

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

于 2012-09-03T09:04:21.390 回答