Gameloop для Android, обновлять и рисовать отдельно или нет?

Я просто собираю 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);
                       }
                }
         }
   }

Возьмем обновление игровых сущностей в качестве примера для двух методов:

        //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 лучшим с точки зрения производительности?


person omgnoseat    schedule 11.12.2011    source источник


Ответы (1)


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

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

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

person adirDgod    schedule 03.09.2012