рддрддреНрдХрд╛рд▓ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг: рддреЗрдЬ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдмрд┐рдЯрдореИрдк 200x100 рдФрд░ 1366 рдкрд░ i7 3930Kред рд▓реЗрдХрд┐рди, рдпрд╣ рдПрдХ рдИрдорд╛рдирджрд╛рд░ System.Drawing.Bitmap рд╣реИред
рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ: рдПрдХ рдЖрд╕реНрдЯрд╕реАрд▓рд╕реНрдХрдк рдкреНрд░рдХрд╛рд░ рдЖрд╡реЗрджрдиред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рджреГрд╢реНрдпрдкрдЯрд▓ рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред
рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдЬрд▓реНрджреА рдХреИрд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВ?
WriteableBitmap рдЕрдЪреНрдЫрд╛, рддреЗрдЬ, рдФрд░ рдпрд╣ WP, WinRT, WPF рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рд▓реЗрдХрд┐рди WinForms .Net 2.0, Win2K рдмреЛрд░рд┐рдВрдЧ рдкреБрд░рд╛рдиреЗ рд╕рдордп рдХреЗ рдПрдирдХреЛрдбрд░-рдПрдирдХреЛрдбрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ (рд╣рд╛рдБ, рдХреБрдЫ рд░рд╛рдЬреНрдп рдирд┐рдХрд╛рдпреЛрдВ рдореЗрдВ рдЕрднреА рднреА рдПрдХ
рдЧрд░реНрдо рдЯреНрдпреВрдм Win2K рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдбрд╛рдпрд░реЗрдХреНрдЯрдПрдХреНрд╕ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА
рдбреА 3 рдбреАрдореИрдЬ рдирд┐рдпрдВрддреНрд░рдг рдерд╛ред рдореИрдВрдиреЗ рдХрдИ рдЗрдВрдЬрди рдЖрдЬрд╝рдорд╛рдП, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рднреА рдореЗрдореЛрд░реА рд╕реЗ GDI + рдмрд┐рдЯрдореИрдк рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХрд╛ рдирд╣реАрдВ рджрд┐рдпрд╛ред рдХреБрдЫ рдиреЗ рдХреЗрд╡рд▓ DX10-11 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ред рдЯрд╛рд░рдЧреЗрдЯ рдХреЗ рд╕рдмрд╕реЗ рдирдЬрджреАрдХ рдерд╛
рд╕реНрд▓рд┐рдордбреАрдПрдХреНрд╕ ред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рдордиреЗ рдХрд╛ рдЫреЛрд░ рдмрджрд╕реВрд░рдд рдерд╛ред рдЗрди рд╕рднреА рдЗрдВрдЬрдиреЛрдВ ... рдореЗрд░реЗ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рд╕реЗ рдирд┐рд░рд░реНрдердХ рд░рдЦрд╛ рдЬрд╛рдПред
рд▓реЗрдХрд┐рди рдПрдХ рдЙрдкрд╛рдп рд╣реИред
рдФрд░, рдореЗрд░реА рдЦреБрд╢реА рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдирд┐рдХрд▓рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ Win2K рдФрд░ .NET 2.0 рдкрд░ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдЬрдм рдореИрдВ рдЫреЛрдЯрд╛ рдерд╛, рдФрд░ рдореБрдЭреЗ рдЕрднреА рднреА 5-рдЗрдВрдЪ рдХреА рдбреНрд░рд╛рдЗрд╡ рд▓рдЧрддреА рдереА, рддреЛ рдореИрдВрдиреЗ BitBlt рдФрд░ SetDIBitsToDevice рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдлрд┐рд░ .Net рдкрд░ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рдЕрднреА рднреА рдЙрдиреНрд╣реЗрдВ рдФрд░ Win32 GDI BITMAP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдкреБрд░рд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рддрдм рд╕рдм рдХреБрдЫ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЕрдЪрд╛рдирдХ, рдЕрдм рдореБрдЭреЗ рдкрд┐рдХреНрд╕реЗрд▓-рдмрд╛рдп-рдкрд┐рдХреНрд╕реЗрд▓ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕, рдФрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд╕рд╛рде рдПрдХ рдЧреИрд░-рдорд╛рдирдХ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рддреЛ рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдореГрдд рдЕрдВрдд рдореЗрдВ рдЖ рдЧрдпрд╛ред
рдЬреАрдбреАрдЖрдИ + рдмрд┐рдЯрдореИрдк рдЕрдкрдиреЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕, рдПрдВрдЯреАрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдФрд░ рдЕрд▓реНрдлрд╛ рдХреЗ рд╕рд╛рде рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдмрд╣реБрдд рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдореЗрдореЛрд░реА рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдмрд┐рдЯрдореИрдк рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХрд╛рдВрд╢ рдЫрд╡рд┐ рдХреЛ рдХреИрд╢ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░реАрди рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдпрд╛рдж рдХрд░рдирд╛ рдерд╛:
[DllImport("gdi32")] extern static int SetDIBitsToDevice(HandleRef hDC, int xDest, int yDest, int dwWidth, int dwHeight, int XSrc, int YSrc, int uStartScan, int cScanLines, ref int lpvBits, ref BITMAPINFO lpbmi, uint fuColorUse);
рдФрд░ рдЕрдВрдд рдореЗрдВ
рдкреНрд░рдореБрдЦ рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓реА:
public void Paint(HandleRef hRef, Bitmap bitmap) { if (bitmap.Width != _width || bitmap.Height != _height) Realloc(bitmap.Width, bitmap.Height);
рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХреАред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЙрдиреНрд╣реЗрдВ рдЬреАрд╕реА рдХреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╣рдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрдЯреНрдЯрд░ рдПрдлрдкреАрдПрд╕ рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ _рдкреНрд░рд╛рдпрд░ рдХрд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рддреЛ рдЧрдЪреЗрдВрдбрд▓ рдореБрдЭреЗ рд░рд┐рдпрд▓рд▓реЛрдХ () рдореЗрдВ рдПрдХ рдмрд╛рд░ рдорд╛рд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ ... рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 15,000, рдкреНрд▓рд╕ рдпрд╛ рдорд╛рдЗрдирд╕ рджреЛ рд╕реМ рдПрдлрдкреАрдПрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдПрдХ рднреВрдорд┐рдХрд╛ рдирд╣реАрдВ рдирд┐рднрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкреЗрдВрдЯ рдореЗрдВ рдЕрд╕рд╣рдЬрддрд╛ () - Realloc () рдореЗрдВ рдкрд┐рди рдмрд╛рд╣рд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред
рдЗрд╕рд▓рд┐рдП, рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 100 рд▓рд╛рдЗрдиреЛрдВ (рдиреАрдЪреЗ рд╕рдВрд▓рдЧреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреВрд░реНрдг рдХреЛрдб) рдХреА рдХреАрдордд рдкрд░, рд╣рдордиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдлрдкреАрдПрд╕ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХреАред тАЛтАЛрдХреНрд░рд┐рдЯрд┐рдВрдЧред рдмрд┐рдЯрдореИрдк, рдФрд░ рдХреЛрдИ рд░рд╛рдХреНрд╖рд╕реА рдЬреАрдкреАрдпреВ рдЗрдВрдЬрди рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдирд╣реАрдВред Microsoft рдЗрдВрдЬреАрд▓рд╡рд╛рджрд┐рдпреЛрдВ рдХрд╛ рдЧреБрд╕реНрд╕рд╛ рд╕рдВрднрд╡ рд╣реИ "рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рдерд╛рдУрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИ," рд▓реЗрдХрд┐рди рдЖрдк рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд╛рдВрдЫрд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рд╕реАрдорд╛ рдХреЛ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рдХрдИ рд░реЗрдЦрд╛рдУрдВ рддрдХ рдШрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
RazorPainter RP = new RazorPainter(); graphics = Control1.CreateGraphics(); hDCRef = new HandleRef(graphics, graphics.GetHdc()); public void Render() { RP.Paint(hDCRef, BMP); } RP.Dispose(); graphics.Dispose();
рдФрд░ рдЕрдм рдХреБрдХреАрдЬрд╝ ! GDI32 рдХреЗ "рдЕрдВрдзреЗрд░реЗ рдкрдХреНрд╖" рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╣рдо рдпреВрдЖрдИ рдереНрд░реЗрдб рдХреЗ рдкреНрд░рддрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдЙрджрд╛рд╕реАрди рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд░рд┐рдХреЙрд░реНрдб рдПрдлрдкреАрдПрд╕ рдХреА рдЦрд╛рддрд┐рд░, рд╣рдо рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ рдПрдХ рдЕрд▓рдЧ рдкреВрд░реНрдг рд╕реВрддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЗрд╕рдореЗрдВ рдХреНрд░реВрд░ рд╣реИ:
renderthread = new Thread(() => { while (true) Render(); }); renderthread.Start();
рдЕрднреА рднреА рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рд╡рд░рдг рд╣реИред рдЪреВрдВрдХрд┐ рдУрдПрд╕ рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЧреБрдВрдбрд╛рдЧрд░реНрджреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ рд╡рд┐рдВрдбреЛ рдореЗрдВ WndProc рдпрд╣ рдмреЗрдХрд╛рд░ рдФрд░ рдмреЗрдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдардкреВрд░реНрд╡рдХ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреГрд╖реНрдарднреВрдорд┐ рд░рдВрдЧ рдХреЛ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреАрдбрд╝рд╛ рд╕реЗ OS рдХреЛ рдмрдЪрд╛рдПрдВрдЧреЗ (рдФрд░ FPS рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛рдПрдВрдЧреЗ):
public RazorBackend() { InitializeComponent(); SetStyle(ControlStyles.DoubleBuffer, false); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.Opaque, true); }
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдлрдкреАрдПрд╕ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдорд╛рдорд▓рд╛ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реИ - рдпрд╣рд╛рдВ рдмрд╕, рдкреНрд░реЛрд╕реЗрд╕рд░, рдореЗрдореЛрд░реА, рдЙрдирдХреА рдмреИрдВрдбрд╡рд┐рдбреНрде рдХреА рдЖрд╡реГрддреНрддрд┐ рднрд╡реНрдп рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдХреНрд╡рд╛рдВрдЯрдо рдкреНрд░рднрд╛рд╡ред
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ 15600 рдПрдлрдкреАрдПрд╕ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛, рдЖрд╡реЗрджрди рдореЗрдВ ~ 30 рдПрдордмреА рдореЗрдореЛрд░реА рд▓рдЧрддреА рд╣реИ, рд▓реЗрдХрд┐рди 8% рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЭреЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЦреБрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ 3930K рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИред рдФрд░ рдлрд┐рд░ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ "рдЪрд┐рд▓реНрд▓рд╛рдпрд╛": "рдорд╛рд╕реНрдЯрд░, рдореБрдЭреЗ рдорд┐рд░реНрдЧреА рд╣реИ!", рдФрд░ рдПрдХ рдореЙрдирд┐рдЯрд░: "рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗрд╡рд▓ 60 рд╣рд░реНрдЯреНрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ!" рдмреЗрд╢рдХ, рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдлрдкреАрдПрд╕ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рд╣реА рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
rendertimer = new DispatcherTimer(); rendertimer.Interval = TimeSpan.FromMilliseconds(15); rendertimer.Tick += (o, args) => Render(); rendertimer.Start();
рдЦреИрд░, рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ, рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдПред рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдирд┐рдкрдЯрд╛рди рд╢реВрдиреНрдп + рддреНрд░реБрдЯрд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ WPFред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рдФрд░ рд╕рд░рд▓ рд╣реИред WPF "рдирд┐рдпрдВрддреНрд░рдг" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд╣реИрдВ (рдЕрдиреНрдпрдерд╛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдореЛрдбрд╝ рдФрд░ рд╕рдорддрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдбреАрд╕реА рдирд╣реАрдВ рд╣реИред WPF рдореЗрдВ WindowsFormsHost рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ WindowsForms рдирд┐рдпрдВрддреНрд░рдг рдХреА рдореЗрдЬрдмрд╛рдиреА рдХрд░рдХреЗ рд╕рдм рдХреБрдЫ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╕рдВрд▓рдЧреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, WPF рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╢реБрджреНрдз WindowsForms рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлреНрд░рдВрдЯ-рдПрдВрдб рдПрдХ рдмреВрдЯ рдХреА рддрд░рд╣ рд╕рд░рд▓ рд╣реИред
рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрд┐рдЯрдореИрдк рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрди рд╣реЛрддреА рд╣реИ:
GFX.Clear((drawred = !drawred) ? System.Drawing.Color.Red : System.Drawing.Color.Blue);
рдмреЗрд╢рдХ, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рдХреА рдПрдлрдкреАрдПрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рдореВрд▓ рдмрд┐рдЯрдореИрдк рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╕ рдПрдХ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдкрдиреЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рдПрдХ рдмреЗрддрд╣рд╛рд╢рд╛ рддреЗрдЬрд╝ рдмреНрд▓реЙрдХ рдСрдкрд░реЗрд╢рди рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рдЧрддрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред
рдЕрдкрдиреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕реНрд░реЛрдд рдФрд░ рдирд┐рд░реНрдорд╛рдг, MIT рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд CodePlex рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛:
http://razorgdipainter.codeplex.com/(рдореИрдВ рдХреЛрдбрдкрд▓реЗрдХреНрд╕ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рддреБрдЪреНрдЫ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЕрдЧрд░ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдУрдкрдирд╕реЛрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╕реНрд╡рд░реВрдк рджреВрдВрдЧрд╛)
UPD :
alexanderzaytsev рд╕рдЪ рдореЗрдВ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ WPF рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдореЗрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдХреЗрд╡рд▓ RazorPainter.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ, рдФрд░ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрдХрд░рдгреАрдп рдкреИрдЯрд░реНрди рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ WPF рдореЗрдВ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ FPS рджрд┐рдЦрд╛рддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╢рд╛рдпрдж рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдмрд╛рд╣рд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдУрдкрдирд╕реЛрд░реНрд╕ рдврд╛рдВрдЪрд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА WinForms рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред
UPD2 : рдкрдж рдЬрд╛рд░реА рдерд╛:
http://habrahabr.ru/post/164885/ CodePlex рдкрд░ рд╕реЙрд░реНрдЯ рдФрд░ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдирд╛ vред 0.6 рдмреАрдЯрд╛