Двойной буфер для игры Silverlight - PullRequest
0 голосов
/ 20 августа 2010

Я начинаю изучать Silverlight и хотел бы создать простую игру.Я использую событие CompositionTarget.Rendering для моей анимации

Но анимация не гладкая, я разрабатывал игры раньше и использовал двойной буфер, чтобы избежать таких проблем, но я не могу найти еговозможно с Silverlight.

Кто-нибудь знает, как создать плавную анимацию с событием CompositionTarget.Rendering .

Спасибо .NET Developer .

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Вы предполагаете, что событие Rendering происходит с постоянной скоростью? Это не гарантировано. На моей машине он обычно срабатывает 60 раз в секунду, но иногда он немного быстрее, а иногда заметно медленнее. Кажется, что иногда пропускается кадр, что может привести к тому, что ваша анимация не будет плавной.

Однако событие дает вам информацию, чтобы точно определить, сколько времени прошло с момента последнего кадра (хотя вы должны знать, как его получить), и вы можете написать свою анимацию, чтобы принять это во внимание. Двигайтесь дальше, если с последнего кадра прошло больше времени и т. Д.

Вам необходимо взять EventArgs, переданный в ваш обработчик событий, привести его к RenderingEventArgs , а затем прочитать его RenderingTime свойство. Рассчитайте дельту в RenderingTime с момента вашего последнего события; это говорит вам, сколько времени прошло с тех пор, как был показан ваш последний кадр, и вы можете использовать его для изменения темпа анимации.

CompositionTarget.Rendering += CompositionTarget_Rendering;

...

private static TimeSpan? _lastRenderTime;
private void CompositionTarget_Rendering(object sender, EventArgs e) {
    var args = (RenderingEventArgs) e;
    var elapsed = _lastRenderTime.HasValue ?
                      args.RenderingTime - _lastRenderTime.Value :
                      TimeSpan.Empty;
    _lastRenderTime = args.RenderingTime;

    // "elapsed" tells you how long since the last frame.
    // Now you can update your animation accordingly. For example,
    var left = Canvas.GetLeft(_myControl);
    left += elapsed.TotalSeconds * 100;
    Canvas.SetLeft(_myControl, left);
}

Я слышал, что, по крайней мере в WPF, RenderTime не сообщает вам текущее время, а, скорее, сколько времени будет, когда на экране будет показан кадр. Я не видел этого в официальных источниках, и даже если это правда, я не знаю, верно ли это и для Silverlight. Но в любом случае это даст вам наилучшую информацию для написания анимации.

0 голосов
/ 20 августа 2010

Сколько обработки вы выполняете в событии рендеринга? В качестве одного из вариантов вы можете визуализировать часть вашей сцены в WriteableBitmap и использовать событие рендеринга только для обмена растровыми изображениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...