【问题标题】:Silverlight animation not smoothSilverlight 动画不流畅
【发布时间】:2010-11-07 01:24:07
【问题描述】:

当尝试基于 Silverlight 为对象时间/帧设置动画时(与使用 DoubleAnimation 或 Storyboard 之类的东西相比,这不适合快节奏的游戏),例如每帧沿特定方向移动宇宙飞船,移动是跳动的,不是很顺利。屏幕甚至似乎撕裂了。

CompositionTarget 和 DistpatcherTimer 之间似乎没有区别。 我使用以下方法(在伪代码中):

Register Handler to Tick-Event of a DispatcherTimer
In each Tick:
Compute the elapsed time from the last frame in milliseconds
Object.X += movementSpeed * ellapsedMilliseconds

这应该会产生平稳的运动,对吧?但事实并非如此。 这是一个示例(控件:WASD 和鼠标):Silverlight Game。 虽然我描述的效果在这个示例中并不太普遍,但我可以向您保证,即使在画布上移动单个矩形也会产生跳跃的动画。

有人知道如何最小化这种情况吗?是否有其他方法可以使用 Storyboards/DoubleAnimations 来解决这个问题?

编辑:这里是一种快速而肮脏的方法,用最少的代码(控件:A 和 D)为矩形设置动画Animation Sample

Xaml:

 <Grid x:Name="LayoutRoot" Background="Black">
    <Canvas Width="1000" Height="400" Background="Blue">
        <Rectangle x:Name="rect" Width="48" Height="48"
                   Fill="White"
                   Canvas.Top="200"
                   Canvas.Left="0"/>
    </Canvas>
</Grid>

C#:

private bool isLeft = false;
    private bool isRight = false;
    private DispatcherTimer timer = new DispatcherTimer();
    private double lastUpdate;

    public Page()
    {
        InitializeComponent();

        timer.Interval = TimeSpan.FromMilliseconds(1);
        timer.Tick += OnTick;

        lastUpdate = Environment.TickCount;
        timer.Start();
    }

    private void OnTick(object sender, EventArgs e)
    {
        double diff = Environment.TickCount - lastUpdate;

        double x = Canvas.GetLeft(rect);

        if (isRight)
            x += 1 * diff;
        else if (isLeft)
            x -= 1 * diff;

        Canvas.SetLeft(rect, x);

        lastUpdate = Environment.TickCount;
    }

    private void UserControl_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.D)
            isRight = true;

        if (e.Key == Key.A)
            isLeft = true;
    }

    private void UserControl_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.D)
            isRight = false;

        if (e.Key == Key.A)
            isLeft = false;
    }

谢谢! 安德烈

【问题讨论】:

  • +1 由于卡顿、撕裂和闪烁,我放弃了在 Silverlight 3 中创建游戏的任何尝试......想知道他们是否在 4 中解决了这个问题,或者它是否仍然像 Powerpoint 一样无用以获得流畅动画?我 20 多岁的 Amiga 和 AMOS 在这个部门是一个更好的表现和更容易的开发平台;)
  • 我最近问了一个类似的问题。我认为这与我的硬件有关:MacBook Dual-Boot (Boot Camp),尽管我在我拥有的所有其他 Windows PC 中都遇到了同样的问题。请注意,我标记为正确的答案并没有真正解决问题......即使故事板移动一个简单的矩形,我也观察到了这个问题。我希望这很快就能解决。 stackoverflow.com/questions/5319562/…

标签: silverlight animation


【解决方案1】:

每 1 毫秒更新一次位置是多余的,因为 silverlight 根本不会那么快地更新屏幕。当您像这样修改对象的位置(或任何其他 ui 更新)时,silverlight 会将帧缓冲区标记为脏,然后它最终会重绘屏幕,但是它不会比MaxFrameRate 更频繁地重绘屏幕。

只需设置MaxFrameRate

Application.Current.Host.Settings.MaxFrameRate = 60;

这会将您的应用程序限制为每秒 60 帧,这应该绰绰有余。

【讨论】:

    【解决方案2】:

    不要对动画使用 DispatchTimer。 Reasons for this。如果可以,请使用情节提要或CompositionTarget.Rendering 事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-30
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 2018-07-28
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多