我有一个带有各种元素的 Canvas 控件,在这个特定的功能中,我允许用户在画布周围拖动一条线的终点。在我调用的 MouseMove 函数e.GetPosition()
中。
根据 VS 性能分析器,该功能在不断移动时接近应用程序总 CPU 的 30%。它很慢。我能做些什么来提高这种性能?
CurrentPoint = e.GetPosition(PointsCanvas);
我在 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 手机用户,请不要忘记在 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侦听器中执行的操作越少,速度就越快。您也可以异步执行逻辑,甚至可以使用Bresenham 算法来模拟更多事件。希望能帮助到你。
您是否使用了任何效果,例如dropshaddow 等?我最近遇到的情况e.GetPosition()
也使用了应用程序 30% 的 cpu 资源,这没有任何意义吗?我发现,在视觉树上,有一个控件应用了 dropshadow 效果,这就是让一切都变慢的原因......