【发布时间】:2013-06-01 00:08:31
【问题描述】:
我正在创建一个在计时器上运行的应用程序,并且每个滴答声我都想截取屏幕截图并将其保存到磁盘。这应该在后台运行,所以我希望它占用尽可能少的 CPU 时间。但是,当我进行性能分析时,我发现大约 40% 的时间花在Bitmap.Save 上,而我的 CPU 使用率平均高达 10%-15% 左右(这是一台旧电脑)
所以我的问题是,有没有办法限制图像保存过程,以便Bitmap.Save 不会使用这么多处理器时间?
我尝试过设置Thread.CurrentThread.Priority = ThreadPriority.Lowest;,但变化不大,使用线程池也没有。
这就是我正在做的事情:
public static void SaveScreenshot(string path)
{
Bitmap bmp = TakeScreenshot();
Directory.CreateDirectory(Path.GetDirectoryName(path));
bmp.Save(path);
bmp.Dispose();
}
【问题讨论】:
-
所需的输出文件格式是什么? PNG、JPEG、BMP..、?
-
它是 PNG。也许它在压缩上花费了很多时间?
-
刚刚测试过,保存为 BMP 大约快 5-6 倍,但文件也大 30 倍。 JPEG 大约快 2 倍并且大小大致相同,但它具有有损压缩。有没有办法在压缩 PNG 图像时限制 CPU 使用率,或者这只是性能和图像大小/质量之间不可避免的权衡?
-
如果您需要更高的性能,那只有一种方法——尝试使用一些第三方非托管库进行图像压缩(例如,libjpeg/libpng)。使用 Bitmap.LockBits 提取位图数据(像素值),然后将该数据传递给库中合适的函数。
-
我现在不太关心性能,我宁愿简单地拆分压缩任务并将其分散到计时器滴答之间的时间,这样它就不会导致 CPU 出现峰值用法。如果不编写我自己的(或使用第 3 方)库,这是否可能?
标签: .net performance io bitmap