即时响应鼠标移动的线条绘制?

3
我正在尝试解决代码问题,使鼠标移动和线条绘制之间的响应时间达到即时。每次我都会发现两者之间存在延迟。我已经在Windows窗体中编写了代码,现在我正在使用WPF进行编码。
问题明显出现在代码中,而不是我的电脑。
基本上它的工作原理如下。单击任意位置并创建Point1。移动鼠标并更新Point2,然后从Point1到Point2绘制一条线,该线在鼠标移动时更改。
下面是我的极其简单的代码。 它可能看起来很快,但如果你将窗口最大化,让线变长并快速移动鼠标,你就可以更容易地注意到它的延迟。
此外,未来还将有一个图像层位于此之下,这肯定会导致更多的延迟,但现在我只想优化这个问题。
当我使用5年前的其他类似程序时,线条移动实际上是即时的。这就是为什么我对使用较新的编码时出现延迟感到困惑的原因。
    Point mLoc;
    Line myLine = new Line();


    public MainWindow()
    {
        InitializeComponent();
        SnapsToDevicePixels = false;

        myLine.Stroke = System.Windows.Media.Brushes.White;
        myLine.StrokeThickness = 1;

        canvas1.Children.Add(myLine);
    }

    private void onMMove(object sender, MouseEventArgs e)
    {
        mLoc = Mouse.GetPosition(canvas1);

        myLine.X2 = mLoc.X;
        myLine.Y2 = mLoc.Y;


    }

    private void onMLClick(object sender, MouseButtonEventArgs e)
    {
        mLoc = Mouse.GetPosition(canvas1);

        myLine.X1 = mLoc.X;
        myLine.Y1 = mLoc.Y;

    }

在画布上添加一条线控件是疯狂的。尝试使用图形上下文来绘制到屏幕上。 - Asti
1
刚在我的电脑上尝试了您的完全相同的代码,没有观察到任何延迟。 - Kent Boogaart
嗯,感谢评论。我会尝试使用图形上下文。延迟非常小但确实存在。最大化程序并使线条更长,移动鼠标更快。 - Chris Fazzio
当你将注意力集中在鼠标指针上时,你会注意到当你快速移动鼠标时,行的末尾会在鼠标指针周围漂浮...实际上,你只需要以平均速度移动鼠标就可以轻松看到。 - Chris Fazzio
1个回答

2

谢谢,你认为只能用C++来做这个吗?这篇文章是用C++解释的。如果是真的,那就好了,我只是想确定一下,这样我就可以继续学习C++或者C# WPF了。 - Chris Fazzio
不,我认为你可以使用C#和WPF来完成,但这将会非常困难,因为你需要使用WinApi(请阅读关于p/invoke的内容http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx),并使用一些技巧来钩取窗口消息循环(这篇文章可能有所帮助 - https://dev59.com/wXRB5IYBdhLWcg3wbGxB)。 - Nikolay

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