【问题标题】:Best way to transfer bitmap object over lan通过局域网传输位图对象的最佳方式
【发布时间】:2009-06-04 06:20:42
【问题描述】:

我需要在 C# 中通过局域网传输位图对象的最快方法。

阿卜杜勒·哈利克

【问题讨论】:

  • 您能说得更具体些吗?因为知道我认为:“压缩并通过电子邮件发送”,但这不是你想听到的。
  • 我有一个位图对象,比如说一个屏幕截图实例。我需要通过局域网传输它。我需要知道通过 lan serlizing 传输它或以二进制格式等发送它的最快方法是什么?

标签: c# .net data-transfer


【解决方案1】:

“最好”这个词充其量只是一个主观术语:-)

如果您在谈论速度,那么它取决于位图的大小。对于以 100Mbps 运行的 LAN,您可以预期每 10MB 文件大约需要 1 秒。对于小文件,只需按原样传输即可。在某个文件大小时,值得将文件压缩、传输并在另一端解压缩,这仅仅是因为 CPU grunt 比网络 grunt 快。

但我认为您会谈论相当大的文件以使额外的编码变得有价值。

更新:

由于您谈论的是屏幕捕获帧,假设我们的分辨率为 1280x1024、32bpp。然后,全屏将占用 5M,这应该可以在一秒钟内在 100Mbps 的 LAN 上传输(其他网络流量允许)。在我看来,尝试再加快速度是不值得的,因为压缩的开销会超过节省的时间。

如果您要进行 视频 传输,那是另一回事。然后你就不会为每一帧发送一个全新的图像 - 你会计算出增量并只传输该信息,这取决于屏幕通常每帧只会改变一点的事实。

这取决于您要将图像用于什么用途。一次截屏,只需发送二进制信息。其他的,好吧,你需要给我们更多的细节。

对于视频传输,我们实际上已经在不同的压缩方法上做了一些工作。

您可能想要查看的最简单的方法是将屏幕划分为(例如)16x16 矩阵并仅传输更改的元素。

因此,例如,每一帧将包含一个 256 位的位掩码,指示哪些元素已更改。然后,该位掩码后面是元素本身。

该算法意味着最小的帧增量是 32 字节(如果屏幕没有改变)。最大的只比全屏转储大 32 字节。

我们使用的其他方法之一是简单地存储已更改的最左上角和最右下角的像素位置,并将这两个值与它们所包围的整个矩形一起传输。

毫无疑问,您还可以使用其他方法,甚至可以逐帧动态选择方法以确保最小增量大小。

【讨论】:

  • 位图对象的大小几乎为 3000 KB,我需要像屏幕捕获一样通过局域网非常频繁地发送它。考虑在一秒钟内发送 11 个位图对象。那么最快的方法是什么?
  • 查看更新,您不应该在每一帧都发送全屏转储。使用算法来检测屏幕的哪一部分发生了变化并仅发送增量。
  • 好吧,我们已经在使用镜像驱动程序来计算屏幕上的增量,并采用联合和交集来进一步减少要通过局域网发送的位图对象的数量。问题不在于计算增量,而是如何通过局域网有效地传输它们。
  • 那么您可能需要进一步澄清这个问题。根据您提供的信息,您找不到比仅保持套接字打开并在您弄清楚它们时发送增量的原始二进制数据更快的方法来传输增量。增量将足够小,以至于您不会通过压缩获得任何收益。如果有的话,您更有可能通过优化 delta 计算来加快速度。
  • 我已经开发了优化算法,用于计算在一个实例中需要发送的最小位图
【解决方案2】:

这是 .NET V2.0 SP1 和 .NET 3.5 版本的 CopyFromScreen() 中的 bug。它泄漏了一个句柄,一段时间后你会用完可用的句柄并得到像这样的奇怪错误消息。您不能在目前的情况下使用它,请检查此线程以通过 P/Invoking Windows API 函数来执行此操作。

this 链接上也有一个不错的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2020-05-12
    相关资源
    最近更新 更多