Tôi có hai vấn đề với một điều khiển người dùng riêng trong đó sử dụng bitmap:riêng WinForms kiểm soát thấp thoáng và Có Bad Performance
- ERP sẽ hiển thị nếu nó vẽ lại thông qua phương pháp 'Refresh' NET của.
- Hiệu suất kém.
Việc kiểm soát bao gồm ba bitmap:
- Một hình nền tĩnh.
- rôto quay.
- Một hình ảnh khác tùy thuộc vào góc rotor.
Tất cả bitmap đã sử dụng có độ phân giải 500x500 pixel. Bộ điều khiển hoạt động như sau: https://www.dropbox.com/s/t92gucestwdkx8z/StatorAndRotor.gif (đó là hình động gif)
Điều khiển người dùng sẽ tự vẽ mỗi khi có góc rotor mới. Do đó, nó có một tài sản công cộng 'RotorAngle' mà trông như thế này:
public double RotorAngle
{
get { return mRotorAngle; }
set
{
mRotorAngle = value;
Refresh();
}
}
Refresh
làm tăng sự kiện Paint
. Handler OnPaint
kiện trông như thế này:
private void StatorAndRotor2_Paint(object sender, PaintEventArgs e)
{
// Draw the three bitmaps using a rotation matrix to rotate the rotor bitmap.
Draw((float)mRotorAngle);
}
Nhưng khi tôi sử dụng mã này - mà hoạt động tốt trong điều khiển người dùng riêng khác - người dùng điều khiển không được rút ra ở tất cả nếu điều khiển được đôi đệm qua SetStyle(ControlStyles.OptimizedDoubleBuffer, true)
. Nếu tôi không đặt cờ này thành true, điều khiển sẽ nhấp nháy khi được vẽ lại.
Trong constructor kiểm soát tôi đặt:
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ContainerControl, false);
// User control is not drawn if "OptimizedDoubleBuffer" is true.
// SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
Trước tiên, tôi nghĩ rằng nó thấp thoáng vì nền sẽ bị xóa mọi sự kiểm soát được rút ra. Do đó, tôi đặt SetStyle(ControlStyles.AllPaintingInWmPaint, true)
. Nhưng nó không giúp được gì.
Vì vậy, tại sao nó nhấp nháy? Các điều khiển khác hoạt động rất tốt với thiết lập này. Và tại sao điều khiển không được vẽ nếu SetStyle(ControlStyles.OptimizedDoubleBuffer, true)
.
tôi phát hiện ra rằng sự kiểm soát không nhấp nháy nếu tôi gọi phương thức Draw
tôi trực tiếp sau khi thay đổi thuộc tính RotorAngle
:
public float RotorAngle
{
get { return mRotorAngle; }
set
{
mRotorAngle = value;
Draw(mRotorAngle);
}
}
Nhưng kết quả này trong một buổi biểu diễn rất xấu, đặc biệt là ở chế độ toàn màn hình. Không thể cập nhật điều khiển sau mỗi 20 mili giây. Bạn có thể tự mình thử. Tôi sẽ đính kèm giải pháp Visual Studio 2008 hoàn chỉnh bên dưới.
Vì vậy, tại sao hiệu suất kém như vậy? Không có vấn đề gì khi cập nhật các điều khiển khác (riêng) sau mỗi 20 mili giây. Có thực sự là do ảnh bitmap không?
Tôi tạo ra một giải pháp trực quan Visual Studio 2008 đơn giản để chứng minh hai vấn đề: https://www.dropbox.com/s/mckmgysjxm0o9e0/WinFormsControlsTest.zip (289,3 KB)
Có một thực thi trong thư mục bin\Debug
.
Cảm ơn sự giúp đỡ của bạn.
tôi không thể đi vào tất cả các chi tiết bây giờ, nhưng bạn cần phải nhìn vào đôi đệm. May mắn thay nó rất đơn giản trong năm 2008 + Cách bạn đang làm việc làm mới trong tài sản là xấu quá. – Ian
Vui lòng không đệm đôi nếu ứng dụng của bạn có thể được sử dụng trên máy tính từ xa - xem [liên kết này] (http://blogs.msdn.com/b/oldnewthing/archive/2006/01/03/508694.aspx) . Bạn có thể kiểm tra xem phiên hiện tại là máy tính từ xa với: 'if (SystemInformation.TerminalServerSession) ...' – Bridge