【问题标题】:Reduce CPU usage of Bitmap.Save减少 Bitmap.Save 的 CPU 使用率
【发布时间】: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


【解决方案1】:

您无法更改保存图像所需的 CPU 使用量(同时保持压缩率和图像类型)。只要线程具有低优先级,压缩使用所有可用的 CPU 应该没有问题。如果有另一个具有更高优先级的线程想要运行,您的压缩将被自动限制。
如果您在另一个具有正常优先级的应用程序中运行繁重的计算,您应该会看到压缩的 CPU 使用率较低。

但是,图像压缩不一定受 CPU 限制。它可能是 I/O 绑定的,即等待从磁盘读取/写入磁盘。不幸的是,这比 CPU 密集型任务更难控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多