现在我正在通过WinApi的BitBlt
将窗口图形从一个窗口复制到另一个窗口。我想知道在C#中是否还有其他快速/更快的方法可以做到这一点。
此处的关键字是性能。如果我留在WinApi,我会把HDC
保存在内存中,以便快速绘制和If。NET框架还有其他的可能性,我可能会持有Graphics
对象。现在,当我必须复制约1920x1080个窗口时,我有点慢。
那么我如何在C#中提高gui复制的性能呢
我只是想知道我是否能做得更好。显式硬件加速(OpenGL,DirectX)不在我的兴趣范围之内。我决定保持纯洁。NET+WinApi。
// example to copy desktop to window
Graphics g = Graphics.FromHwnd(Handle);
IntPtr dc = g.GetHdc();
IntPtr dc0 = Windows.GetWindowDC(Windows.GetDesktopWindow());
Windows.BitBlt(dc, 0, 0, Width, Height, dc0, 0, 0, Windows.SRCCOPY);
// clean up of DCs and Graphics left out
Hans的问题:
- 有多慢?
- 太慢了。感觉(很)僵硬
- 它需要多快?
- 软件不能感觉慢
- 为什么它很重要?
- 软件的用户友好性
- 硬件是什么样子的?
- 任何随机PC
- 为什么你不能用更好的硬件来解决它?
- 它只是在Windows机器上运行的软件。你不会为了一个在旧电脑上运行缓慢的随机软件而去买一台新电脑吗
获得更好的视频卡!
GDI的全部意义,无论您是从本机代码还是通过访问它。Net,就是它抽象了图形子系统的细节。不利的一面是,像闪电战这样的低级别操作掌握在图形驱动程序编写者手中。你可以放心地假设这些都是尽可能优化的(毕竟,视频卡制造商希望让他们的卡看起来最好)。
使用的开销。与操作本身所花费的时间相比,网络包装器而不是直接使用本机调用显得微不足道,所以你不会真正获得太多好处。
您的代码正在进行非缩放、非混合复制,这可能是复制图像的最快方法。
当然,您应该分析代码,看看您对代码所做的任何更改都会产生什么影响。
那么问题来了,你为什么要把这么大的图像从一个窗口复制到另一个窗口?你控制两个窗口的内容吗?
更新
如果同时控制两个窗口,为什么不绘制到一个曲面上,然后将其闪电复制到两个窗口上?这应该用两次写入操作来取代从视频卡读取数据的通常成本高昂的操作(即从一个窗口到另一个窗口的闪电传输)。这只是一个想法,可能不起作用,但你需要时间数据来看看它是否有什么不同。