Я разрабатываю приложение «удаленного просмотра экрана» (точно так же, как VNC, но не совсем), в котором я передаю обновленные фрагменты пикселей экрана по сети. Я бы хотел реализовать механизм кеширования и хотел бы услышать ваши рекомендации ...
Вот как, я думаю, это нужно делать. Для каждой координаты плитки есть стек фиксированного размера (кеш), куда я добавляю обновленные плитки. При сохранении я вычисляю какую-то контрольную сумму (вероятно, CRC-16 будет достаточно, не так ли?) Данных плитки (то есть пикселей). При получении новой плитки (из нового снимка экрана рабочего стола) я вычисляю ее контрольную сумму и сравниваю с контрольными суммами всех элементов в стеке с координатами этой плитки. Если контрольная сумма совпадает, вместо отправки плитки я отправляю специальное сообщение, например. "получить тайл из стека кеша в позиции X". Это означает, что мне нужны одинаковые стеки кеша на сервере и на клиенте.
Вот мои вопросы:
Каким должен быть размер стека (глубина) по умолчанию? Скажем, если размер стека равен 5, это означает, что будут сохранены последние 5 плиток с указанными координатами, и 5-кратное разрешение пикселей экрана будет общим размером кеша. Для больших экранов необработанный буфер RGB экрана будет составлять прибл. 5 мегабайт, так что наличие 10-уровневого стека означает 50 МБ кеш-памяти, верно? Так какой же должна быть глубина кеша? Я думаю, может быть, 10, но нужны ваши предложения.
Я сжимаю плитки в JPEG перед отправкой по сети. Следует ли реализовать кэширование фрагментов JPEG или необработанных фрагментов RBG перед сжатием? Логическим выбором будет кэширование необработанных тайлов, поскольку это позволит избежать ненужного кодирования JPEG для тайлов, которые могут быть найдены в кеше. Но для сохранения пикселей RGB потребуется гораздо больший размер кеша. Итак, какой вариант лучше - до или после сжатия?
Достаточно ли одной контрольной суммы CRC-16 для сравнения новых плиток экрана с плитками в стеке кеша? Я имею в виду, следует ли мне дополнительно проводить побайтовое сравнение плиток, когда CRC совпадает, или это избыточно? Достаточно ли мала вероятность столкновения, чтобы от нее можно было отказаться?
В общем, как вы относитесь к описанной мной схеме? Что бы вы в нем изменили? Будем признательны за любые предложения!