缓存:
根据源数据的性质,osgEarth在成为一个地形块之前可能需要对它进行一些处理。这可能包括下载、重投影、裁剪、mosacing或合成等等。这些操作可能会变得很费时。通过设置缓存,您可以指示osgEarth存储处理的结果,这样下次需要相同的tile时就不需要再做一次了。
注意!osgEarth的缓存使用内部数据存储表示,不打算通过任何公共API访问。它只打算用作临时缓存,而不是数据发布格式。结构随时可能改变。如果您想要发布数据存储库,请考虑osgearth_package实用程序!
设置缓存:
您可以在earth文件中设置一个缓存。以下设置将自动激活所有图像和高程层的缓存:
在代码中,如下所示:
FileSystemCacheOptions cacheOptions;
cacheOptions.path() = …;
MapOptions mapOptions;
mapOptions.cache() = cacheOptions;
或者,您可以使用一个环境变量,它将应用于所有earth文件。记住,这会覆盖earth文件中的缓存设置:
set OSGEARTH_CACHE_DRIVER=leveldb
set OSGEARTH_CACHE_PATH=folder_name
在代码中,您可以在osgEarth resgistry中设置一个全局缓存:
osgEarth::Registry::instance()->setCache(…);
osgEarth::Registry::instance()->setDefaultCachePolicy(…);
高速缓存策略:
一旦设置了缓存,osgEarth将默认为所有的图像和高程层使用它。如果要重写此行为,可以使用缓存策略。缓存策略告诉osgEarth某个对象是否以及如何使用缓存。
在earth文件中,可以通过使用cache_policy块来实现这一点。这里我们将它应用到整个地图上:
或者您可以将策略应用到单个层:
…
缓存策略的使用值为:
read_write: 默认值。如果配置了缓存,则使用缓存。
no_cache: 即使有缓存,也不要使用它。只直接从数据源读取。
cache_only: 如果设置了缓存,只使用缓存中的数据;永远不要去数据源。
您还可以将缓存定向到过期对象。默认情况下,缓存的数据永远不会过期,但是您可以使用max_age属性告诉它将一个对象视为有效的时间:
指定以秒为单位的最大年龄。上面的示例将过期超过一个小时的对象。
环境变量
有时候从环境中控制缓存更方便,特别是在开发过程中:
这些变量覆盖缓存策略属性:
OSGEARTH_NO_CACHE: 为任何osgEarth映射启用no_cache策略。(设置为1)
OSGEARTH_CACHE_ONLY: 启用任何osgEarth地图的cache_only策略。(设置为1)
OSGEARTH_CACHE_MAX_AGE: 将缓存设置为过期对象的时间超过此秒。
这些不是缓存策略的一部分,而是控制一个特定的缓存实现。
OSGEARTH_CACHE_PATH: 缓存的根文件夹。设置此设置将启用对任何活动的缓存驱动程序的缓存。
OSGEARTH_CACHE_DRIVER: 设置要使用的缓存驱动程序的名称,例如文件系统或leveldb。
注意:环境变量覆盖了earth文件中的缓存设置!见下文。
缓存策略设置的优先级:
因为您可以在不同的地方设置缓存策略,所以我们需要建立优先级。这是规则。
Map settings. 这是在earth文件中的< Map >块中的Map对象中的缓存策略集。这将为映射中的每个层设置默认缓存策略。这是最弱的政策设置;它可以被下面的任何设置覆盖。
Layer settings. 这是ImageLayer或ElevationLayer对象(或在earth文件中的
播种缓存:
有时,为感兴趣的特定领域预种子缓存是有用的。osgEarth提供了一个名为osgearth_cache的实用程序来完成这项任务。osgearth_cache将获取一个Earth文件,并填充它找到的任何缓存。
输入osgearth_cache –help的帮助,获取使用信息。
注意:缓存是一个临时的“黑盒”,用于在某些情况下提高性能。它不作为可分发的数据存储库。在许多情况下,您可以将缓存文件夹从一个环境移动到另一个环境,它将工作,但osgEarth不保证这样的行为。