gpt4 book ai didi

c# - 在屏幕共享程序中存储带哈希的图像缓冲区的内存管理

转载 作者:行者123 更新时间:2023-11-30 12:54:26 25 4
gpt4 key购买 nike

编辑: 对于这个问题,我没有得到足够的答复,可能是我无法正确解释。让我试着解释一下这个问题的背景。

每个屏幕共享程序都有两方。服务器和查看器。

服务器

服务器的作用

  • 捕获桌面屏幕
  • 将捕获的屏幕与之前发送的屏幕进行比较
  • 计算脏区转换脏区为字节数组
  • 将字节数组发送到 tcp 套接字给查看器

查看者

观众的角色

  • 从服务器接收数据
  • 将字节转换为图像
  • 将图像绘制到查看器图片框/面板

要解决的问题

  • 有许多重复的区域/区域服务器发送,这是以前发送给观看者 10/20 帧后退。我想使用散列法避免这种情况。

下面是我的分析

我正在研究屏幕传输应用程序(如 Team Viewer、Any desk)的工作原理,并确定它们如何在带宽非常低的互联网连接中正常工作。

在学习期间,我遇到了屏幕共享应用 Any Desk。它使用 xxHash 对图像进行哈希处理,并将图像字节数据与他的哈希码一起发送。

我在移动互联网上使用了网络速度监视器并开始应用。

我观察到在桌面上多次执行相同的事件(例如打开/关闭同一目录、最小化和最大化任何应用程序)。除第一个请求外,应用程序不会向客户端发送任何数据/区域。我假设如果发现重复的图像/脏区哈希码,它只向客户端发送哈希码

我的问题是这种方法的可行性如何,因为在客户端。我们需要将哈希码与图像字节数据一起存储在内存中。这个应用程序如何提高内存效率。或者他们有其他方法吗?

编辑

屏幕共享程序不会每次都发送整个屏幕/区域。它只是通过互联网发送差异/脏区域。如果用户的互联网连接非常糟糕,它会存储每个帧/区域的字节数组以及哈希码。发送如果 hascode 与差异帧/区域 bytearray 匹配,则仅 hashcode

服务器代码假设

     List<uint> hashlist = new List<uint>();
byte[] imagesBytestosend = GetImageBytes();

uint hash = XXHash.XXH32(imagesBytestosend);

if (!hashlist.Contains(hash))
{
hashlist.Add(hash);
SendAllBytesData(imagesBytestosend);
}
else
{
SendOnlyHasCode(hash);

}


客户端代码假设

    Dictionary<uint, byte[]> frameData = new Dictionary<uint, byte[]>();
bytes[] imageBytes = null;
if(frameData.ContainsKey(receivedHash))
{
imageBytes=frameData[receivedHash];
}
else
{
imageBytes=receivedBytes;;
frameData.Add(receivedHash, receivedBytes);
//My Question is how this is memory efficient to store frame bytes with his hash code in memory
}
DrawToPictureBox(imageBytes);

最佳答案

如果图像仍然打开,那么它仍然在客户端的内存中。所以唯一的开销是哈希码,它非常小。如果有的话,它在您描述的场景中是有效的。如果未存储哈希码,则将再次发送相同的图像(已在内存中),从而浪费带宽并导致相关的性能问题。然而,由于保存了哈希,客户端只需从内存中的字节重绘相同的图像。

当然,当您关闭该图像时,与其关联的内存可能很快就会释放。因此,如果您在一段时间后打开同一目录,则必须重新发送图像日期和哈希码。

关于c# - 在屏幕共享程序中存储带哈希的图像缓冲区的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56405102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com