Silverlight游戏的双缓冲区

时间:2010-08-20 02:45:44

标签: silverlight animation

我开始学习Silverlight并希望创建一些简单的游戏。 我正在为动画

使用 CompositionTarget.Rendering 事件

但是动画并不顺畅,我之前开发过游戏并使用双缓冲来避免这样的问题,但我无法找到Silverlight是否可行。

是否有人知道如何使用 CompositionTarget.Rendering 事件创建平滑动画。

谢谢, .NET Developer

2 个答案:

答案 0 :(得分:1)

您是否假设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是否属实。但无论如何,它都会为您提供编写动画的最佳信息。

答案 1 :(得分:0)

您在渲染事件中执行了多少处理?作为一个选项,您可以将场景的一部分渲染为WriteableBitmap,并仅使用渲染事件来交换位图。