Jinuss's blog Jinuss's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

前端可视化
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 核心基类

  • Control控件篇

  • Geom几何图形篇

  • Layer图层篇

  • Renderer篇

  • Feature篇

  • style样式篇

    • Style类
    • Fill类
    • Stroke类
    • Text类
    • ImageStyle类
    • Icon类
    • RegularShape类
    • Circle类
    • IconImage类
    • IconImageCache类
      • 概述
      • 源码分析
        • IconImageCache类的源码实现
        • IconImageCache类的构造函数
        • IconImageCache类中的主要方法
      • 总结
  • 《Openlayers源码》笔记
  • style样式篇
东流
2025-01-20
目录

IconImageCache类

# 概述

IconImageCache 类的目的是为了缓存图标图像及其相关的模式(pattern),提高渲染性能,避免重复加载和创建图像。

# 源码分析

# IconImageCache类的源码实现

IconImageCache的源码实现如下:

class IconImageCache {
  constructor() {
    this.cache_ = {};
    this.patternCache_ = {};
    this.cacheSize_ = 0;
    this.maxCacheSize_ = 32;
  }
  clear() {
    this.cache_ = {};
    this.patternCache_ = {};
    this.cacheSize_ = 0;
  }
  canExpireCache() {
    return this.cacheSize_ > this.maxCacheSize_;
  }
  expire() {
    if (this.canExpireCache()) {
      let i = 0;
      for (const key in this.cache_) {
        const iconImage = this.cache_[key];
        if ((i++ & 3) === 0 && !iconImage.hasListener()) {
          delete this.cache_[key];
          delete this.patternCache_[key];
          --this.cacheSize_;
        }
      }
    }
  }
  get(src, crossOrigin, color) {
    const key = getCacheKey(src, crossOrigin, color);
    return key in this.cache_ ? this.cache_[key] : null;
  }
  getPattern(src, crossOrigin, color) {
    const key = getCacheKey(src, crossOrigin, color);
    return key in this.patternCache_ ? this.patternCache_[key] : null;
  }
  set(src, crossOrigin, color, iconImage, pattern) {
    const key = getCacheKey(src, crossOrigin, color);
    const update = key in this.cache_;
    this.cache_[key] = iconImage;
    if (pattern) {
      if (iconImage.getImageState() === ImageState.IDLE) {
        iconImage.load();
      }
      if (iconImage.getImageState() === ImageState.LOADING) {
        iconImage.ready().then(() => {
          this.patternCache_[key] = getSharedCanvasContext2D().createPattern(
            iconImage.getImage(1),
            "repeat"
          );
        });
      } else {
        this.patternCache_[key] = getSharedCanvasContext2D().createPattern(
          iconImage.getImage(1),
          "repeat"
        );
      }
    }
    if (!update) {
      ++this.cacheSize_;
    }
  }
  setSize(maxCacheSize) {
    this.maxCacheSize_ = maxCacheSize;
    this.expire();
  }
}

export function getCacheKey(src, crossOrigin, color) {
  const colorString = color ? asArray(color) : "null";
  return crossOrigin + ":" + src + ":" + colorString;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

# IconImageCache类的构造函数

IconImageCache类的构造函数中定义了如下变量:

  • cache_:存储图标图像的缓存。

  • patternCache_:存储图标图案的缓存,通常是图像的某种重复模式。

  • cacheSize_:当前缓存中图标图像的数量。

  • maxCacheSize_:缓存中可以存储的最大图像数量,默认值为 32

# IconImageCache类中的主要方法

IconImageCache类中的主要方法如下:

  • clear():该方法用于清空缓存,将 cache_ 和 patternCache_ 重新设置为空对象,同时将缓存大小 cacheSize_ 重置为 0。

  • canExpireCache():该方法检查当前缓存的大小是否超过了最大缓存限制。如果缓存的图像数量超过最大缓存大小,则返回 true,表示缓存可以过期。

  • expire():清理过期的缓存。如果缓存的图像数量超过最大缓存限制,调用此方法会检查缓存,并删除一些不再使用的图像和图案。通过遍历 cache_ 中的图像,如果图像没有事件监听器(hasListener() 返回 false),则认为该图像不再需要,删除它,并减少缓存的大小。

  • get(src,crossOrigin,color):获取图像缓存。根据给定的图像源 src、跨域设置 crossOrigin 和颜色 color,生成一个唯一的缓存键(key)。如果缓存中存在该图像,则返回它;否则返回 null。

  • getPattern(src, crossOrigin, color):获取图案缓存,与 get 方法类似,获取与图标相关的图案缓存。如果缓存中存在图案,则返回图案;否则返回 null。

  • set(src, crossOrigin, color, iconImage, pattern):设置图像和图案缓存。

    • 该方法将图标图像(iconImage)和图案(pattern)存入缓存中。
    • iconImage 会根据给定的 src、crossOrigin 和 color 生成唯一的 key,如果缓存中已经存在相同的图像,会更新缓存,否则将缓存大小加 1。
    • 如果 pattern 为 true,还会根据图像创建一个重复模式的图案,并将其缓存。
    • ImageState 用来检查图像加载状态,并确保图像加载完成后才能创建图案。
  • setSize(maxCacheSize):该方法用于设置缓存的最大大小(maxCacheSize),并调用 expire 方法清理超过最大缓存限制的图像。

# 总结

IconImageCache 类主要用于管理图标图像及其图案的缓存,提供了缓存清理、缓存过期、图像和图案获取、设置缓存的功能。通过这种方式,Openlayers 可以避免重复加载和创建图像,从而提升渲染性能

编辑 (opens new window)
上次更新: 2025/02/05, 02:04:09
IconImage类

← IconImage类

最近更新
01
GeoJSON
05-08
02
Circle
04-15
03
CircleMarker
04-15
更多文章>
Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式