使用GetPosition时,鼠标移动性能变慢

本文关键字:移动性 性能 移动 鼠标 GetPosition 使用 | 更新日期: 2023-09-27 18:11:45

我有一个带有各种元素的Canvas控件,在这个特定的函数中,我允许用户在画布周围拖动一条线的终点。在MouseMove函数中,我调用e.GetPosition() .

根据VS性能分析器,当不断移动时,该函数接近应用程序总CPU的30%。它相当慢。我能做些什么来提高性能?

CurrentPoint = e.GetPosition(PointsCanvas);

使用GetPosition时,鼠标移动性能变慢

我在windows phone 8上使用MouseMove时遇到了同样的问题。似乎在拖动时,事件(包含您需要的坐标)以固定的时间间隔引发(取决于您在侦听器中的实现中所做的工作,例如每20毫秒一次)。所以我所做的就是用我的坐标填充一个队列,并创建一个线程,通过队列第一个元素来消耗该队列,并执行我想要的逻辑。就像逻辑不是串行完成的,因为它是另一个线程做的工作。我不知道我是否足够清楚,所以请看看下面的代码:

//Class used to store e.getPosition(UIElement).X/Y
public class mouseInformation
    {
        public int x { get; set; }
        public int y { get; set; }

        public mouseInformation(int x, int y, String functionName)
        {
            this.x = x;
            this.y = y;              
        }
    }

    private readonly Queue<mouseInformation> queueOfEvent = new Queue<mouseInformation>();
    //MouseMove listener
    private void wpCanvas_MouseDragged(object sender, System.Windows.Input.MouseEventArgs e)
    {
        //Instead of "wpCanvas" put the name of your UIElement (here your canvas name)
        mouseInformation mouseDragged = new mouseInformation((int)e.GetPosition(wpCanvas).X, (int)e.GetPosition(wpCanvas).Y);
        EnqueueMouseEvent(mouseDragged);
    }
    //Allow you to add a MouseInformation object in your Queue
    public void EnqueueMouseEvent(mouseInformation mi)
    {
        lock (queueOfEvent)
        {
            queueOfEvent.Enqueue(mi);
            Monitor.PulseAll(queueOfEvent);
        }
    }
    //Logic that your consumer thread will do
    void Consume()
    {
        while (true)
        {
            mouseInformation MI;
            lock (queueOfEvent)
            {          
                while (queueOfEvent.Count == 0) Monitor.Wait(queueOfEvent);
                MI = queueOfEvent.Dequeue();  
            }
                // DO YOUR LOGIC HERE
                // i.e  DoSomething(MI.x, MI.y)               
        }
    }

如果你是Windows phone用户,不要忘记在Main()或MainPage_Loaded(object sender, RoutedEventArgs e)方法中创建线程。

 System.Threading.ThreadStart WatchQueue = new System.Threading.ThreadStart(Consume);
 System.Threading.Thread RunWatchQueue = new System.Threading.Thread(WatchQueue);
 RunWatchQueue.Name = "Events thread";
 RunWatchQueue.Start();

简单地说,你在MouseMove监听器中做的越少,速度就越快。您也可以异步执行逻辑,甚至使用布里森汉姆算法来模拟更多事件。

是否使用阴影等效果?我最近遇到的情况是,e.GetPosition()也使用了30%的应用程序cpu资源,这没有任何意义,对吧?我发现在视觉树的上方有一个应用投影效果的控件这就是让所有东西都变慢的原因。