Контекст: многопользовательское приложение (node.js) - 1 художник, n клиентов
Размер холста: 650x400 px (= 260 000 px)
Чтобы холст часто обновлялся (я думаю, примерно 10 раз в секунду), мне нужно сохранять как можно меньший размер данных, особенно когда речь идет о скорости загрузки.
Метод toDataURL()
, возвращающий строку base64, хорош, но он содержит массу данных, которые мне даже не нужны (23 бита на пиксель).Его длина составляет 8,088 (без предшествующей информации MIME), и предполагается, что строки JavaScript имеют 8-битное кодирование, которое будет составлять 8,1 килобайта данных, 10 раз в секунду.
Моя следующая попытка была использовать объекты JS дляразличные контекстные действия, такие как moveTo(x, y)
или lineTo(x, y)
, отправка их на сервер и получение клиентами данных в дельта-обновлениях (с помощью отметок времени).Однако это оказалось даже менее эффективно, чем строка base64.
{
"timestamp": 0,
"what": {
"name": LINE_TO,
"args": {"x": x, "y": y}
}
}
Это не работает ни бегло, ни точно, потому что уже есть почти 300 lineTo
команд, когда вы быстро проводите кистью.Иногда часть движения отсутствует (делает прямую, а не закругленную линию), иногда события даже не распознаются клиентской стороной сценария, потому что кажется, что они «перегружены» уже запущенной массой событий.
Итак, мне нужно использовать строку base64 с ее 8,1 КБ.Я не хочу беспокоиться об этом, но даже если асинхронно выполняется с дельта-обновлениями, на реальном сервере будут существенные задержки, не говоря уже о случайном превышении пропускной способности.
Я использую только цвета # 000 и #FFF, поэтому я думал о 1-битной структуре данных только с дельта-обновлениями.Этого было бы достаточно, и я не возражал бы против каких-либо «цветных» потерь точности (в конце концов, это black ).
Поскольку большая часть холста белая, вы можете подумать о дополнительном кодировании длин серий Хаффмана, чтобы еще больше уменьшить размер.Как холст размером 50x2 px и один черный пиксель в (26, 2) вернет следующую строку: 75W1B74W
(50 + 25 белых пикселей, затем 1 черный пиксель, затем еще 24 белых пикселя)
Было бы даже полезно, если бы холст состоял из 1-битной строки, подобной этой:
00000000000000000000000000000000000000000000000000
00000000000000000000000001000000000000000000000000
Это уже очень помогло бы.
Мой первый вопрос: как написать алгоритм для получения этих данных эффективно ?
Второй вопрос: как я мог передать чистыйдвоичные данные холста для клиентов (через сервер узла )?Как я могу даже отправить 1-битную структуру данных на сервер?Должен ли я преобразовать свои биты в шестнадцатеричное (или более) число и выполнить повторный анализ?
Можно ли использовать this в качестве структуры данных?
Заранее спасибо,
Harti