idemon писал(а):Хочу предложить в кэша сохранатся не только картинкам, но и отсуствие картинкам на сервере.
Отличная идея!
Нужно иметь три опции в настройках:
1. кешировать ли отсутствие тайла;
2. учитывать ли кеш отсутствующих тайлов при закачке;
3. учитывать ли кеш отсутствующих тайлов при при интерактивном просмотре.
Последние две опции нужны, чтобы легко было проверять не появились ли на сервере области с ранее недоступными детализациями.
Этот же механизм удобно использовать для обновления файлов викимапии. Если на тайле нет пометок, то закачивается пустой KML. Когда пометка появляется, соответствующий ей пустой KML-файл уже не обновляется.
Функцию определения пустого ответа сервера каждого протокола можно вынести в скрипт.
Единственная проблема, которую придётся решать -- это загромождение файловой системы пустыми файлами. Это очень плохо, особенно для 18-19 масштабов. Предлагаю такой вариант решения:
В кеше тайлы сгруппированы по вертикальным полосам. В каталоге каждого столбца будем хранить простой индексный бинарный файл открываемый в режиме чтения/записи, содержащий пары целых чисел (Y1-Y2), где Y1 отмечает Y-координату верха, а Y2 низа интервала, тайлы которого в данном масштабе отсутствуют на сервере.
Таким образом прежде чем пытаться качать тайл, можно:
1. посмотреть не приходится ли он в один из отрезков.
2. Если да и стоят соответствующие опции, то качать не нужно.
3. Если нет, и при попытке скачать тайла не оказалось, значит нужно создать новый отрезок, добавить точку к существующему, либо склеить два отрезка до и после точки в один (то есть первый расширить, а второй удалить).
Отрезки пересекаться никогда не должны, и, если, поддерживать отсортированность их списка, то можно использовать бинарный поиск, а также оптимизировать механизм вставки.
Пример:
1. Пытаемся качать тайл y10 и его не оказывается на сервере. Добавляем в индексный файл соответствующего столбца пару [10-10].
2. Пытаемся качать y11 (будем считать, что его тоже нет). Изменяем отрезок [10-10] на [10-11].
(И так далее)
3. Допустим у нас сформировалось два отрезка: [10-14], [16-18].
Не обнаружив на сервере 15-го тайла меняем [10-14] на [10-18], а [16-18] удаляем, смещая остаток файла выше на одну запись (либо временно заменяем удалённую запись на [-1,-1] для скорости).
Можно кешировать список отрезков последнего столбца, с которым имели дело. Тогда не нужно будет часто лезть в файл. А сохраняться закешированный список будет деструктором своего экземпляра в момент создания на его месте нового списка для другого столбца.
Этот же механизм позволит многократно ускорить построение области заполнения карты. Также, кстати, можно строить индекс существующих тайлов. Это позволит не обращаться за каждым тайлом при построении области заполнения. Достаточно будет лишь один раз на столбец загрузить в память список отрезков существующих тайлов, и отрисовывать отрезки этого списка не мелкими квадратиками, а большими полосками.
Если автор SAS.Планеты одобрит такой механизм кеширования и согласится его использовать, то я с удовольствием его реализую так, что автору не придётся добавлять в свой код больше двух строчек (не сичтая объявлений и опций в настройках, конечно=). P.S.
Если у присутствующих здесь программистов возникнут сомнения относительно многопоточной закачки, то замечу, что это будет учитываться использованием списка с блокировками для многопоточного доступа. Эти незначительной длительности блокировки не будут мешать ввиду специфики данного случая: закачка тайла гораздо более длительный процесс, нежели затраты на блокировки.