我开始学习Silverlight并希望创建一些简单的游戏。 我正在为动画
使用 CompositionTarget.Rendering 事件但是动画并不顺畅,我之前开发过游戏并使用双缓冲来避免这样的问题,但我无法找到Silverlight是否可行。
是否有人知道如何使用 CompositionTarget.Rendering 事件创建平滑动画。
谢谢, .NET Developer
答案 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,并仅使用渲染事件来交换位图。