我正在使用(到目前为止,只有水)制作粒子游戏,并且元素内的 Draw() 方法非常慢,同时有几个。我认为这是因为它每秒计算太多,但我仍然很不满意,因为它们只是基本的 2D 形状。我怎样才能让它更有效率?

这是我的代码:

(循环)(每 50 毫秒运行一次)(注意,我只是包含了计时器的表单,我正在使用 WPF。)

    void TimeKeeper_Tick(object sender, EventArgs e)
    {
        foreach (Element ele in Elements)
        {
            ele.Draw();
        }
    }

和绘制方法。 Pos 是一个“Vector2”(我为了节省时间而制作的类):
    public void Draw()
    {
        Pos.Add(3, 10);

        if (Pos.Y > (int)canvas.ActualHeight)
        {
            Pos.Set(Pos.X, (int)shape.RenderSize.Width);
        }

        if (Pos.X+shape.RenderSize.Width > (int)canvas.ActualWidth)
        {
            Pos.Set(0, Pos.Y+(int)shape.RenderSize.Height);
        }

        shape.SetValue(Canvas.LeftProperty, (double)Pos.X);
        shape.SetValue(Canvas.TopProperty, (double)Pos.Y);

        if (canvas.Children.IndexOf(shape) != null)
        {
            canvas.Children.Remove(shape);
        }

        canvas.Children.Add(shape);
    }

最佳答案

很大程度上取决于你认为什么是“慢”

如果您每 50 毫秒移动一次形状,则必须在每个间隔内移动更多,以使它们走得更快。

但是像您一样添加计时器并不是在 WPF 中创建动画的最佳方式。

有几个选项:

  • 为每个形状指定一个速度(类似于:每秒 10 个单位),然后随着屏幕的每次更新,根据自上次移动以来耗时及其速度移动形状。因此,您还需要跟踪耗时。
  • 创建 Storyboard,它们有自己的计时器(时间线),所以您要做的就是设置开始和结束位置并指定持续时间,最后播放动画。
  • 关于c# - 有什么方法可以更快地在 Canvas 上渲染大量移动对象(C# w/WPF),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5688627/

    10-11 03:55
    查看更多