使用GetPosition,MouseMove性能变慢

时间:2013-05-01 16:02:13

标签: c# wpf xaml transform

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

根据VS性能分析器,该功能在应用程序不断移动时接近应用程序总CPU的30%。它很慢。我该怎么做才能提高这种性能?

CurrentPoint = e.GetPosition(PointsCanvas);

2 个答案:

答案 0 :(得分:1)

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

//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手机用户,请不要忘记在Main()或MainPage_Loaded(对象发送者,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 监听器中做得更少,速度会更快。 您也可以异步执行逻辑,甚至可以使用Bresenham algorithm来模拟更多事件。 希望它有所帮助。

答案 1 :(得分:0)

您使用的是drophaddow等效果吗? 我最近的情况是e.GetPosition()也使用了应用程序的cpu资源的30%,这没有任何意义吗? 事实证明,在视觉树上有一个控件应用了drophaddow效果,这就是让所有东西减速的原因......