主頁 >  其他 > CesiumJS 原始碼雜談 - 時間與時鐘系統

CesiumJS 原始碼雜談 - 時間與時鐘系統

2023-05-22 07:42:13 其他

目錄
  • 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._frameStatetime 欄位上,

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 事件,它監聽了 CesiumWidgetclockonTick 事件,通過 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_MULTIPLIERClockStep.TICK_DEPENDENT 才有效,

4.4. 調整時鐘的回圈情況

clock.clockRange = ClockRange.LOOP_STOP

LOOP_STOP 是默認的,到終點不會停止,會繼續往前走,但是會重新回到起點時刻,類似于 重播效果

CLAMPED 會在終點時刻停下來,類似于 播完就停在那里

UNBOUNDED 即使超過終點時刻,也不會停下來,類似 直播效果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/553013.html

標籤:其他

上一篇:Pytest - pytest 命令(2) - 命令引數及含義

下一篇:返回列表

標籤雲
其他(159431) Python(38156) JavaScript(25441) Java(18078) C(15229) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7203) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4574) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1975) 功能(1967) Web開發(1951) HtmlCss(1940) python-3.x(1918) C++(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • CesiumJS 原始碼雜談 - 時間與時鐘系統

    [TOC] 你知道嗎? - Cesium 是元素 **銫** 的英文單詞,而 **銫原子鐘** 具有世界上最高的計時精度 - 時間,是時刻間隔的意思,時刻是靜態的點;而時間就指有起止時刻的一段范圍 - 很多應用都要有一個時鐘,例如 GPS 授時、實時渲染系統,時間可以測量很多事物,萬物運動也體現了時 ......

    uj5u.com 2023-05-22 07:42:13 more
  • Pytest - pytest 命令(2) - 命令引數及含義

    ## Pytest 命令 ### pytest 命令引數及含義 **下面串列是執行pytest命令比較常見的一些引數及含義** | 引數 | 含義 | | | | | -q | 輸出的結果縮短顯示 | | -s | 顯示在python程式中的print輸出的內容,如是不加則不會顯示 | | --du ......

    uj5u.com 2023-05-22 07:41:28 more
  • HTTPS如何優化?

    由裸資料傳輸的 HTTP 協議轉成加密資料傳輸的 HTTPS 協議,給應用資料套了個「保護傘」,提高安全性的同時也帶來了性能消耗。

    因為 HTTPS 相比 HTTP 協議多一個 TLS 協議握手程序,目的是為了通過非對稱加密握手協商或者交換出對稱加密密鑰,這個程序最長可以花費掉 2 RTT,接著后... ......

    uj5u.com 2023-05-22 07:40:53 more
  • AtCoder Beginner Contest 302

    ## [A - Attack (abc302 a)](https://atcoder.jp/contests/abc302/tasks/abc302_a) ### 題目大意 給定怪物的血量$a$和你每次攻擊扣除的血量 $b$,問打多少次怪物才會死。 ### 解題思路 答案即為$\lceil \fra ......

    uj5u.com 2023-05-21 07:46:54 more
  • OpenAI 官宣首個 ChatGPT iOS 應用

    最近,OpenAI 宣布推出官方 iOS 應用,允許用戶隨時隨地訪問其高人氣 AI 聊天機器人,此舉也打破了近幾個月內蘋果 App Store 上充斥似是而非的山寨服務的窘境。 ![](http://img.topjavaer.cn/img/202305200923464.png) 該應用程式是 C ......

    uj5u.com 2023-05-21 07:46:45 more
  • Codeforces Round 874 (Div. 3)

    # [A.Musical Puzzle](https://codeforces.com/contest/1833/problem/A "A.Musical Puzzle") ### 題意: 用最少的長度為2的字串按一定規則拼出s。規則是:前一個字串的尾與后一個字串的首相同。 ### 分析: 統 ......

    uj5u.com 2023-05-21 07:46:35 more
  • 閱讀筆記:Sybilla DLT任務重啟判定系統

    ## 論文簡介 [Sibylla: To Retry or Not To Retry on Deep Learning Job Failure](https://www.usenix.org/system/files/atc22-kim-taeyoon.pdf) 這篇論文發表在ATC 2022上,主 ......

    uj5u.com 2023-05-21 07:46:26 more
  • CodeForces1061C Multiplicity

    ## 題面翻譯 從序列 $\{a_1,\ a_2,\ ..\ ,\ a_n\}$ 中選出**非空**子序列 $\{b_1,\ b_2,\ ..\ ,\ b_k\}$,一個子序列合法需要滿足 $\forall\ i \in [1,\ k],\ i\ |\ b_i$。求有多少互不相等的合法子序列,答案對 ......

    uj5u.com 2023-05-21 07:46:20 more
  • 小白如何理解軟體自動化介面測驗

    隨著軟體開發行業的不斷發展,軟體測驗介面自動化已經成為了一種趨勢。
    介面自動化可以提高軟體測驗的效率和準確性,減少人力成本和時間成本,幫助企業更好地實施軟體測驗介面自動化。 ......

    uj5u.com 2023-05-21 07:41:07 more
  • 如何通過三個步驟徹底擦除iPhone中的資料

    https://zh-cn.aiseesoft.com/erase-iphone/how-to-erase-data-on-iphone-securely.html 在出售或贈送用過的 iPhone 之前,您必須以安全的方式徹底擦除 iPhone 上的所有資料,以保護您的隱私。 您可以簡單地從手機上 ......

    uj5u.com 2023-05-21 07:35:44 more