Ручное управление перерисовкой экрана

Я пытаюсь сделать пошаговый движок roguelike для XNA. Я в основном портирую игру с предыдущей работы, которую я проделал с использованием библиотеки roguelike на основе SDL под названием libtcod. Как я могу изменить базовый шаблон XNA, чтобы игра не перерисовывала экран каждый кадр, а вместо этого, когда я хочу?


person Adam Rezich    schedule 29.10.2010    source источник
comment
И зачем вам это нужно? На самом деле, мне любопытно.   -  person jv42    schedule 29.10.2010
comment
Что ж, когда у вас есть игра, графика которой не меняется до тех пор, пока пользователь не нажимает клавишу, кажется глупым постоянно пересчитывать и перерисовывать все снова и снова.   -  person Adam Rezich    schedule 30.10.2010


Ответы (2)


Правильный метод для этого - вызывать GraphicsDevice.Present() всякий раз, когда вы хотите вывести задний буфер на экран.

Проблема в том, что класс Game автоматически вызывает для вас Present (особенно в Game.EndDraw), чего вы не хотите, чтобы он делал. К счастью, Game предоставляет несколько способов предотвратить вызов Present:

Лучшим способом было бы переопределить BeginDraw и вернуть ему false, чтобы предотвратить отрисовку фрейма (включая предотвращение вызова Draw и EndDraw), например:

protected override bool BeginDraw()
{
    if(readyToDraw)
        return base.BeginDraw();
    else
        return false;
}

Другие альтернативы - вызвать Game.SuppressDraw или переопределить EndDraw таким образом, чтобы он не вызывал base.EndDraw(), пока вы не будете готовы к отображению кадра на экране.

Лично я бы просто рисовал каждый кадр.

person Andrew Russell    schedule 30.10.2010

Вам не нужно наследовать от класса Game, это совершенно необязательно. Вы можете написать свой собственный класс, который перерисовывает экран только тогда, когда вы хотите. Однако в классе есть полезный код, поэтому вы можете использовать Reflector, чтобы скопировать код оттуда, а затем изменить его логику.

person Athari    schedule 30.10.2010