Ну, есть лучшие решения, чем обычные JPEG. Я реализовал системы, подобные этой, и вам лучше использовать видеокодек, такой как MPEG-2, MPEG-4 ASP, H.264 и т. Д., Чем JPEG, и отправлять обновления в виде p-кадров (т. Е. Дельты из предыдущего изображение), и если «слишком большое» изменение (или пропущенное обновление, или новый клиент добавлен в существующий поток), отправьте i-frame.
Даже без использования видеокодека отправка различий часто будет предпочтительнее. Используйте другой механизм кодирования различий.
С точки зрения того, как получить буфер для отправки, вы можете использовать несколько кадровых буферов для рендеринга и настроить код кадрового буфера, чтобы запускать таймер, когда внесены изменения, и во время происходящих изменений отправлять периодические изменения, когда прошло достаточно времени с момента последнего изменения (еще не отправлено), отправьте обновление (возможно, короче, чем первое значение), а также, возможно, включите некоторый вид строба, который вызывает обновление, которое может быть вызвано в определенных случаях (если вы может, например, получить указание завершения загрузки страницы из браузера, что вы можете с небольшой работой в Firefox, изменив chrome и т. д.).
[добавлено]
Примеры других решений можно найти в протоколах и программах удаленных рабочих столов, таких как VNC, RDP (Windows Remote Desktop) и т. Д., И это действительно то, что они делают, опять же, с более сложным сжатием и отслеживанием областей повреждений.
Для кадровых буферов вы можете использовать стандартный код кадрового буфера linux / etc (возможно, самый простой) или даже что-то вроде XVFB (который дает вам больше информации о том, что и почему меняется, чем необработанный кадровый буфер).