减少网络带宽的使用

本文关键字:网络带宽 | 更新日期: 2023-09-27 18:16:42

我将给出一个小的介绍:我在c#中工作一个小的屏幕共享项目,我使用Tcp Protocol发送数据。基本上,我从GDI调用BitBlt方法,它做得很好。第一次我发送整个缓冲区,然后我迭代并只发送改变的像素。我发送的缓冲区中的每个字节代表一个组件(以Rgba顺序)-这是一个简短示例的小数组:

byte[] pixelarray = { 45, 201, 173,1 };
//R=45,G=201,B=173,Alpha=1(always 1 on screen).

让我们继续。我的屏幕是1920x1080(在我的情况下),所以实际上1920x1080x4(每个像素是4字节)=高达8,294,400像素。使用 Gzipstream压缩,将大小减少到~250kb。这是我第一次发送的。之后,我简单地比较每个BitBlt捕获的字节数组,并只发送改变的像素。它看起来像这样:

public void StartAsync(ScreenFrame frame)
    {
        using (var memoryStream = new MemoryStream())
        {       
           for (var i = 0; i < frame.NewPixels.Length; i += 4)
           {
                    memoryStream.WriteByte(frame.NewPixels[i]);
                    memoryStream.WriteByte(frame.NewPixels[i + 1]);
                    memoryStream.WriteByte(frame.NewPixels[i + 2]);          
            }
            byte[] data = compress(memoryStream.ToArray());//compress gzip.
           SendVarData(data);//this is a simple function to send it on a socket.
        }
    }

    public void DeltaAsync(ScreenFrame frame) 
    { 
        using (var memoryStream = new MemoryStream())
        { 
            for (var i = 0; i < frame.NewPixels.Length; i += 4)//loop through buffers and write only differnt bytes.
        {
            if (frame.NewPixels[i] == frame.PreviousPixels[i] &&
                frame.NewPixels[i + 1] == frame.PreviousPixels[i + 1] &&
                frame.NewPixels[i + 2] == frame.PreviousPixels[i + 2])
                continue;
            memoryStream.Write(BitConverter.GetBytes(i), 0, 4);//write the index.
            memoryStream.WriteByte(frame.NewPixels[i]);
            memoryStream.WriteByte(frame.NewPixels[i + 1]);
            memoryStream.WriteByte(frame.NewPixels[i + 2]);
            }
            byte[] buff = compress(memoryStream.ToArray());//compress gzip.
            SendVarData(buff);
        }
    }
处理和应用对方的更改并不是我的主要问题。我真正的瓶颈是带宽使用。在桌面的一个小变化,例如当用户使用鼠标右键打开经典菜单时,发送的数据(压缩后!)在120~150kb左右!我真的很想优化它…我不能让我的程序在只有一个小变化的情况下通过网络发送大量数据……如你所见,我已经使用了
  • gzip压缩(提供高压缩比)。

  • 只写差异

    我正在寻找优化网络理念的方法…我将非常非常感谢任何到来的帮助,因为我打破了我的头很长一段时间,并试图思考一些事情可以帮助…

谢谢。

减少网络带宽的使用

对屏幕的更改通常会影响矩形块中的所有(或大部分)字节。你的压缩是低效的(与其他远程查看器应用程序相比),因为它没有考虑到这一点。一种方法是尝试识别已经改变的区域的边界,然后用png之类的东西发送压缩后的整个区域。但实际上你应该研究png和其他图像压缩算法对2d数据的转换,以使它们更可压缩。

变换是在数据压缩步骤之前应用的对图像数据的可逆操作,旨在使数据更可压缩。一种转换可能是从上面行的像素中减去像素值。如果图像从一行到下一行没有太大变化,那么您将从中得到很多零,这将比每行的实际像素数据更可压缩。