Cesium实时渲染原理浅析

devtools/2025/2/21 4:32:52/

文章目录

  • 背景
  • Cesium.CallbackProperty(callback, isConstant)
  • 原理

背景

在地图的几何编辑场景中,我们通常需要快速渲染拖拽后的几何体,如果通过移除要素再添加要素的逻辑去更新,往往会有较低的效率。Cesium Entity是否提供了更高效的更新接口呢?答案是有的。

CesiumCallbackPropertycallback_isConstant_3">Cesium.CallbackProperty(callback, isConstant)

这个方法,适用于添加要素时,给属性赋值。有意思的是,这是一个回调函数,这个方法内,我们可以返回计算得到的最新属性值,Cesium会在每次渲染时自动调用该回调函数,以渲染最新几何。

以polygon为例:

this.entityCollections.add({polygon: {hierarchy: new Cesium.CallbackProperty(() => new Cesium.PolygonHierarchy(this.coors), false)},});

注意,这里需要使用箭头函数,this指向执行时的上下文。这样,只要this.coors始终在变化,渲染几何就会实时更新。

原理

CallbackProperty的源码如下:

/*** A {@link Property} whose value is lazily evaluated by a callback function.** @alias CallbackProperty* @constructor** @param {CallbackProperty.Callback} callback The function to be called when the property is evaluated.* @param {Boolean} isConstant <code>true</code> when the callback function returns the same value every time, <code>false</code> if the value will change.*/
function CallbackProperty(callback, isConstant) {this._callback = undefined;this._isConstant = undefined;this._definitionChanged = new Event();this.setCallback(callback, isConstant);
}// getValue方法很重要,会在渲染时获取值的时候判断如果值被定义了,就会调用property.getValue方法,这样就会始终获取callback的最新值
CallbackProperty.prototype.getValue = function (time, result) {return this._callback(time, result);
};CallbackProperty.prototype.setCallback = function (callback, isConstant) {//>>includeStart('debug', pragmas.debug);if (!defined(callback)) {throw new DeveloperError("callback is required.");}if (!defined(isConstant)) {throw new DeveloperError("isConstant is required.");}//>>includeEnd('debug');var changed = this._callback !== callback || this._isConstant !== isConstant;this._callback = callback;this._isConstant = isConstant;if (changed) {this._definitionChanged.raiseEvent(this);}
};export default CallbackProperty;

调用栈如下:
在这里插入图片描述
看下Property.getValueOrUndefined源码:

// 这段代码就是执行了CallbackProperty.getValue(),从而执行callback回调,callback是个箭头函数,因此this.coors如果是更新的,那么callback的结果也会是最新的位置
Property.getValueOrUndefined = function (property, time, result) {return defined(property) ? property.getValue(time, result) : undefined;
};

同理,Cesium.CallbackProperty方法也可以用在所有需要实时更新的属性位置,比如point的position属性。

注意,渲染必须是自动执行的,即在new Cesium.Viewer()时,useDefaultRenderLoop属性必须为true,或者直接不填(默认为true)。// True if this widget should control the render loop, false otherwise.

如果不填,必须手动在一些鼠标操作,例如mouseMove里写主动触发渲染的方法,否则,无法渲染,CallbackProperty也不会被执行。


http://www.ppmy.cn/devtools/125223.html

相关文章

PHP2-CTFWeb进阶wp-攻防世界13

CTFWeb进阶wp-攻防世界-PHP2 用了御剑和dirsearch扫描了一下发现什么也没扫描到&#xff0c;其它人好像有扫描到的&#xff0c;看了大佬的wp说有index.phps,去查了下。 phps 文件就是 php 的源代码文件&#xff0c;可以当作一个知识点记住&#xff0c;直接访问/index.phps,得…

python-读写Excel:openpyxl-(2)图片、图表、批注、超链接、公式

目录 插入公式 插入时间 添加批注 设置超链接 插入图片 图表 插入公式 sht1.cell(2, 10).value SUM(L1:L39) 插入时间 sht1.cell(4, 4).value datetime.datetime(2020, 2, 23, 10, 20, 00) print(sht1.cell(4, 4).value) 添加批注 from openpyxl.comments import …

【前端知识点】前端笔记

css 引入css文件的文件路径 <!-- 引入外部 CSS 文件 --> <!-- 当前文件所在文件夹目录 --> <link rel"stylesheet" href"./"> <!-- 当前文件所在父文件夹目录 --> <link rel"stylesheet" href"../">j…

iOS swift5 苹果app审核被拒 1.4.1

文章目录 1.被拒2. 官网1.4.1的规定3.如何解决参考博客 1.被拒 准则1.4.1-安全-人身伤害 该应用程序连接到外部医疗硬件&#xff0c;以提供医疗服务。然而&#xff0c;为了遵守准则1.4.1&#xff0c;您必须&#xff1a; -提供来自适当监管机构的文件&#xff0c;证明应用程序…

2014年国赛高教杯数学建模B题创意平板折叠桌解题全过程文档及程序

2014年国赛高教杯数学建模 B题 创意平板折叠桌 某公司生产一种可折叠的桌子&#xff0c;桌面呈圆形&#xff0c;桌腿随着铰链的活动可以平摊成一张平板&#xff08;如图1-2所示&#xff09;。桌腿由若干根木条组成&#xff0c;分成两组&#xff0c;每组各用一根钢筋将木条连接…

全域景区旅游导览小程序

1. 探索未知&#xff0c;一触即达&#xff01;&#x1f680;&#x1f30d; 全域景区旅游导览小程序&#xff0c;带你领略世界的每一个角落&#xff01;只需指尖轻点&#xff0c;美景即刻呈现&#xff0c;让旅行更简单、更精彩&#xff01;2. 旅行新风尚&#xff0c;一“键”钟情…

光路科技TSN交换机:驱动自动驾驶技术革新,保障高精度实时数据传输

自动驾驶技术正快速演进&#xff0c;对实时数据处理能力的需求激增。光路科技推出的TSN&#xff08;时间敏感网络&#xff09;交换机&#xff0c;在比亚迪最新车型中的成功应用&#xff0c;显著推动了这一领域的技术进步。 自动驾驶技术面临的挑战 自动驾驶系统需整合来自雷达…

【系统分析师】-案例篇-信息系统安全

1、信息系统的安全威胁 来自于物理环境、通信链路、网络系统、操作系统、应用系统以及管理等多个方面。 物理安全威胁是指对系统所用设备的威胁&#xff0c;如自然灾害、电源故障、数据库故障和设备被盗等造成数据丢失或信息泄漏。 通信链路安全威胁是指在传输线路上安装窃…