Android gameloop, обновлять и рисовать отдельно или нет? - PullRequest
0 голосов
/ 11 декабря 2011

Я просто забираю разработку для Android, чтобы сделать игру.Прикасался к нему раньше, но только подобрал основы.Я немного запутался, как настроить основной цикл.Я был в XNA (C #), и мне нравится отдельный цикл обновления / рисования.

Мне было интересно, как работает типичный Android-геймплей?Я искал в Интернете и наткнулся на 2 метода:

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 голосов
/ 03 сентября 2012

Не имеет значения, сколько раз вы выполняете цикл, поскольку имеет значение только, сколько действий вы делаете.И количество выполненных действий в основном одинаково.поскольку второе «for» добавляет только одно предполагаемое «if» для каждого объекта.Так что это не так много.

Но это дает вам возможность выполнять только одно из действий, а не заставлять делать оба.например: если я хочу, чтобы игра обновлялась 60 раз в секунду, но рисовал только 40 кадров в секунду, я могу сделать это только в методе 2. Это позволяет вам вести более плавную игру с меньшими затратами вычислений, но только если вы правильно ее используете.

Если у вас darw и обновление происходит с одинаковой скоростью, то глупо их разделять

...