C++ 需要建议VNC应用程序中的磁贴缓存机制吗
我正在开发“远程屏幕播放”应用程序(就像VNC一样,但不完全一样),通过网络传输更新的屏幕像素块。我想实现缓存机制,我想听听你的建议 我认为应该这样做。对于每个磁贴坐标,都有固定大小的堆栈(缓存),我在其中添加更新的磁贴。在保存时,我计算瓷砖数据(即像素)的某种校验和(可能CRC-16就足够了,对吗?)。在获取新的磁贴(从桌面的新屏幕截图)时,我计算其校验和,并与该磁贴坐标堆栈中的所有项校验和进行比较。如果校验和匹配,我将发送特殊消息,例如“从位置X的缓存堆栈获取磁贴”,而不是发送磁贴。这意味着我需要在服务器和客户端上有相同的缓存堆栈 我的问题来了:C++ 需要建议VNC应用程序中的磁贴缓存机制吗,c++,caching,bitmap,vnc,C++,Caching,Bitmap,Vnc,我正在开发“远程屏幕播放”应用程序(就像VNC一样,但不完全一样),通过网络传输更新的屏幕像素块。我想实现缓存机制,我想听听你的建议 我认为应该这样做。对于每个磁贴坐标,都有固定大小的堆栈(缓存),我在其中添加更新的磁贴。在保存时,我计算瓷砖数据(即像素)的某种校验和(可能CRC-16就足够了,对吗?)。在获取新的磁贴(从桌面的新屏幕截图)时,我计算其校验和,并与该磁贴坐标堆栈中的所有项校验和进行比较。如果校验和匹配,我将发送特殊消息,例如“从位置X的缓存堆栈获取磁贴”,而不是发送磁贴。这意味着
- 默认堆栈大小(深度)应该是多少?假设堆栈大小为5,这意味着将保存指定坐标的最后5个分片,屏幕像素分辨率的5倍将是总缓存大小。对于大屏幕,屏幕的原始RGB缓冲区大约为5兆字节,所以有10级堆栈意味着50MB缓存,对吗?那么缓存深度应该是多少?我想大概10个,但需要你的建议
- 在通过网络发送之前,我正在将图像压缩为JPEG格式。我应该在压缩之前实现JPEG图像块或原始RBG图像块的缓存吗?逻辑选择是缓存原始分幅,因为这样可以避免对缓存中的分幅进行不必要的JPEG编码。但保存RGB像素需要更大的缓存大小。那么,在压缩之前或之后,最好的选择是什么
- 仅CRC-16校验和就足以将新的屏幕分片和缓存堆栈中的分片进行比较吗?我的意思是,当CRC匹配时,我应该额外对tile进行逐字节比较,还是冗余?碰撞概率是否低到可以丢弃
- 总的来说,你对我描述的计划有什么看法?你会改变什么?任何建议都将不胜感激
缓存JPEG是一个更好的节省内存的方法,因为如果我们从JPEG创建位图,就质量而言,已经对它造成了损害,我假设在这两种情况下命中错误CRC的概率是相同的。一、 在我的例子中,使用了JPEG。我会使用更快的哈希算法。例如,2号或詹金斯。它保证了更好的独特性。 有关缓存的示例,请参阅Spice远程协议(www.Spice-space.org)。 缓存应该尽可能大(在客户端上,或在中间代理中)