银光动画不流畅

6
尝试在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游戏。虽然在这个示例中我所描述的效果不太普遍,但我可以向您保证,即使将单个矩形移动到画布上也会产生跳跃的动画。

有人有什么想法可以最小化这种情况吗?除了使用Storyboards/DoubleAnimations之外,是否还有其他基于帧的动画方法可以解决这个问题?

编辑:这里有一种快速而简单的方法,使用最少的代码来为矩形添加动画效果(控件:A和D)动画示例

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
+1 我放弃了在 Silverlight 3 中创建游戏的所有尝试,因为会出现卡顿、撕裂和闪烁问题...不知道他们是否在 4 中解决了这个问题,还是和 Powerpoint 一样对于流畅动画没有用?在这方面,我20多年前的 Amiga 和 AMOS 是更好的表现和更容易开发的平台 ;) - Oskar Duveborn
我最近问了一个类似的问题。我认为这可能与我的硬件有关:MacBook双启动(Boot Camp),尽管我在其他所有Windows PC上都遇到了同样的问题。请注意,我标记为正确的答案并没有真正解决这个问题...我甚至观察到即使是移动简单矩形的故事板也会出现问题。希望这个问题能够尽快得到解决。http://stackoverflow.com/questions/5319562/silverlight-fast-moving-bitmap-does-not-update-smoothly - Eugenio De Hoyos
2个回答

3

每1毫秒更新位置是过度的,因为Silverlight不会以那么快的速度更新屏幕。当您修改对象的位置(或任何其他UI更新)时,Silverlight会将帧缓冲标记为脏,并最终重新绘制屏幕,但它不会比MaxFrameRate更频繁地重新绘制屏幕。

要设置MaxFrameRate,只需:

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

这将限制您的应用程序每秒钟最多只能达到60帧,这应该足够了。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接