CesiumJS 源码杂谈 - 时间与时钟系统
- 1. 时间的“诞生”
- 2. 时间的推进
- 3. Entity API 与 Property API 的更新动力源
- 4. 简单应用
- 4.1. 使用原生 JS Date 对象创建 JulianDate
- 4.2. 使用时间字符串(ISO8601标准的时间字符串或 UTC 时间字符串)创建 JulianDate
- 4.3. 为时钟设置起止时间和速率
- 4.4. 调整时钟的循环情况
你知道吗?
【资料图】
Cesium 是元素 铯的英文单词,而 铯原子钟具有世界上最高的计时精度
时间,是时刻间隔的意思,时刻是静态的点;而时间就指有起止时刻的一段范围
很多应用都要有一个时钟,例如 GPS 授时、实时渲染系统,时间可以测量很多事物,万物运动也体现了时间在流逝
1. 时间的“诞生”
首次创建时间是出现在 Scene 的构造函数中:
function Scene (/**/) { // ... updateFrameNumber(this, 0.0, JulianDate.now()); // ...}function updateFrameNumber(scene, frameNumber, time) { const frameState = scene._frameState; frameState.frameNumber = frameNumber; frameState.time = JulianDate.clone(time, frameState.time);}
源于此,很多自己应用 CesiumJS 着色器的文章中就用 FrameState
上的 frameNumber
就近似表达了“时间”的概念,因为在 60FPS 的屏幕上,可以通过 frameNumber / 60
粗略获得时间值(秒),但是一旦浏览器的帧速率变化,比如 144 FPS,这个获得的时间就会不准确。
CesiumJS 使用 JulianDate
类来表示整个程序中的时间,它是一种天文时间系统,叫作“儒略”日期,它有两个成员字段,一个是自儒略第一天(公元前 4713 年 1 月 1 日)到现在的天数 dayNumber
,另一个是今天已经走过的秒数(零点起算)secondsOfDay
。
注:我们所说的公历时间,即 GregorianDate(格里日历记法),在 CesiumJS 中也是有的,是作为 JS 原生类 Date 的高精度替代品。
根据上面的 Scene 类构造函数,使用 JulianDate.now
方法,无论什么时候初始化 CesiumJS,获取的时间值永远都是程序运行的那个时刻:
JulianDate.now = function (result) { return JulianDate.fromDate(new Date(), result);}
所以,真正的时间值在帧状态对象 scene._frameState
的 time
字段上。
2. 时间的推进
CesiumJS 内部的时间是如何更新的?
CesiumJS 的渲染源头是 CesiumWidget
对象,它每一帧都会运行 CesiumWidget.prototype.render
方法,会让此对象上的时钟 tick
一次(也就是跳一下),返回的时间就作为这一帧的时间,传递给 Scene.prototype.render
,进而调用 updateFrameNumber
函数更新累计帧数、时间值:
CesiumWidget.prototype.render = function () { if (this._canRender) { this._scene.initializeFrame(); const currentTime = this._clock.tick(); this._scene.render(currentTime); } else { this._clock.tick(); }}
所以要看时间是如何更新的,就要看 Clock
对象的 tick
方法。
初始化 Clock 时,默认就以当前的 JulianDate 为时钟起点时刻,往后一天为终点时刻。
每当调用 tick
时,会获取当前的时刻 clock.currentTime
,然后调用 JulianDate.addSeconds()
方法把时间往前推。在所有默认条件下,调用的逻辑分支是:
const milliseconds = currentSystemTime - this._lastSystemTime;currentTime = JulianDate.addSeconds( currentTime, multiplier * (milliseconds / 1000.0), currentTime);
而这个 currentSystemTime
即时间戳,来自 Performance API
(浏览器高精度性能 API)或 Date API
,能获取当前的毫秒数。
最后,把计算的 currentTime
(类型是 JulianDate
)返回给调用者,也就是 CesiumWidget.prototype.render
方法,继续更新一帧。
3. Entity API 与 Property API 的更新动力源
在之前写源码系列的时候,就提过 Entity API 是怎么运作的。
首先,EntityAPI 挂载于 Viewer
上,若无 Viewer
那默认的 Entity 容器就得自己实现一套,很麻烦。
其次,Viewer
拥有 _onTick
事件,它监听了 CesiumWidget
的 clock
的 onTick
事件,通过 EventHelper
完成:
eventHelper.add(clock.onTick, Viewer.prototype._onTick, this);
往后就是 DataSourceDisplay、CustomDataSource 等内容了,较为复杂,请移步源码解析文章。
引自源码解析文章,以参数化几何的 Entity
为例,它用的是 GeometryVisualizer
,当 GeometryVisualizer
调用 fireChangedEvent
函数后,Visualizer 就会拿到最新的 Entity 定义,进而借助 Property API、Updater 等复杂架构更新数据。
总之,若无时钟的 onTick
跳动,也就没有办法根据当前时间去更新 Entity,也就拿不到最新的 Property,更别说动态更新场景中的三维 Entity 了。
4. 简单应用
4.1. 使用原生 JS Date 对象创建 JulianDate
这个最好的说明就是 JulianDate.now
了,在上面第 1 节已经列出源码。当然,也可以自己来搞一个:
const myDate = JulianDate.fromDate(new Date())
4.2. 使用时间字符串(ISO8601标准的时间字符串或 UTC 时间字符串)创建 JulianDate
以北京时间为例:
const myDate = JulianDate.fromIso8601("2023-05-01T13:15:21+08:00")
注意日期和时间之间有一个大写字母 T
。我在尾部加上了 +08:00
表示东八区北京时间。
4.3. 为时钟设置起止时间和速率
这个就很简单了:
clock.startTime = JulianDate.fromIso8601("2023-05-01T00:00:00+08:00")clock.stopTime = JulianDate.fromDate(new Date("2023/05/02 00:00:00")) // Date 会默认使用当前时区,当然你也可以手动 +8,格式按 Date 的文档来就可以clock.multiplier = 3600 // 3600倍速,一秒过一小时
注意,设置倍数要配合参数 clock.clockStep === ClockStep.SYSTEM_CLOCK_MULTIPLIER
或 ClockStep.TICK_DEPENDENT
才有效。
4.4. 调整时钟的循环情况
clock.clockRange = ClockRange.LOOP_STOP
LOOP_STOP
是默认的,到终点不会停止,会继续往前走,但是会重新回到起点时刻,类似于 重播效果。
CLAMPED
会在终点时刻停下来,类似于 播完就停在那里。
UNBOUNDED
即使超过终点时刻,也不会停下来,类似 直播效果。
标签:
- 黄山提升政府采购透明度 助力实体经济持续健康稳定发展
- 1-2月黄山新签“双招双引”项目103个 总投资额139.7亿元
- 池州海关共签发RCEP原产地证书22份 签证金额92.7万美元
- 宿州泗县深入推进文旅融合发展 擦亮城市品牌
- 河北工业生产平稳开局 固定资产投资较快增长
- 昆明西山区深入实施人才强区战略 建立健全招商招才引资并轨新模式
- 2月唐山新建商品住宅销售价格与上月持平 同比下降0.8%
- 去年河北电子信息产业实现主营业务收入2367.7亿元 同比增长22.4%
- 绥化望奎以工业化思维为引领 推动肉类加工制造产业腾飞
- 绥化市监局推出多项举措 大力促进有机产品产业发展
- 半路出家无心插柳 杭州西湖区“菌菇宝宝”变废为宝
- 温州鹿城区藤桥主打藤桥熏鸡 近两年销售额年均增长20%以上
- 1-2月安徽限额以上消费品零售额1030.4亿元 同比增长10.4%
- 2021年合肥市茶园面积13.6万亩 产值176350万元
- 淡季不忘引流 京郊民宿市场将很快迎来回暖
- 郴州安仁文旅项目集中开工 总投资1000万元
- 江苏服务业继续保持发展强劲势头 为高质量发展提供有力支撑
- 黄山休宁经开区摸排基础设施项目17个 计划总投资29709万元
- 前两个月宣城出口31亿元 增长34.4%
- 滁州凤阳2021年共接待游客225万人次 旅游综合收入20.25亿元
- 1-2月宿州市民间投资同比增长19.2% 居全省第3位
- 宿州严格审核把关 抢抓发行地方政府专项债券政策机遇
- 1-2月亳州市进出口总值5.5亿元 同比下降17.4%
- 合肥:弘扬茶文化 初步形成一条生态发展之路
- 合肥:建成“数字中国”领先城市 推进城市数字化转型
- 甘肃再续“艾黎情”:探职业教育德技并修
- 【城市守望者】致敬抗“疫”一线的“拆弹专家”
- 浙江绍兴越城区核酸检测结果公布 除1例阳性外其余均为阴性
- 内地首例奥密克戎变异株感染者身体状况如何?来自哪里?专家解读→
- 对变异病毒已有准备!关于中国新冠药物,钟南山发声→
- 江苏睢宁小网格大担当 织就乡村振兴“幸福网”
- 改造老旧小区 共享幸福生活
- 天津静海:群众在哪里,文明实践就延伸到哪里
- 齐齐哈尔:初步判断疫情感染来源为接触新冠病毒污染环境和物品
- 重庆大竹林派出所副所长因对群众态度简单粗暴被停职
- 黑龙江讷河病例感染源初步判断为新冠病毒污染的环境和物品
- 致敬2021
- 浙江瑞安民警捐献造血干细胞:14年前的心愿终将如愿
- “考研房”涨价离谱 律师:借机宰客有违市场伦理
- 广州白云机场:14天内有东莞旅居史的旅客须凭48小时核酸阴性证明乘机
- 浙江绍兴本轮疫情已报告确诊病例145例 无症状感染者1例
- 福建龙岩一男子和前妻斗气 扛着126斤硬币到法院“还钱”
- 重庆这座立交酷似“悟空” 走红 设计师揭秘(图)
- 青海警方破获特大电诈案 涉案流水高达1.7亿
- 云南新增境外输入确诊病例3例
- 黑龙江讷河市5名核酸阳性人员流调溯源:接触被新冠病毒污染的环境和物品
- 男子爱上女主播 假扮女主播闺蜜教其他男粉丝刷单
- 广西三市警方联手破获毒品案 全链条摧毁跨境贩毒团伙
- 广东东莞发现2例无症状感染者,部分镇今起全员筛查
- 从百二秦关到闻道凯旋 一个殉职医生最后的朋友圈
- 浙江发补充说明:三地铁路出行政策随风险等级同步调整
- 内蒙古新增本土确诊病例5例 均在呼伦贝尔满洲里市
- 陕西新增本土确诊病例1例 系隔离酒店工作人员
- 31省份新增新冠肺炎确诊病例76例 其中本土51例
- 浙江新增新冠肺炎确诊病例45例 其中本土44例
- 技能就是财富 技工也是人才
- 黑龙江新增本土确诊病例1例、本土无症状感染者4例
- 冷空气“调休”!我国大部陆续迎回暖 中东部雨雪稀少
- 华北黄淮等地大气扩散条件转差 冷空气将影响中东部
- 别误读了野猪或将不再是“三有”动物
- 您的ETC已到期?当心这个诈骗短信!
- 对回家的“宝贝”少一些关注,也是一种帮助
- 升温!北京今日阳光在线 最高气温将升至8℃
- 那年今日 | 一张漫画涨知识之12月14日
- 40岁男子一觉醒来突然听不见了 原因是……
- 本年度星空压轴大赏上演 双子座流星雨观赏地图来了
- 广东东莞大朗镇报告2例新冠肺炎无症状感染者
- 商丘4885份被盗出生证去哪了?10年“悬案”引关注
- 浙江海宁警方通报国家公祭日女子穿和服逛街
- 厨艺不精调料凑?懒人调料:年轻人的“下厨神器”
- “您的ETC已到期?”警方提醒:当心这个诈骗短信
- “网红”局长的热度 自述:走红后我就没有周末了
- 寻回被拐10年的儿子后又送走 儿子:害我没家了
- 小城里的三张面孔和警号301137
- 倡导“就地过年”,需因地制宜科学防疫
- 别用“入乡随俗”为星巴克找借口
- 北京地铁14号线年底全线贯通运营
- 天津市从入境人员中检出奥密克戎变异株
- “外滩活地图”黄俊:一个不想出圈的段子手交警
- 寻找一双儿女的25年
- 无锡市场监管部门责成星巴克涉事门店停业整改
- 海岛警事:为了一座岛和2900平方公里的海
- 北京民警宏福苑抗疫26天:“今夜我和雪花一起出发”
- 星巴克的“金标准”缘何败给了“潜规则”
- 患者被低价药“惊呆”的场面应该更多些
- 影视剧“超前点评”不止是“低级错误”
- “南昌鹦鹉案”下发不起诉决定书 网店上架费氏牡丹鹦鹉被拒
- 河南商丘4885份出生医学证明被盗始末追踪
- 绍兴市病例62-109活动轨迹公布
- 12月7日以来,杭州累计报告新冠肺炎确诊病例19例
- 浙江绍兴新增确诊病例37例 上虞区占36例
- 河南高院对张成功案作出死刑判决
- 四川一滑雪场停电游客被困索道 官方回应
- 浙江绍兴越城区新增1例新冠肺炎确诊病例 当地对防控区域划分进行调整
- 中国内地首次检出新冠病毒奥密克戎变异株
- 知网除了涉及著作权纠纷,是否涉嫌违反《反垄断法》?
- 浙江绍兴越城区新增1例新冠肺炎确诊病例
- 四川眉山千箱柑橘送往呼和浩特市抗疫一线
- 两名青年男女探险三亚落笔洞遗址被困沼泽 消防成功救援
- 中国地理学大会在福州发布《中国地理学界碳中和科技行动福州宣言》
广告
广告
- CesiumJS 源码杂谈 - 时间与时钟系统
- 焦点热讯:推动成渝地区双城经济圈建设氛围浓 西洽会上,烙下更多“双城印记”
- 我,山西太原市事业单位职工,告诉你一年收入有多少
- 美国FBI被曝滥用私人通信数据
- Skip:欣赏穆雷投进三分和自己替补席庆祝 而不是和湖人说垃圾话
- 当前资讯!格力解散手机团队,董明珠代言
- 【全球聚看点】法人关联关系类型怎么填_关联关系类型怎么填
- 世界讯息:浑天仪是真的还是假的_浑天仪是干什么的
- 世界速读:剑南春丨巴萨1-2皇社,莱万破门,孔德失误,索尔洛特传射
- 天天快看点丨退货函写法 退货函
- 原洛阳银行党委书记、董事长王建甫被查 当前报道
- 什么信用卡额度高好通过_什么信用卡额度高
- 天天短讯!2023年铁人三项亚洲杯赛:我国选手夺得女子组冠军
- 关注:苏杯半决赛中国开局不利 黄东萍:关键时刻犯错误比对手多
- instead+和instead+of+用法比较_instead of
- 男子非法运输香烟被查获
- 现金比例分析(怎样进行现金比率分析)_头条焦点
- 【全球新视野】网商贷逾期一天影响信用不?多久会被起诉?
- 塔图姆谈外界对马祖拉的批评:他又没打铁和失误 是我打铁和失误
- 天天快看:七探蛇盘枪来自哪本书 七探蛇盘枪