osmgl 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/osmgl.d.cts CHANGED
@@ -1780,25 +1780,43 @@ interface ErrorResponse {
1780
1780
  }
1781
1781
  type WorkerResponse = LoadedResponse | ErrorResponse;
1782
1782
 
1783
- /**
1784
- * Пул воркеров с round-robin раздачей.
1785
- *
1786
- * Если бандл воркера недоступен (dev из исходников, запрет Blob-воркеров политикой
1787
- * CSP), пул честно работает в главном потоке: карта тормозит на разборе, но не падает.
1788
- */
1789
1783
  declare class WorkerPool {
1790
1784
  private workers;
1791
1785
  private blobUrl;
1792
1786
  private pending;
1787
+ private queue;
1788
+ /** Сколько задач сейчас у каждого воркера. */
1789
+ private busy;
1793
1790
  private nextId;
1794
- private cursor;
1795
1791
  private mainThreadAborts;
1796
1792
  private destroyed;
1797
1793
  readonly usingWorkers: boolean;
1798
1794
  constructor(size?: number);
1799
1795
  get size(): number;
1800
- /** Ставит тайл в очередь. Возвращает id — им же и отменяют. */
1801
- load(req: Omit<LoadRequest, 'type' | 'id'>, onDone: (res: WorkerResponse) => void): number;
1796
+ /**
1797
+ * Ставит тайл в очередь. Возвращает id — им же и отменяют.
1798
+ *
1799
+ * `priority` — чем меньше, тем раньше. Порядок постановки значения не имеет: очередь разбирается
1800
+ * по важности, а не по времени (см. [[pump]]).
1801
+ */
1802
+ load(req: Omit<LoadRequest, 'type' | 'id'>, onDone: (res: WorkerResponse) => void, priority?: number): number;
1803
+ /**
1804
+ * Раздаёт задачи наименее загруженному воркеру, пока у него меньше PER_WORKER задач.
1805
+ *
1806
+ * Почему НЕ по одной. Освобождает воркера главный поток — он получает ответ и отправляет
1807
+ * следующую задачу. Значит при одной задаче на воркера пропускная способность упирается в
1808
+ * главный поток: пока он занят кадром (или притормаживается в скрытой вкладке), воркеры стоят.
1809
+ * Второй задачи в запасе хватает, чтобы работа не прерывалась, и при этом неотменяемыми
1810
+ * оказываются лишь единицы задач вместо трёхсот.
1811
+ *
1812
+ * ПОРЯДОК — ПО ВАЖНОСТИ, А НЕ ПО ОЧЕРЕДИ. На широком экране одно движение камеры ставит триста
1813
+ * с лишним тайлов на семь источников, и в порядке поступления полсотни тайлов самой карты
1814
+ * оказывались перемешаны с двумя с половиной сотнями пробок, точек и размещений: карта под
1815
+ * курсором ждала, пока разберут декор на другом краю кадра. Важность считает источник — она
1816
+ * складывается из его ранга и расстояния до камеры, так что первой приезжает основа в середине
1817
+ * экрана. Выбор минимума перебором: очередь живёт сотнями записей, куча тут не окупается.
1818
+ */
1819
+ private pump;
1802
1820
  abort(id: number): void;
1803
1821
  private onMessage;
1804
1822
  private disposeWorkers;
@@ -1968,6 +1986,14 @@ interface TileSourceOptions extends CoverOptions {
1968
1986
  plan: LayerPlan[];
1969
1987
  /** Сколько тайлов держать в кеше сверх видимых. */
1970
1988
  cacheSize?: number;
1989
+ /**
1990
+ * Важность источника в общей очереди воркеров: 0 — основа карты, дальше по убыванию.
1991
+ *
1992
+ * Пул один на все источники, и на широком экране пробки с размещениями ставят в него вчетверо
1993
+ * больше тайлов, чем сама карта. Ранг решает, кого разбирать первым. По умолчанию 1 — «поверх
1994
+ * основы».
1995
+ */
1996
+ rank?: number;
1971
1997
  }
1972
1998
  interface TileSourceEvents extends Record<string, unknown> {
1973
1999
  /** Пришли новые данные — надо перерисовать кадр. */
@@ -1984,8 +2010,6 @@ declare class TileSource extends Evented<TileSourceEvents> {
1984
2010
  private pool;
1985
2011
  private cache;
1986
2012
  private visible;
1987
- /** Момент, с которого держим прежний набор вместо нового. 0 — не держим. */
1988
- private holdSince;
1989
2013
  /** Показывали ли уже готовую картину. См. [[warm]]. */
1990
2014
  private warmed;
1991
2015
  /**
@@ -2022,6 +2046,34 @@ declare class TileSource extends Evented<TileSourceEvents> {
2022
2046
  get pendingCount(): number;
2023
2047
  /** Пересчитывает видимый набор под текущую камеру и запускает недостающие загрузки. */
2024
2048
  update(tr: Transform): void;
2049
+ /**
2050
+ * Покрытие из ГОТОВЫХ тайлов: где нужного ещё нет, его место занимает загруженный предок.
2051
+ *
2052
+ * Предок покрывает весь свой квадрат, поэтому подменять им один тайл, оставив рядом второй,
2053
+ * значит закрасить это место дважды — полупрозрачный слой там лёг бы вдвое плотнее. Значит
2054
+ * квадрат берётся целиком, и отсюда главное ограничение: предок годится, только если под ним
2055
+ * НЕТ НИ ОДНОЙ уже готовой цели. Иначе подмена не добавляла бы картинку, а стирала — грубый
2056
+ * предок уносил с собой всю подробность на своей площади, и дальний план пустел. Проверено.
2057
+ */
2058
+ private coverFor;
2059
+ /**
2060
+ * Готовые потомки целей — по одному проходу ПО КЕШУ, а не перебором дерева вниз.
2061
+ *
2062
+ * Перебор вниз стоит четыре тайла на уровень, шестнадцать на два, шестьдесят четыре на три — и
2063
+ * всё равно упирается в свою глубину: после отдаления на пять зумов загруженное лежит ещё ниже,
2064
+ * и до него так не достать. Проход по кешу дешевле (в нём сотни тайлов, а не тысячи гипотез) и
2065
+ * глубиной не ограничен вовсе.
2066
+ *
2067
+ * Потомки безопасны без оговорок: они лежат ВНУТРИ своей цели, рисовать которую всё равно нечем,
2068
+ * и не пересекаются между собой.
2069
+ */
2070
+ private descendantsOf;
2071
+ /**
2072
+ * Есть ли в наборе хоть один готовый тайл.
2073
+ *
2074
+ * Порог для «ждать надоело»: показывать набор, где не приехало НИЧЕГО, значит показать пустоту.
2075
+ */
2076
+ private anyReady;
2025
2077
  /** Готов ли набор целиком: у каждого тайла есть ответ — с геометрией, пустой или с ошибкой. */
2026
2078
  private readyFor;
2027
2079
  /**
@@ -2032,6 +2084,16 @@ declare class TileSource extends Evented<TileSourceEvents> {
2032
2084
  * нельзя: за краем кадра его просто не существует, и мы показали бы пустоту вместо загрузки.
2033
2085
  */
2034
2086
  private covers;
2087
+ /**
2088
+ * Источник никто не рисует: снять загрузки и очистить видимый набор.
2089
+ *
2090
+ * Набор считался и качался всегда, даже когда ни один его слой на этом зуме не показывают. На
2091
+ * широком экране это давало полторы сотни тайлов размещений на зуме, где 3D-объектов ещё нет
2092
+ * вовсе, и столько же выключенных пробок — и всё это стояло в очереди перед самой картой.
2093
+ * Загруженное остаётся в кеше: вернуться в свой диапазон зума источник должен без повторной
2094
+ * загрузки.
2095
+ */
2096
+ deactivate(): void;
2035
2097
  private loadTile;
2036
2098
  /**
2037
2099
  * Готовый предок для тайла, который ещё грузится — чтобы на его месте не зияла
@@ -5507,6 +5569,14 @@ declare class Map$1 extends Evented<MapEvents> {
5507
5569
  * при смене темы, — и забытое место означало бы «объекты пропали после
5508
5570
  * переключения темы».
5509
5571
  */
5572
+ /**
5573
+ * Рисует ли этот набор хоть кто-нибудь на текущем зуме.
5574
+ *
5575
+ * Считаем по СТИЛЮ, а не по плану воркера: план нарочно не знает ни зумов слоя, ни тумблеров
5576
+ * видимости — тайл кешируется один раз и обязан оставаться пригодным на любом зуме. А вот
5577
+ * КАЧАТЬ его, пока ни один слой набора не показывают, смысла нет.
5578
+ */
5579
+ private sourceDrawn;
5510
5580
  private planFor;
5511
5581
  /**
5512
5582
  * Пересчёт детальных 3D-объектов по текущей камере.
package/dist/osmgl.d.ts CHANGED
@@ -1780,25 +1780,43 @@ interface ErrorResponse {
1780
1780
  }
1781
1781
  type WorkerResponse = LoadedResponse | ErrorResponse;
1782
1782
 
1783
- /**
1784
- * Пул воркеров с round-robin раздачей.
1785
- *
1786
- * Если бандл воркера недоступен (dev из исходников, запрет Blob-воркеров политикой
1787
- * CSP), пул честно работает в главном потоке: карта тормозит на разборе, но не падает.
1788
- */
1789
1783
  declare class WorkerPool {
1790
1784
  private workers;
1791
1785
  private blobUrl;
1792
1786
  private pending;
1787
+ private queue;
1788
+ /** Сколько задач сейчас у каждого воркера. */
1789
+ private busy;
1793
1790
  private nextId;
1794
- private cursor;
1795
1791
  private mainThreadAborts;
1796
1792
  private destroyed;
1797
1793
  readonly usingWorkers: boolean;
1798
1794
  constructor(size?: number);
1799
1795
  get size(): number;
1800
- /** Ставит тайл в очередь. Возвращает id — им же и отменяют. */
1801
- load(req: Omit<LoadRequest, 'type' | 'id'>, onDone: (res: WorkerResponse) => void): number;
1796
+ /**
1797
+ * Ставит тайл в очередь. Возвращает id — им же и отменяют.
1798
+ *
1799
+ * `priority` — чем меньше, тем раньше. Порядок постановки значения не имеет: очередь разбирается
1800
+ * по важности, а не по времени (см. [[pump]]).
1801
+ */
1802
+ load(req: Omit<LoadRequest, 'type' | 'id'>, onDone: (res: WorkerResponse) => void, priority?: number): number;
1803
+ /**
1804
+ * Раздаёт задачи наименее загруженному воркеру, пока у него меньше PER_WORKER задач.
1805
+ *
1806
+ * Почему НЕ по одной. Освобождает воркера главный поток — он получает ответ и отправляет
1807
+ * следующую задачу. Значит при одной задаче на воркера пропускная способность упирается в
1808
+ * главный поток: пока он занят кадром (или притормаживается в скрытой вкладке), воркеры стоят.
1809
+ * Второй задачи в запасе хватает, чтобы работа не прерывалась, и при этом неотменяемыми
1810
+ * оказываются лишь единицы задач вместо трёхсот.
1811
+ *
1812
+ * ПОРЯДОК — ПО ВАЖНОСТИ, А НЕ ПО ОЧЕРЕДИ. На широком экране одно движение камеры ставит триста
1813
+ * с лишним тайлов на семь источников, и в порядке поступления полсотни тайлов самой карты
1814
+ * оказывались перемешаны с двумя с половиной сотнями пробок, точек и размещений: карта под
1815
+ * курсором ждала, пока разберут декор на другом краю кадра. Важность считает источник — она
1816
+ * складывается из его ранга и расстояния до камеры, так что первой приезжает основа в середине
1817
+ * экрана. Выбор минимума перебором: очередь живёт сотнями записей, куча тут не окупается.
1818
+ */
1819
+ private pump;
1802
1820
  abort(id: number): void;
1803
1821
  private onMessage;
1804
1822
  private disposeWorkers;
@@ -1968,6 +1986,14 @@ interface TileSourceOptions extends CoverOptions {
1968
1986
  plan: LayerPlan[];
1969
1987
  /** Сколько тайлов держать в кеше сверх видимых. */
1970
1988
  cacheSize?: number;
1989
+ /**
1990
+ * Важность источника в общей очереди воркеров: 0 — основа карты, дальше по убыванию.
1991
+ *
1992
+ * Пул один на все источники, и на широком экране пробки с размещениями ставят в него вчетверо
1993
+ * больше тайлов, чем сама карта. Ранг решает, кого разбирать первым. По умолчанию 1 — «поверх
1994
+ * основы».
1995
+ */
1996
+ rank?: number;
1971
1997
  }
1972
1998
  interface TileSourceEvents extends Record<string, unknown> {
1973
1999
  /** Пришли новые данные — надо перерисовать кадр. */
@@ -1984,8 +2010,6 @@ declare class TileSource extends Evented<TileSourceEvents> {
1984
2010
  private pool;
1985
2011
  private cache;
1986
2012
  private visible;
1987
- /** Момент, с которого держим прежний набор вместо нового. 0 — не держим. */
1988
- private holdSince;
1989
2013
  /** Показывали ли уже готовую картину. См. [[warm]]. */
1990
2014
  private warmed;
1991
2015
  /**
@@ -2022,6 +2046,34 @@ declare class TileSource extends Evented<TileSourceEvents> {
2022
2046
  get pendingCount(): number;
2023
2047
  /** Пересчитывает видимый набор под текущую камеру и запускает недостающие загрузки. */
2024
2048
  update(tr: Transform): void;
2049
+ /**
2050
+ * Покрытие из ГОТОВЫХ тайлов: где нужного ещё нет, его место занимает загруженный предок.
2051
+ *
2052
+ * Предок покрывает весь свой квадрат, поэтому подменять им один тайл, оставив рядом второй,
2053
+ * значит закрасить это место дважды — полупрозрачный слой там лёг бы вдвое плотнее. Значит
2054
+ * квадрат берётся целиком, и отсюда главное ограничение: предок годится, только если под ним
2055
+ * НЕТ НИ ОДНОЙ уже готовой цели. Иначе подмена не добавляла бы картинку, а стирала — грубый
2056
+ * предок уносил с собой всю подробность на своей площади, и дальний план пустел. Проверено.
2057
+ */
2058
+ private coverFor;
2059
+ /**
2060
+ * Готовые потомки целей — по одному проходу ПО КЕШУ, а не перебором дерева вниз.
2061
+ *
2062
+ * Перебор вниз стоит четыре тайла на уровень, шестнадцать на два, шестьдесят четыре на три — и
2063
+ * всё равно упирается в свою глубину: после отдаления на пять зумов загруженное лежит ещё ниже,
2064
+ * и до него так не достать. Проход по кешу дешевле (в нём сотни тайлов, а не тысячи гипотез) и
2065
+ * глубиной не ограничен вовсе.
2066
+ *
2067
+ * Потомки безопасны без оговорок: они лежат ВНУТРИ своей цели, рисовать которую всё равно нечем,
2068
+ * и не пересекаются между собой.
2069
+ */
2070
+ private descendantsOf;
2071
+ /**
2072
+ * Есть ли в наборе хоть один готовый тайл.
2073
+ *
2074
+ * Порог для «ждать надоело»: показывать набор, где не приехало НИЧЕГО, значит показать пустоту.
2075
+ */
2076
+ private anyReady;
2025
2077
  /** Готов ли набор целиком: у каждого тайла есть ответ — с геометрией, пустой или с ошибкой. */
2026
2078
  private readyFor;
2027
2079
  /**
@@ -2032,6 +2084,16 @@ declare class TileSource extends Evented<TileSourceEvents> {
2032
2084
  * нельзя: за краем кадра его просто не существует, и мы показали бы пустоту вместо загрузки.
2033
2085
  */
2034
2086
  private covers;
2087
+ /**
2088
+ * Источник никто не рисует: снять загрузки и очистить видимый набор.
2089
+ *
2090
+ * Набор считался и качался всегда, даже когда ни один его слой на этом зуме не показывают. На
2091
+ * широком экране это давало полторы сотни тайлов размещений на зуме, где 3D-объектов ещё нет
2092
+ * вовсе, и столько же выключенных пробок — и всё это стояло в очереди перед самой картой.
2093
+ * Загруженное остаётся в кеше: вернуться в свой диапазон зума источник должен без повторной
2094
+ * загрузки.
2095
+ */
2096
+ deactivate(): void;
2035
2097
  private loadTile;
2036
2098
  /**
2037
2099
  * Готовый предок для тайла, который ещё грузится — чтобы на его месте не зияла
@@ -5507,6 +5569,14 @@ declare class Map$1 extends Evented<MapEvents> {
5507
5569
  * при смене темы, — и забытое место означало бы «объекты пропали после
5508
5570
  * переключения темы».
5509
5571
  */
5572
+ /**
5573
+ * Рисует ли этот набор хоть кто-нибудь на текущем зуме.
5574
+ *
5575
+ * Считаем по СТИЛЮ, а не по плану воркера: план нарочно не знает ни зумов слоя, ни тумблеров
5576
+ * видимости — тайл кешируется один раз и обязан оставаться пригодным на любом зуме. А вот
5577
+ * КАЧАТЬ его, пока ни один слой набора не показывают, смысла нет.
5578
+ */
5579
+ private sourceDrawn;
5510
5580
  private planFor;
5511
5581
  /**
5512
5582
  * Пересчёт детальных 3D-объектов по текущей камере.