SASGIS - SAS.Планета
View Issue Details
0001253SAS.Планета[All Projects] Хотелкаpublic29-03-2012 06:3510-10-2012 11:47
vasketsov 
vasketsov 
normalfeatureN/A
closedfixed 
WindowsVistaUltimate
.Nightly 
120808120808 
0001253: Ускорение отрисовки карты заполнения для нефайловых типов кэша
Так как нефайловые типы кэша допускают выполнение "групповых" операций над тайлами (например, поиск тайла по диапазону xy), для целей построения карты заполнения необходимо реализовать ещё один "групповой" метод.

Суть нового метода заключается в определении наличия или отсутствия тайлов (и их даты при наличии) в некотором заданном диапазоне xy в рамках одной операции над хранилищем в тех случаях, когда это будет выполняться заведомо существенно быстрее, чем "опрос" по одному тайлу.

Диапазон построения карты заполнения для нового метода может как совпадать со всем отображаемым участком карты, так и быть его небольшой частью. Последнее необходимо как минимум в следующих случаях:
а) построение карты заполнения в несколько потоков;
б) построение карты заполнения для нового участка экрана после небольшого сдвига;
в) построение карты заполнения при переходе через 180 градусов.
БД, карта заполнения
related to 0001195closed vasketsov Переключение версии снимков для кэша GE 
related to 0001248closed vdemidov Ускорение отрисовки карты заполнения 
? SASPlanet.elf (81,059) 02-04-2012 12:15
https://bugtracker.sasgis.org/file_download.php?file_id=734&type=bug
Issue History
29-03-2012 06:35vasketsovNew Issue
29-03-2012 06:36vasketsovRelationship addedrelated to 0001248
29-03-2012 06:45TolikNote Added: 0006321
29-03-2012 06:51vasketsovNote Added: 0006322
29-03-2012 06:53vasketsovNote Edited: 0006322bug_revision_view_page.php?bugnote_id=6322#r3146
02-04-2012 11:42vasketsovNote Added: 0006361
02-04-2012 11:49vasketsovNote Edited: 0006361bug_revision_view_page.php?bugnote_id=6361#r3155
02-04-2012 11:50vasketsovAssigned To => vasketsov
02-04-2012 11:50vasketsovStatusnew => assigned
02-04-2012 11:57vdemidovNote Added: 0006362
02-04-2012 12:14vasketsovNote Added: 0006363
02-04-2012 12:15vasketsovFile Added: SASPlanet.elf
02-04-2012 12:16vasketsovNote Edited: 0006363bug_revision_view_page.php?bugnote_id=6363#r3157
02-04-2012 12:29vdemidovNote Added: 0006364
02-04-2012 17:25vasketsovRelationship addedrelated to 0001195
02-04-2012 17:42vasketsovNote Added: 0006369
02-04-2012 18:06vasketsovStatusassigned => resolved
02-04-2012 18:06vasketsovFixed in Version => 120808
02-04-2012 18:06vasketsovResolutionopen => fixed
13-05-2012 09:12gpsMaxTag Attached: карта заполнения
14-05-2012 08:33vdemidovTarget Version => 120808
17-05-2012 17:36gpsMaxTag Attached: БД
10-10-2012 11:47TolikStatusresolved => closed

Notes
(0006321)
Tolik   
29-03-2012 06:45   
> б) построение карты заполнения для нового участка экрана после небольшого сдвига;

Привычно (и правильно), что карта заполнения после сдвига обновляется полностью.
Если при сдвиге обновлять не всю, а только ту область, которая появилась на экране, может оказаться, что центральная часть карты зап. устарела (если смотреть её одновременно с закачкой).
(0006322)
vasketsov   
29-03-2012 06:51   
(edited on: 29-03-2012 06:53)
>центральная часть карты зап. устарела (если смотреть её одновременно с закачкой).
Эту проблему надо решать немного по-другому, а именно - сбросом признака валидности с карты заполнения и перестроением её при произвольном минимальном сдвиге (а не как сейчас надо сильно сдвинуть). Коли уж тайлы на лету обновляются после закачки, то "известить" слой карты заполнения об изменениях также не проблема.

В любом случае конкретно эта доработка не ставит целью изменение исходных параметров карты заполнения, как она строилась по всему экрану, так и будет строиться. Как не показывала карта через 180 градусов - так и не будет показывать после этой доработки. Это просто указание на то, что диапазон не обязательно совпадает с экраном.

(0006361)
vasketsov   
02-04-2012 11:42   
(edited on: 02-04-2012 11:49)
Задуманное сделал, ускорение отрисовки карты заполнения для GE заметно (но правда не в разы, потому что до последнего необработанного тайла надо идти до конца индекса, индекс маленький, а больше +4 я не запускал).

Но могу "обрадовать". Налетел на совершенно непонятную багу. Крэшится в SysUtils внутри совершенно безобидного IntToStr. Крэшится ТОЛЬКО если включить карту заполнения, и не дав ей дорисоваться, сдвинуть карту (чтобы рисовалась по-новой). Судя по стеку - гадит обработка исключений (вызывается рекурсивно). Замена MemoryManager в DLL на FastMM или сасовский ничего принципиально не меняет. Даже обернул получение битовой карты тайлов в BeginWrite..EndWrite - пофигу.
На самом деле крайне редко при установленной версии аналогично валится и "старая" DLL, где нет функции получения битовой карты для тайлов.

(0006362)
vdemidov   
02-04-2012 11:57   
А ты в dll прописал IsMultiThread := true
(0006363)
vasketsov   
02-04-2012 12:14   
(edited on: 02-04-2012 12:16)
О, заметно полегчало, ведь чувствовал что что-то забыл. Но всё равно (пусть и сильно реже) где-то крэшится. Походу надо ещё попробовать MainInstance передать в DLL.
Врубил "еврику" на EXE и DLL и словил приаттаченное.

(0006364)
vdemidov   
02-04-2012 12:29   
Ну это похоже та же проблема, что и у Паразита в соседней хотелке. Скоро вылечиться. Глобальных локов просто не будет. Можешь посмотреть на новый основной слой. Правда он еще не до конца доделан.
(0006369)
vasketsov   
02-04-2012 17:42   
Пока что сделал только для GE. Приаттачил DLL в доработку 0001195. Работает и потайлово, и по битовой карте.

Общая логика:
0. Карта заполнения по битовой карте тайлов строится ТОЛЬКО если исходный зум строго больше текущего.
1. Хранилище (а кроме него собственно некому) определяет формат (и размер) буфера для битовой карты тайлов в заданном диапазоне (*).
2. Создаётся пустой чистый буфер.
3. Зовётся хранилище, далее вызов улетает в DLL (если хранилище в DLL). Соответственно в сасе не кэшируется.
4. По возвращению из DLL буфер заполнен в соответствии с заказанным форматом. Если DLL не поддерживает заказанный хранилищем формат - ломаем руки автору хранилища и по совместительству DLL.
5. Покуда может кинуться EOutOfMemory - хранилище не должно требовать именно заказанного формата буфера, может быть и попроще (например, только флаги).
6. Разбор буфера и вызов раскраски тайлов.

(*) Если есть даты - один формат, если нет - другой. Цель - по возможности минимизировать требуемый размер буфера. А то для 60 тайлов текущего зума для +8 в случае построения карты заполнения до диапазону дат для 12 байт на "микротайл" может быть совсем грустно, при сильной фрагментации ждать выделения будем долго.
Сейчас предусмотрены форматы 1, 4 и 8 байт на "макротайл" (1 - только флаги, 4 - дата и время с точностью до 30 секунд + флаги, 8 - полный диапазон TDateTime + флаги).