WPF, WinForms: 15000 FPSред рд╣рд╛рд░реНрдбрдХреЛрд░ рдЯреНрд░рд┐рдХ h.1.5

рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдирд┐рд░рдВрддрд░рддрд╛ (рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЕрдиреБрдирд╛рдж рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА), рдЗрд╕рд▓рд┐рдП рдХрдЯреНрдЯрд░ рдЪрд╛рд▓ рдХреЗ рднрд╛рдЧ 2, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреБрдЫ рдФрд░ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬрдмрдХрд┐ рдореИрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВред
рддреЛ, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХреНрдпрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ: WindowsForms рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, WPF рд╡рд┐рдХрд▓реНрдк рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдереНрд░реЗрдбрд╕реЗрдлрд╝ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдЕрдм рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдирдореВрдиреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдкрд░ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ -) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд░рд╛рд╡рдирд╛)ред рдЙрди рдХреЙрдорд░реЗрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдХрдорд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдЕрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЧрд░реНрд╡ рд╕реЗ 0.5 рдмреАрдЯрд╛ рд╣реИред рдЖрдк рддреБрд░рдВрдд razorgdipainter.codeplex.com/ рдкрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдореИрдВ рдПрдХ рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реВрдВред

рд╣рдо WinForms-use рдХреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рд▓рдЧрднрдЧ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг:
private readonly HandleRef hDCRef; private readonly Graphics hDCGraphics; private readonly RazorPainter RP; public Bitmap RazorBMP { get; private set; } public Graphics RazorGFX { get; private set; } public RazorPainterWFCtl() { InitializeComponent(); this.MinimumSize = new Size(1, 1); SetStyle(ControlStyles.DoubleBuffer, false); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.Opaque, true); hDCGraphics = CreateGraphics(); hDCRef = new HandleRef(hDCGraphics, hDCGraphics.GetHdc()); RP = new RazorPainter(); RazorBMP = new Bitmap(Width, Height, PixelFormat.Format32bppArgb); RazorGFX = Graphics.FromImage(RazorBMP); this.Resize += (sender, args) => { lock (this) { if (RazorGFX != null) RazorGFX.Dispose(); if (RazorBMP != null) RazorBMP.Dispose(); RazorBMP = new Bitmap(Width, Height, PixelFormat.Format32bppArgb); RazorGFX = Graphics.FromImage(RazorBMP); } }; } public void RazorPaint() { RP.Paint(hDCRef, RazorBMP); } 

рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдб рдПрдХ рдмреВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рд╕реЗ рдХрдВрдЯреНрд░реЛрд▓ рдХреЛрдб рдореЗрдВ GFX рдФрд░ BMP рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рддреБрд░рдВрдд рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИред рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░рдЬрд╝реЗрддреНрд╕реЗрд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рджрд┐рд▓ рдореЗрдВ рд╢рд╛рдВрдд рд╣реИ - рдлреНрд░рдВрдЯ-рдПрдВрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрд╢реЛрднрдиреАрдп рдмрдирд╛рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛, рдФрд░ рдЖрдХрд╛рд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдЖрдХрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛрдб рдореЗрдВ рд▓реЙрдХ () рднреА рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдореБрдЦреНрдп рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдзрд╛рд░рд╛ рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд╣реИред рд╣рдо рдпреВрдЖрдИ рдереНрд░реЗрдб рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧреЛрдВ рд╕реЗ рднреАред рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА рдмрд┐рдЯрдореИрдк рдкрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗ, рдЬрд┐рд╕реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рдХрд╛рд░рдг рдкреБрдирдГ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?
рдХреНрд░рдорд╢рдГ, рд╡рд┐рдВрдбреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдлреНрд░рдВрдЯ рдХреЛрдб рднреА рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ:
 private void Render() { lock(razorPainterWFCtl1) { razorPainterWFCtl1.RazorGFX.Clear((drawred = !drawred) ? Color.Red : Color.Blue); razorPainterWFCtl1.RazorGFX.DrawString("habr.ru", this.Font, Brushes.Azure,10,10); razorPainterWFCtl1.RazorPaint(); } } 

рдПрдХ рдФрд░ рддрд╛рд▓рд╛ (), рд▓реЗрдХрд┐рди рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдФрд░ рдЖрдХрд╛рд░ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИред
WPF- рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд▓рдЧрднрдЧ рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрдиред рдпрд╣ рдереНрд░реЗрдб рдХреИрдлреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдирд╛рдбрд╝реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбреЗрдореЛ рдЯреЗрд╕реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред
WF рдореЗрдВ, рдЬрдм рдПрдХ рдЦрд┐рдбрд╝рдХреА рдмрдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реНрдЪреА рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ - рдмрд╕ рд░реЗрдВрдбрд░ рдЪрдХреНрд░ рдХреЛ рдмрджрд▓реЗрдВ, рдХреНрдпреЛрдВрдХрд┐:
 renderthread = new Thread(() => { while (true) Render(); }); 
рдпрд╣ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╡рдХреВрдлреА рднрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдбрдмреНрд▓реНрдпреВрдПрдл рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдбрдмреНрд▓реНрдпреВрдПрдл рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдПрдХ рдмрдЪреНрдЪреЗ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ WPF рдФрд░ WF рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдЧреЗ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдореИрдВ рдмрд╕ рдЦреБрдж рдХреЛ рдбрд░рд╛рддрд╛ рд╣реВрдВ, рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╢рд╛рдЦрд╛рдПрдВ рд╡рд┐рд▓реАрди рд╣реЛ рдЬрд╛рдПрдВрдЧреАред

рдПрдордЖрдИрдЯреА рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдЕрдкрдиреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЕрд░реНрдерд╛рдд рдХрд┐рд╕реА рднреА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ред рдЬрд┐рд╕рдХреА рднреА рдЗрдЪреНрдЫрд╛ рд╣реЛ - рдХреЛрдбрдкреНрд▓реЗрдХреНрд╕ рдкрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдЬреБрдбрд╝реЗред

UPD : рд╣рд╛рдмрд░рд╛-рдХрд╛рдорд░реЗрдб рд╕рд╛рдЗрдирдЯреЗрдЬрд╝ рдФрд░ nile1 рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ
 /// <summary> /// Lock it to avoid resize/repaint race /// </summary> readonly object RazorLock = new object(); 
рдкрд░реАрдХреНрд╖рдг рдлреЙрд░реНрдо рдкрд░ рдЖрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рде // рдмреЗрд╣рддрд░ рдЕрднреНрдпрд╛рд╕ рдореЙрдирд┐рдЯрд░ рд╣реИред рдЯреНрд░рд╛рдЗрдЯрд░ () рдкреИрдЯрд░реНрди, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕реЗ рд╕рд░рд▓ рдХрд░рддреЗ рд╣реИрдВ
рджрд░рдЕрд╕рд▓, рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реЛ рдЧрдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдХреЛрдбреЗрдХреНрд╕ рдкрд░ рдХреЛрдбреЗрдХреНрд╕ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, 0.6 рдмреАрдЯрд╛ рдЬрд╛рд░реА рдХрд┐рдпрд╛, рдзрдиреНрдпрд╡рд╛рдж рд╕рднреА рдиреЗ рд▓рд┐рдЦрд╛ред

Source: https://habr.com/ru/post/In164885/


All Articles