在将结果发送到 Web 客户端之前,我们的 Web 服务器需要一起处理许多大图像的组合。此过程对性能至关重要,因为服务器每小时可以接收数千个请求。
现在,我们的解决方案从 HD 加载 PNG 文件(每个大约 1MB)并将它们发送到视频卡,以便在 GPU 上完成合成。我们首先尝试使用 XNA API 公开的 PNG 解码器加载我们的图像。我们看到性能不太好。
为了了解问题是从 HD 加载还是 PNG 的解码,我们通过将文件加载到内存流中进行修改,然后将该内存流发送到 .NET PNG 解码器。使用 XNA 或使用 System.Windows.Media.Imaging.PngBitmapDecoder 类的性能差异并不显着。我们大致获得了相同水平的性能。
我们的基准测试显示了以下性能结果:
- 从磁盘加载图像:37.76ms 1%
- 解码 PNG:2816.97ms 77%
- 在视频硬件上加载图像:196.67ms 5%
- 组成:87.80ms 2%
- 从视频硬件获取合成结果:166.21ms 5%
- 编码为 PNG:318.13ms 9%
- 存储到磁盘:3.96ms 0%
- 清理:53.00ms 1%
总计:3680.50ms 100%
从这些结果中,我们看到最慢的部分是在解码 PNG 时。
所以我们想知道是否没有我们可以使用的PNG解码器来减少PNG解码时间。我们也考虑过在硬盘上保留未压缩的图像,但是每个图像的大小将是 10MB 而不是 1MB,并且由于硬盘上存储了数万张这样的图像,因此无法将它们全部存储压缩。
编辑:更多有用的信息:
- 该基准模拟加载 20 张 PNG 图像并将它们合成在一起。这将大致对应于我们将在生产环境中获得的请求类型。
- 合成中使用的每张图像的大小为 1600x1600。
- 该解决方案将涉及多达 10 台负载平衡服务器,就像我们在这里讨论的那样。因此,额外的软件开发工作可能值得节省硬件成本。
- 缓存解码的源图像是我们正在考虑的事情,但是每个合成很可能使用完全不同的源图像完成,因此缓存未命中率很高,而性能增益很低。
- 基准测试是使用糟糕的显卡完成的,因此我们可以预期 PNG 解码使用像样的显卡会成为性能瓶颈。