适用于 .NET 的最快 PNG 解码器

2024-05-01

我们的网络服务器需要先处理许多大图像的组合,然后再将结果发送到网络客户端。此过程对性能至关重要,因为服务器每小时可以接收数千个请求。

现在,我们的解决方案从 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 解码会成为性能瓶颈。

还有另一种选择。也就是说,您编写自己的基于 GPU 的 PNG 解码器。您可以使用 OpenCL 相当高效地执行此操作(并使用可以与 OpenCL 共享资源的 OpenGL 执行合成)。还可以交错传输和解码以获得最大吞吐量。如果这是您可以/想要追求的路线,我可以提供更多信息。

以下是一些与基于 GPU 的 DEFLATE(和 INFLATE)相关的资源。

  1. GPU 块压缩 http://code.google.com/p/gpu-block-compression/在 Google 代码上使用 CUDA。
  2. - 请注意,这不使用 INFLATE/DEFLATE,而是使用一种新颖的并行压缩/解压缩方案,该方案对 GPU 更友好。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适用于 .NET 的最快 PNG 解码器 的相关文章

  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are
  • 文件修改时间检查的成本

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐