12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import defined from "../Core/defined.js";
- import DoublyLinkedList from "../Core/DoublyLinkedList.js";
- /**
- * Stores tiles with content loaded.
- *
- * @private
- */
- function Cesium3DTilesetCache() {
- // [head, sentinel) -> tiles that weren't selected this frame and may be removed from the cache
- // (sentinel, tail] -> tiles that were selected this frame
- this._list = new DoublyLinkedList();
- this._sentinel = this._list.add();
- this._trimTiles = false;
- }
- Cesium3DTilesetCache.prototype.reset = function () {
- // Move sentinel node to the tail so, at the start of the frame, all tiles
- // may be potentially replaced. Tiles are moved to the right of the sentinel
- // when they are selected so they will not be replaced.
- this._list.splice(this._list.tail, this._sentinel);
- };
- Cesium3DTilesetCache.prototype.touch = function (tile) {
- const node = tile.cacheNode;
- if (defined(node)) {
- this._list.splice(this._sentinel, node);
- }
- };
- Cesium3DTilesetCache.prototype.add = function (tile) {
- if (!defined(tile.cacheNode)) {
- tile.cacheNode = this._list.add(tile);
- }
- };
- Cesium3DTilesetCache.prototype.unloadTile = function (
- tileset,
- tile,
- unloadCallback
- ) {
- const node = tile.cacheNode;
- if (!defined(node)) {
- return;
- }
- this._list.remove(node);
- tile.cacheNode = undefined;
- unloadCallback(tileset, tile);
- };
- Cesium3DTilesetCache.prototype.unloadTiles = function (
- tileset,
- unloadCallback
- ) {
- const trimTiles = this._trimTiles;
- this._trimTiles = false;
- const list = this._list;
- const maximumMemoryUsageInBytes = tileset.maximumMemoryUsage * 1024 * 1024;
- // Traverse the list only to the sentinel since tiles/nodes to the
- // right of the sentinel were used this frame.
- //
- // The sub-list to the left of the sentinel is ordered from LRU to MRU.
- const sentinel = this._sentinel;
- let node = list.head;
- while (
- node !== sentinel &&
- (tileset.totalMemoryUsageInBytes > maximumMemoryUsageInBytes || trimTiles)
- ) {
- const tile = node.item;
- node = node.next;
- this.unloadTile(tileset, tile, unloadCallback);
- }
- };
- Cesium3DTilesetCache.prototype.trim = function () {
- this._trimTiles = true;
- };
- export default Cesium3DTilesetCache;
|