C++ 需要建议VNC应用程序中的磁贴缓存机制吗

C++ 需要建议VNC应用程序中的磁贴缓存机制吗,c++,caching,bitmap,vnc,C++,Caching,Bitmap,Vnc,我正在开发“远程屏幕播放”应用程序(就像VNC一样,但不完全一样),通过网络传输更新的屏幕像素块。我想实现缓存机制,我想听听你的建议 我认为应该这样做。对于每个磁贴坐标,都有固定大小的堆栈(缓存),我在其中添加更新的磁贴。在保存时,我计算瓷砖数据(即像素)的某种校验和(可能CRC-16就足够了,对吗?)。在获取新的磁贴(从桌面的新屏幕截图)时,我计算其校验和,并与该磁贴坐标堆栈中的所有项校验和进行比较。如果校验和匹配,我将发送特殊消息,例如“从位置X的缓存堆栈获取磁贴”,而不是发送磁贴。这意味着

我正在开发“远程屏幕播放”应用程序(就像VNC一样,但不完全一样),通过网络传输更新的屏幕像素块。我想实现缓存机制,我想听听你的建议

我认为应该这样做。对于每个磁贴坐标,都有固定大小的堆栈(缓存),我在其中添加更新的磁贴。在保存时,我计算瓷砖数据(即像素)的某种校验和(可能CRC-16就足够了,对吗?)。在获取新的磁贴(从桌面的新屏幕截图)时,我计算其校验和,并与该磁贴坐标堆栈中的所有项校验和进行比较。如果校验和匹配,我将发送特殊消息,例如“从位置X的缓存堆栈获取磁贴”,而不是发送磁贴。这意味着我需要在服务器和客户端上有相同的缓存堆栈

我的问题来了:

  • 默认堆栈大小(深度)应该是多少?假设堆栈大小为5,这意味着将保存指定坐标的最后5个分片,屏幕像素分辨率的5倍将是总缓存大小。对于大屏幕,屏幕的原始RGB缓冲区大约为5兆字节,所以有10级堆栈意味着50MB缓存,对吗?那么缓存深度应该是多少?我想大概10个,但需要你的建议

  • 在通过网络发送之前,我正在将图像压缩为JPEG格式。我应该在压缩之前实现JPEG图像块或原始RBG图像块的缓存吗?逻辑选择是缓存原始分幅,因为这样可以避免对缓存中的分幅进行不必要的JPEG编码。但保存RGB像素需要更大的缓存大小。那么,在压缩之前或之后,最好的选择是什么

  • 仅CRC-16校验和就足以将新的屏幕分片和缓存堆栈中的分片进行比较吗?我的意思是,当CRC匹配时,我应该额外对tile进行逐字节比较,还是冗余?碰撞概率是否低到可以丢弃

  • 总的来说,你对我描述的计划有什么看法?你会改变什么?任何建议都将不胜感激


您可以退房。

我喜欢您解释一切的方式,这当然是一个很好的实施方法

几个月前,我为一个类似的应用程序实现了类似的方法,现在正在寻找一些不同的方案,要么与之一起工作,要么替换它

我使用的缓存堆栈大小等于屏幕中显示的磁贴数量,并且没有限制磁贴与前一个磁贴的相同位置相匹配。我认为这在用户移动窗口时非常有用。缓存大小是处理能力、内存和带宽之间的权衡。缓存中的磁贴越多,就可以在内存和处理成本上再次节省带宽

我也使用了CRC16,但这并不理想,因为当它命中缓存中的一些CRC时,它会生成一个非常奇怪的图像,这非常烦人,但非常罕见。最好的办法是逐像素匹配,如果你在处理能力方面负担得起的话。就我而言,我不能


缓存JPEG是一个更好的节省内存的方法,因为如果我们从JPEG创建位图,就质量而言,已经对它造成了损害,我假设在这两种情况下命中错误CRC的概率是相同的。一、 在我的例子中,使用了JPEG。

我会使用更快的哈希算法。例如,2号或詹金斯。它保证了更好的独特性。 有关缓存的示例,请参阅Spice远程协议(www.Spice-space.org)。 缓存应该尽可能大(在客户端上,或在中间代理中)