【发布时间】:2014-05-14 11:21:01
【问题描述】:
我的任务是编写一个(非托管 c++ win32)应用程序,通过网络向另一台计算机显示 Windows CE 5.0 的当前桌面。客户要求原码,我找到的一些VNC码拒绝了。
我有一些工作,但我遇到了吞吐量瓶颈。我能找到获取屏幕像素的唯一方法是使用 CreateDibSection 创建一个 DIB,并使用 Bitblt 将像素复制到缓冲区。在分析我的代码后,我发现在 Windows 7 上,我的应用程序使用的 60% 的 CPU 时间都花在了 Bitblt 上。在 Windows CE 上,它更像是 80%。 我使用每像素 32 位、24 位还是 16 位似乎并不重要。
我的问题是: 有没有比 CreateDibSection 和 BitBlt 更好(更快)的方法来准备整个桌面像素?在我的应用程序中,它将在特定硬件上运行,因此我不需要设备独立性。
【问题讨论】:
-
首先尝试依赖设备的位图?
-
你试过用很大的放大镜吗?
-
是否可以按需提供屏幕截图,或者是否期望能够以 30fps 或介于两者之间的速度观看视频?除非你有很大的预算和大量的时间,否则要求复制 RDP 或 VNC 的功能似乎有点愚蠢。
-
Blitting 到 DIB 部分几乎肯定会涉及像素格式转换。尝试使用兼容的位图(CreateCompatibleDC 和 CreateCompatibleBitmap)并从屏幕到该位图。
标签: c++ windows windows-ce gdi