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