[英]GDI drawing application with high CPU usage
我有一個應用程序,用戶可以在其中繪制一些形狀。 當我單擊某個形狀並將其拖動時,由於MouseMove中的Invalidate(),CPU的運行速度為100%。 如果我使用計時器,並從滴答事件中調用Invalidate(),移動就不會那么順利。 還有其他方法可以最大程度地減少CPU並使移動平穩嗎?
` Point startDragMousePoint;
Point startShapeLocation;
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
if(isMouseDown)
{
Point deltaPoint = Point.Subtract(e.Location, new Size(startDragMousePoint));
shape.Location = Point.Add(startShapeLocation, new Size(deltaPoint));
Invalidate();
}
}
private void Canvas_Paint(object sender, PaintEventArgs e)
{
shape.Render(e.Graphics);
}`
有三種通用解決方案。
1)不要在移動時畫圖,這是很長一段時間以來在窗戶上的解決方案,當您拖動窗戶時,窗戶消失了,您看到了窗戶的輪廓。
2)創建一個位圖對象,然后將其移動。 請注意,您將不得不重新繪制其下方的區域。
3)不要使孔窗口無效,僅使要更改的區域無效。 繪制到緩沖區(位圖)可以幫助您重用區域。
另外,如果GDI不是世界上最快的繪圖功能。 如果形狀非常復雜,則可能需要考慮使用OpenGL,DirectX或SDL。
除了使整個區域無效之外,您還可以使用以下方法使已更改的控件部分無效:
Rectangle changedArea = new Rectangle(cX, cY, cW, cH);
this.Invalidate(changedArea);
還要確保您的控件設置為使用DoubleBuffering
this.DoubleBuffered = true;
從您提供的有限代碼來看,我認為無效不會造成任何問題。 問題很可能出在您shape.Render()的真實渲染代碼中。 過去,我編寫過類似的應用程序,其中我在鼠標移動時調用了Invalidate,並且應用程序運行良好。 啟用雙緩沖后,只有一些閃爍發生了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.