代码之家  ›  专栏  ›  技术社区  ›  Yaplex

Silverlight游戏的双缓冲区

  •  0
  • Yaplex  · 技术社区  · 15 年前

    我开始学习Silverlight,想创建一些简单的游戏。 我正在使用 合成目标.渲染 我的动画活动

    但动画不流畅,我以前开发过游戏,我用了双缓冲来避免这样的问题,但我找不到是否可以用Silverlight。

    有人知道如何用 合成目标.渲染 事件。

    谢谢, .NET Developer .

    2 回复  |  直到 15 年前
        1
  •  1
  •   Joe White    15 年前

    您是否假设呈现事件以恒定速率触发?这并不能保证。在我的机器上,它通常每秒发射60次,但有时会快一点,有时会明显慢一点。有时它似乎会跳过一个帧,这可能会导致动画不平滑。

    但是,事件提供了信息来确定从上一帧开始到底有多长时间(尽管您必须知道如何获取它),并且您可以对动画进行编码以考虑到这一点。如果距离上一帧的时间更长,则移动得更远,等等。

    您需要获取传递给事件处理程序的EventArgs,并将其强制转换为 RenderingEventArgs ,然后阅读 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是否也是真的。但是不管是什么情况,它都会给你最好的信息来写你的动画。

        2
  •  0
  •   AlexEzh    15 年前

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