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_STOPLOOP_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
- 男子非法运输香烟被查获
- 现金比例分析(怎样进行现金比率分析)_头条焦点
- 【全球新视野】网商贷逾期一天影响信用不?多久会被起诉?
- 塔图姆谈外界对马祖拉的批评:他又没打铁和失误 是我打铁和失误
- 天天快看:七探蛇盘枪来自哪本书 七探蛇盘枪





