最新要闻
- 《利益区间》冲击金棕榈大奖
- 4999元起!小牛MQiL电动两轮车开售:顶配能骑170km_世界动态
- 对话盛希泰:“专精特新”企业给二三四线城市带来发展机会_世界视点
- 快报:河南局地大暴雨!女子家中厨房窗户被暴风雨整个吹掉:庆幸无人受伤
- 每日关注!李想:汽车行业规模要求太苛刻 更容易出问题的不是成本而是销量
- 快报:我国南海发现两处古代沉船
- 我国深海考古重大进展!首次发现大型古代沉船:水下第一视角太壮观 环球热文
- 因为AI 让80%的职业原画师下岗
- 自己办理深圳创业补贴难吗?创业开饭店有补贴吗深圳
- 爱驰汽车被曝经营困难:开通员工自费交社保通道 焦点热讯
- 中国取代日本成全球第一大汽车出口国 俄罗斯为最大买家|天天热门
- 每日观点:当日快讯:沙特外交大臣表示阿拉伯国家将继续在俄乌冲突中维持中立
- 环球短讯!近视可用 特步0~700度专业大框泳镜狂促:12元包邮
- 店员称衣服掉地上摔个洞需赔款:最终结果让网友不淡定 速看
- 如何保存新鲜活虾 活虾怎么保存? 全球即时看
- 全球微动态丨体验阿斯顿·马丁DBX707 看看超跑品牌是怎么做SUV的
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
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
即使超过终点时刻,也不会停下来,类似 直播效果。
关键词:
CesiumJS 源码杂谈 - 时间与时钟系统_前沿热点
《利益区间》冲击金棕榈大奖
4999元起!小牛MQiL电动两轮车开售:顶配能骑170km_世界动态
对话盛希泰:“专精特新”企业给二三四线城市带来发展机会_世界视点
快报:河南局地大暴雨!女子家中厨房窗户被暴风雨整个吹掉:庆幸无人受伤
每日关注!李想:汽车行业规模要求太苛刻 更容易出问题的不是成本而是销量
04-多路选择器
快报:我国南海发现两处古代沉船
我国深海考古重大进展!首次发现大型古代沉船:水下第一视角太壮观 环球热文
因为AI 让80%的职业原画师下岗
帮助Linux管理员简化任务并实现自动化的七大工具
自己办理深圳创业补贴难吗?创业开饭店有补贴吗深圳
爱驰汽车被曝经营困难:开通员工自费交社保通道 焦点热讯
中国取代日本成全球第一大汽车出口国 俄罗斯为最大买家|天天热门
React闭包陷阱
每日观点:当日快讯:沙特外交大臣表示阿拉伯国家将继续在俄乌冲突中维持中立
全球快报:【财经分析】全球贸易增长正在恢复 应继续加强多边贸易合作
环球短讯!近视可用 特步0~700度专业大框泳镜狂促:12元包邮
店员称衣服掉地上摔个洞需赔款:最终结果让网友不淡定 速看
如何保存新鲜活虾 活虾怎么保存? 全球即时看
全球微动态丨体验阿斯顿·马丁DBX707 看看超跑品牌是怎么做SUV的
比亚迪首家全品牌体验中心开业:几万块到一百万的车全都有 当前简讯
第一批升级iOS 16.5正式版的用户被坑了!_要闻速递
学系统集成项目管理工程师(中项)系列23b_信息系统集成及服务管理(下)
【爬虫数据集】滇西小哥YouTube频道TOP10热门视频的热评数据,共2W条!_世界速看料
又有基金公司宣布:APP停止运营!_环球快看
清华大学女生获选美冠军 网友:全方位优秀
年轻人第一辆后驱SUV 长安深蓝S3预售:16.99万起-热议
全球信息:雨前高山春鲜 谢裕大珍珠绿茶60克到手29元
万达集团紧急声明!
03-点亮LED灯
热搜第一!BLG晋级 LPL提前锁定MSI三连冠 每日信息
全面了解华为全屋智能4.0:体验质变 最新快讯
母亲5点帮女儿排队领证结果走错地方:白排了一个小时队
当前快看:河海大学与华中师范大学签署战略合作协议
无论多少次,还是会为粉色疯狂心动!!!
文心一言 VS 讯飞星火 VS chatgpt (19)-- go语言的slice和rust语言的Vec的扩容流程是什么? 世界热文
阴阳师×GARNiDELiA决定展开合作 或为《极乐净土》高清重制版
索尼宣布将与WNBA达成合作伙伴关系 探索各种营销机会
环球今亮点!年终工作总结会议流程_年终工作总结会议通知
NASA发出警告称巨型小行星正在接近地球 大小为纽约地标自由女神像的两倍
网易旗下Jackalope Games宣布更名 正在开发一部基于“战锤”IP的游戏
苹果App商城现已有178万个应用程序 为有意义的统计数据
,影片《人生路不熟》票房突破9亿元大关 由马丽与乔杉等人主演
电视剧《仙剑奇侠传六》官微发布新海报 由许凯和虞书欣担任
顺丰控股公布4月快递物流业务经营 业务量同比增长29.59%
差价上千元该怎么选?13代酷睿i5和i7实测性能对比
华为把屏幕边框做到了1mm!畅享60 Pro即将开卖:1499元
国网东营供电公司开展全市电力设施和电能保护集中宣传活动
从350nm升到4nm 25年来AMD CPU性能已提升910倍
女子动车上提醒男子小声打电话被怼:你凭什么说我
520当天一女子逼停汽车泼粥骂渣男引围观:网友吐槽不该糟蹋粮食
由于半导体消费持续低迷 三星半导体将推迟平泽工厂4nm生产线设备投资
2023年DPC中国联赛夏季赛开战 Aster战队首秀大放异彩赢得首胜
阅读笔记:Sybilla DLT任务重启判定系统 焦点快看
首款天玑9200旗舰!vivo X90降价:256GB版3799元到手
网红三千哥直播PK饮酒过量去世 友人:喝了至少四瓶|当前通讯
英伟达RTX 4060 Ti显卡降临:关键参数已曝光 就差价格了
初三下册月考复习:第二单元知识点-天天快播报
Java生成二维码及条形码工具
python中的装饰器原理和作用 焦点热议
23款奔驰GLC评测_全球观焦点
有你家吗?杭州人均存款达16万元:全国住户存款最强8大城市 每日消息
华为笔记本性能怪兽!MateBook 16s下周首销:i7+1TB仅7999元 全球即时看
今日精选:20年来x86巨变 Intel将精简CPU架构:转向纯血64位
女子为骗男友结婚定制美颜假身份证引热议:网友感慨太假太美了 焦点报道
情侣筷子卖22元单身筷1元 超市:已下架-环球看点
双鸭山市气象台发布大风蓝色预警【IV级/一般】【2023-05-20】 全球热文
每日看点!Natasha 插件化之dll
天天最资讯丨暴雪又搞砸了 老外批《守望先锋2》太失败:浪费4年开发
桌面RTX 4070玩游戏 显示器选2K还是4K?来看对比实测 全球热推荐
远离元宇宙后 扎克伯格财富暴涨3000亿 全球最多!|全球新视野
小米两大技术接入联发科平台!卢伟冰:天玑芯片影像蜕变
37岁姐姐跟98年男友520领证 网友:羡慕了 天天讯息
全球观察:直通车是什么快递_直通车是什么
虎书 第一章 图形流水线_环球焦点
10.998万元 春风1250TR-G摩托价格公布:用上75°V型双缸发动机
焦点速看:丰田再批电动车毫无意义:烧煤发电不环保 氢燃料才合理
【环球时快讯】瓦伦丁·迪奥曼德_关于瓦伦丁·迪奥曼德介绍
C++ Today01
Kafka未触发消费异常排查实录-全球实时
基于python实现-根据Excel表格指定的UniqueKey的顺序-到另一个参考表格中查找-补全与自己相关的数据
Revit二次开发实战
天天观察:年轻人发完红包看电影 520单日总票房超1.5亿:速激10位列第一
网吧用“蛤蟆”、“天鹅”区分男女厕所 网友点赞直呼有才:官方回应
樱桃自由了!水果贵族樱桃一斤直降30元 六七月份还会继续降
B站CEO陈睿:年轻人爱学习 超8成985、211学生是B站用户 天天速递
三星独占结束!国产手机将用上“鸡血版”二代骁龙8-当前视点
浏阳:残疾人以“武”会友,散发的是自信和快乐-全球资讯
OPEN AI角色插件通道开放接入支持各种细分领域对话场角色景模型一键接入AI 智能 聚焦
记录--Vue中如何导出excel表格
马斯克回避的赛道蔚来进军了:可控核聚变20年内商用_环球热点
首发联发科8200-Ultra!小米Civi 3跑分出炉|全球即时
新疆乌鲁木齐达坂城姑娘特色农产品展示中心预计7月投用|当前速讯
网约车拒违停 2乘客赖车上超24小时还原地撒尿 官方通报:行拘-新要闻
告别MMO手游氪金!《逆水寒》手游公测预告片发布:6月30日见
黄百鸣谈为何拍《叶问5》:前几部成绩好 甄子丹也想拍 天天报道
李荣浩沉迷《王国之泪》 吐槽吉波得女王太难:不可能有人打的过 世界速递
环球快看:Revit二次开发 知识点总结(表格)
环球今亮点!荣耀:再见了,高价低配!骁龙8+芯片+IMX800仅2599元