我正在开发“远程截屏”应用程序(就像 VNC 但不完全一样),我在其中通过网络传输更新的屏幕像素图块。我想实现缓存机制,我想听听你的建议......
这是我认为应该这样做的方式。对于每个图块坐标,都有固定大小的堆栈(缓存),我在其中添加更新的图块。保存时,我计算平铺数据(即像素)的某种校验和(可能 CRC-16 就足够了,对吗?)。获取新图块时(来自桌面的新屏幕截图),我计算其校验和并与该图块坐标堆栈中的所有项目校验和进行比较。如果校验和匹配,而不是发送瓦片,我发送特殊消息,例如“从位置 X 的缓存堆栈获取瓦片”。这意味着我需要在服务器和客户端上拥有相同的缓存堆栈。
我的问题来了:
默认堆栈大小(深度)应该是多少?假设堆栈大小为 5,这意味着将保存指定坐标的最后 5 个图块,屏幕像素分辨率的 5 倍将是总缓存大小。对于大屏幕,屏幕的原始 RGB 缓冲区将约为。5 MB,所以拥有 10 级堆栈意味着 50MB 缓存,对吗?那么缓存深度应该是多少呢?我想可能有 10 个,但需要你的建议。
在通过网络发送之前,我将图块压缩为 JPEG。我应该在压缩之前实现 JPEG 切片或原始 RBG 切片的缓存吗?逻辑选择是缓存原始切片,因为它可以避免对缓存中找到的切片进行不必要的 JPEG 编码。但是保存 RGB 像素需要更大的缓存大小。那么最好的选择是什么——压缩之前还是之后?
CRC-16 校验和是否足以将新屏幕图块与缓存堆栈中的图块进行比较?我的意思是,当 CRC 匹配时,我应该另外对瓦片进行逐字节比较,还是多余的?碰撞概率是否低到足以被丢弃?
总的来说,您如何看待我描述的方案?你会在其中改变什么?任何形式的建议将不胜感激!