CesiumJS 2022^ 原理[1] 使用 requestAnimationFrame 循环触发帧动画

CesiumJS 2022^ 原理[3] 渲染原理之从 Entity 看 DataSource 架构 - 生成 Primitive 的过程 Python微信订餐小程序课程视频 https://blog.youkuaiyun.com/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.youkuaiyun.com/m0_56069948/article/details/122285941 目录* API 用法回顾 1. 为什么要从 Viewer 访问 Entity API 1.1. 高层数据模型的封装 - DataSource API 1.2. 显示管理器 DataSourceDis 阅读详情

目录
  • 0. 前置约定
    • 本系列说明
  • 1. 开始
    • 1.1. CesiumWidget 类是控制场景对象触发渲染的调度器
    • 1.2. Scene 对象
  • 2. 三维地球哪来的?
  • 3. 本篇总结


0. 前置约定

  • 对类的使用,不添加 Cesium 命名空间前缀,例如对于 Viewer,不会写 Cesium.Viewer,默认使用 ESM 格式解构导入类;
  • JavaScript 代码使用最简格式(源码除外),不加分号,不用双引号,少注释,双空格缩进

本系列说明 安徽干部培训学校 www.tjganxun.cn

佛系连载,想到什么写什么。

2022 年,写原理类的文显得非常“蠢”,大家都想吃快餐,看效果。法克鸡丝老哥的系列博客思路跳跃很快,单步说明之间的信息量很大,需要消化很长时间才能啃完一篇文章,遂决定另开一个风格,提纲挈领地把主要关键逻辑大白话说说 —— 可不是真的“大白话”,还是要有一些功底的。

我写这个,只是为了从 CesiumJS 的渲染架构中汲取一些营养,希望对自己的程序设计能力有提高,希望能从其它绘图 API 的角度看看能不能优化和实现。

1. 开始

很多人写 CesiumJS 程序是从 Viewer 开始的

new Viewer('container') // div id

你若只需要一个最干净的场景(此场景非 Scene 类),不需要时间条、时间控制器、右上角一堆的按钮,只需要

new CesiumWidget('container') // div id

CesiumJS 内置了大量的默认值,以至于简单到你可以只传递 DOM 的 id 或本身即可创建场景。

1.1. CesiumWidget 类是控制场景对象触发渲染的调度器

Scene 类是一个三维空间对象的容器,它在原型链上有一个 render 方法,寥寥百行,控制了三维场景中若干物体的更新、渲染。

Scene.prototype.render 方法调用一次,只更新并渲染一帧。

众所周知,WebGL 一般会和 requestAnimationFrame, rAF 这个 API 循环调用渲染函数。而让 canvas 中场景能连续多帧循环往复运行的调度者,是 CesiumWidget 类。

CesiumWidget 类有一个使用 Object.defineProperties() 方法定义的 setter:

useDefaultRenderLoop: {  get: function () {    return this._useDefaultRenderLoop;  },  set: function (value) {    if (this._useDefaultRenderLoop !== value) {      this._useDefaultRenderLoop = value;      if (value && !this._renderLoopRunning) {        startRenderLoop(this);      }    }  },}

在实例化 CesiumWidget 时,它会使用传入的值,若没有,则是 true:

this._useDefaultRenderLoop = undefined;this.useDefaultRenderLoop = defaultValue(  options.useDefaultRenderLoop,  true);

一旦赋值,就开始了 CesiumJS 的渲染循环,是一个在 模块内 的函数 startRenderLoop 负责控制的。

function startRenderLoop(widget) {  // ... 节约篇幅,此处非源码,省略大量代码层级,有兴趣自己看源码  function render(frameTime) {    // ...    widget.render()    requestAnimationFrame(render)    // ...  }  requestAnimationFrame(render)}

传入的 widget 是 CesiumWidget 实例,通过 requestAnimationFrame 的调用,则不断地在调用这个函数内的局部函数 render。

render 函数内调用 widget 的 render 方法,再往下就是调用 widget 所拥有的 scene 的 render 方法了。

1.2. Scene 对象

接上文说。

于全局,CesiumWidget 负责控制 DOM 的变化情况,例如窗口尺寸变化导致 DIV 的变化等,并负责起 渲染循环 的调度。

于单帧,Scene 类则需要使用自己原型链上的 render 方法完成自我状态、数据对象的更新,以及 Scene.js 模块内的 render 函数触发 WebGL 绘制。

Scene 类是一个场景对象容器,其 render 方法负责:

  • 生命周期事件(preUpdate、preRender、postUpdate、postRender)回调触发;
  • 更新帧状态和帧号
  • 更新 Scene 中的 Primitive
  • 移交渲染权给模块内的 render 函数触发 WebGL 绘制

2. 三维地球哪来的?

CesiumJS 的三维地球,实际上分两大部分:

  • 地球椭球体与表面的 GIS 影像服务
  • 场景中的三维物体

我说过了,CesiumJS 内置了大量的默认值,包括地球椭球体以及影像服务(默认用的必应瓦片服务,要 token)。但是,实际上可以不需要地球椭球体和底图的:

  if (defined(scene.globe)) {    scene.globe.beginFrame(frameState);  }

上述代码片段是 Scene.js 模块内的 render 函数的一小段,也就是说,若没有定义 globe,那就不绘制椭球上的帧。

3. 本篇总结

综上 1、2 节,我认为 CesiumJS 的渲染循环,到本文 1.2 小节末尾提及的 Scene.js 模块内 render 函数的调用,触发 WebGL 绘制,就算一帧的逻辑结束,没有必要再向下探究 Primitive、DataSource、Globe 等数据实体的更新和渲染,也没有必要深究 WebGL 在 CesiumJS 中如何调度 —— 那都不是渲染循环的主要内容。

Scene 原型链上的 render 函数并没有更新椭球体,没有请求地形四叉树瓦片,而是等待更重要的 Primitive 等三维物体的更新后,才判断 globe 是否存在,从而决定要不要画地球(的皮肤),最终才更新并执行 Command,也就是 scene.updateAndExecuteCommands(passState, backgroundColor); 一句代码。

Cesium 问题:[Violation]‘requestAnimationFrame‘ handler took 58ms 通过以上优化方法,您可以尝试改进 requestAnimationFrame 处理函数的性能,从而减少警告提示并提升页面的性能和用户体验。如果您需要更多帮助或有其他问题,请随时告诉我。我会尽力协助您解决问题。减少计算量: 确保在 requestAnimationFrame 的处理函数中尽量减少复杂的计算操作,避免循环嵌套和大量计算,尽量保持处理函数的执行时间短暂。分解任务: 如果处理函数中包含多个任务,可以将其拆分为多个较小的函数,并分批执行,以减少单次执行的时间。 阅读详情

相关推荐

批处理脚本手动双击可以执行,但计划任务中执行失败

问题现象: 使用批处理脚本从linux端(samba server) 备份一些数据,设置计划任务每天凌晨两点定时备份。 1)、windows系统中映射共享文件夹为S:盘,需要输入共享用户名和密码 2)、脚本中使用xcopy命令复制共享目录中的文件到windows本地目录中。 脚本如下: set Name=%date:~0,4%%date:~5,2%%date:~8,2% chcp 65001 REM chcp防止中文乱码 mkdir "E:\脚本备份\bakscripts%Name%" xco

独孤清扬玩DB 4312

requestanimationframe 无限循环

简介 requestAnimationFrame()函数就是针对动画效果的API,你可以把它用在DOM上的风格变化或画布动画或WebGL中 优点 浏览器可以优化并行的动画动作,更合理的重新排列动作序列,并把能够合并的动作放在一个渲染周期内完成,从而呈现出更流畅的动画效果。通过requestAnimationFrame(),JS动画能够和CSS动画/变换或SVG SMIL动画同步发生。另外,如果在一个浏览器标签页里运行一个动画,当这个标签页不可见时,浏览器会暂停它,这会减少CPU,内存的压力。 .

楠姐的博客 2650

单细胞monocle3分析流程再整理

定义root cell, 推断拟时方向# 结合先验知识自定(示例数据)# 可视化示例数据,起点是随便点的。

zfyyzhys的博客 2101

vue使用echarts很卡 'requestAnimationFrame' handler took 64ms

vue使用echarts的时候, 如果出现"requestAnimationFrame handler took xxx ms"的提示, 表示当前的图表渲染所用的时间超过了浏览器规定的最长时间(通常是16.7ms), 导致图表的渲染卡顿. 这种情况通常是由于数据量过大, 导致渲染所用的时间过长. 解决方法有: 尽量减少数据量, 使图表渲染所用的时间尽可能短. 对于一些复杂的图表, 可以使用图表...

weixin_42603332的博客 2916

BUUCTF--[OGeek2019]babyrop

才学习了基本的ROP流程,到处找题练,不过也没做出来几道题,以这道32位的题作为例题吧。 这道题是BUUCTF上pwn练习题里的[OGeek2019]babyrop。 代码审计 老规矩先checksec一下: 没有canary保护,nx保护开启排除shellcode可能性,FULL RELEO为地址随机化。 观察主函数,先设定了一个闹铃,到时间就会强制退出程序,解除闹铃的方法在上一篇博客中提到过了, 这道题中闹铃函数依然对我们解题起不到什么干扰作用。 主函数的思路大概是:生成一个随机数,把这个随机数作为

N1rvana的博客 6005

遥感影像分割实战:LoveDA数据集从下载到训练全流程指南(附避坑技巧)

本文以LoveDA数据集为例,提供了一份详尽的遥感影像语义分割实战指南。内容涵盖从数据下载、理解与预处理,到环境配置、模型选择与训练,再到性能调优与部署的全流程,并重点分享了多个关键环节的避坑技巧,旨在帮助开发者和研究者高效上手并解决实际问题。

cherry的博客 929

requestAnimationFrame详解

为什么要说它,源于看到的一道面试题:问题是用js实现一个无限循环的动画。 首先想到的是定时器 <!doctype html> <html lang="en"> <head> <title>Document</title> <style> #e{ width: 100px; height: 100px; background.

源辰_付鹏程 2547

Modbus协议介绍及解析

Modbus协议介绍及解析 1.Modbus简介 Modbus是一种广泛应用于工业控制领域串行通信协议,以其开放性、高可靠性、高效简单性、免费等优点,成为了工业领域通信协议的业界标准,是工业现场电子设备之间常用的连接方式。Modbus按其格式可分为Modbus-RTU,Modbus-ASCII,Modbus-TCP,其中前两者适用于串行通信控制网络中,例如RS485,RS232等,而Modbus-TCP主要应用于基于以太网TCP/IP通信的控制网络中。通过此协议,控制器相互之间、或控制器和其它设备之间进行通

逍遥子的博客 1万+

vue使用echarts的堆叠折线图一直警告[Violation] 'requestAnimationFrame' handler 用时 <N> 毫秒怎么解决...

这个警告通常是因为你的图表渲染过于复杂或者数据量过大,导致在浏览器的一帧内渲染超时。 你可以尝试以下方法来解决这个问题: 减少图表中的数据量,使其更加简单,从而减少渲染时间。 使用图表的 lazyUpdate 选项,可以让图表每隔一段时间重新渲染,从而减少每次渲染的数据量。 使用图表的 renderer 选项,可以指定使用 Canvas 或 SVG 渲染图表,这可以提升渲染性能。 对于大型...

weixin_42594427的博客 5251

基于simulink的电气弹簧ES稳压控制模型仿真

若要补偿母线电压的谐波,需控制ES上的谐波,即在单闭环母线电压有效值控制的基础上,增加谐波抑制环节来进行谐波控制,现有的各种检测和抑制谐波的方法有采用模拟滤波器、傅里叶分析进行谐波分析、基于瞬时无功功率理论的方法等。当关键负载ZC为电流源型非线性负载时,电路原理图如图7所示,由于电流源型非线性负载可以等效为谐波电流源,关键负载电流ic便会含有谐波分量,导致输电线电流is和母线电压VS同样会含有谐波分量,导致供电质量的严重下降,对用电设备的正常工作造成影响。分别为流过线路阻抗、非关键负载、关键负载的电流,

FPGA/MATLAB学习教程/源码/项目合作开发 1631

基于物联网的门禁与考勤系统(阿里云)_81

本课题设计的基于物联网的门禁与考勤管理系统,结合现代信息技术,利用指纹识别、射频卡、密码输入和远程控制等多种开锁方式,提升门禁系统的安全性和灵活性;同时,通过物联网平台进行数据上传和远程管理,极大提高了管理效率。通过智能化的考勤功能,系统可以实时记录员工的出入情况,并通过云平台进行远程查询和管理,推动门禁与考勤管理的数字化、智能化和高效化。

1万+

React Fiber

React Fiber

qq_43539854的博客 1138

极智AI | 谈谈为什么卷积加速更喜欢 NHWC Layout

本文主要讨论一下为什么卷积加速更加喜欢 NHWC 的数据排布。

极智视界 2970

解决HBuilder中引入高德地图AMapUI报错的问题

将高德地图官网的代码拷贝到HBuilder后,运行一直报错: [ERROR] : ReferenceError: Can’t find variable: AMapUI 要解决此问题,只需将示例代码中的script的src路径添加https: &amp;lt;script type=&quot;text/javascript&quot; src=&quot;https://webapi.amap.com/maps?v=...

Puzhi的专栏 4305

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

react ant design tree 虚拟滚动 导致Forced reflow

【代码】react ant design tree 虚拟滚动 导致Forced reflow。

1173

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

vue3 常见的警告记录

解决办法:追加404页面的设置 path: "/:catchAll(.*)"即可 不知道为啥!解决办法: 里的strech前面加上:即可。正确:

sinat_38992528的博客 2115

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

requestAnimationFrame

复盘字节加面,希望这次加面能过,加油!!! 实现动画效果的方法有: 1.CSS3:transition,animation 2.JS:setTimeout 3.HTML: requestAnimationFrom setTimeout:容易出现卡顿、抖动的现象。原因是:1、settimeout任务被放入异步队列,只有当主线程任务执行完后才会执行队列中的任务,因此实际执行时间总是比设定时间要晚;2、settimeout的固定时间间隔不一定与屏幕刷新时间相同,会引起丢帧。 requestAnimat

Dreamlandz的博客 775

Web API中的requestAnimationFrame

requestAnimationFrame 适合需要高精度控制和动态调整的复杂动画。CSS 动画适合简单的、预定义的动画效果,特别是那些需要高性能且不需要频繁调整的场景。例如,可以使用 rAF处理复杂的交互逻辑,而使用 CSS 动画处理简单的视觉效果。

2301_79980806的博客 1330

requestAnimationFrame,读懂这篇文章就够了

requestAnimationFrame 请求动画帧; 它是一个浏览器的宏任务; requestAnimationFrame的用法与setTimeout很相似,只是不需要设置时间间隔而已。requestAnimationFrame使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。它返回一个整数,表示定时器的编号,这个值可以传递给cancelAnimationFrame用于取消这个函数的执行

知之为知之,不知为不知 2338

【转载】深入理解 requestAnimationFrame

https://blog.youkuaiyun.com/vhwfr2u02q/article/details/79492303 来源:一像素www.cnblogs.com/onepixel/p/7078617.html在Web应用中,实现动画效果的方法比较多,Javascript 中可以通过定时器 setTimeout 来实现,css3 可以使用 transition 和 animation 来...

mus-z的博客 475

深入理解定时器系列第二篇——被誉为神器的requestAnimationFrame

前面的话   与setTimeout和setInterval不同,requestAnimationFrame不需要设置时间间隔。这有什么好处呢?为什么requestAnimationFrame被称为神器呢?本文将详细介绍HTML5新增的定时器requestAnimationFrame   引入   计时器一直是javascript动画的核心技术。而编写动画循环的关键是要知道延迟时间多长合适...

weixin_34067980的博客 367

Particles.js的销毁函数

在vue的登录界面使用了Particles.js作为背景,跳转界面后发现页面卡顿,原因是组件销毁后,但是没有销毁Particles实例,就会造成页面不停地重绘,页面就会很卡顿,可以通过刷新解决,但刷新不是长久之计。[Violation] 'requestAnimationFrame' handler 用时 毫秒。其实只需要直接销毁实例就可以,Particles.js的源码就写了出来。

Kaerwei的博客 679

浅谈浏览器动画与requestAnimationFrame

浏览器动画的实现是通过在一定频率下重新渲染得到的,每一帧都间隔相同的时间。在CSS动画中,浏览器知道动画的开始和每一帧的时间间隔,所以动画的效果很流畅。但在用JS实现的动画中,一般用定时器实现时,存在着时间间隔并不可靠的问题,如果线程里有其他任务存在,定时器执行任务的时间间隔并不一定能保证是自己设定的数值;这样容易导致动画产生延迟停滞,效果大打折扣; 为了解决这个问题,引入了requestAn...

mxydl2009的博客 427

高德地图JSAPI报错:[Violation] ‘requestAnimationFrame‘ handler took 125ms

先说下我遇到的问题,vue3中使用高德地图绘制线路的时候,很卡掉帧,还报警告[Violation] ‘requestAnimationFrame’ handler took 125ms。解决方法就是不把map实例存到reactive或者ref中,使用shallowRef来存。

zjh_hhh的博客 508

requestAnimationFrame用法

在Web应用中,实现动画效果的方法比较多,Javascript 中可以通过定时器 setTimeout 来实现,css3 可以使用 transition 和 animation 来实现,html5 中的 canvas 也可以实现。除此之外,html5 还提供一个专门用于请求动画的API,那就是 requestAnimationFrame,顾名思义就是请求动画帧。 一、相关概念 为了理解 requestAnimationFrame 背后的原理,我们首先需要了解一下与之相关的几个概念: 1. 页面可见..

hmily43的博客 2530
上一篇: 如何安装cpolar内网穿透工具?
下一篇: 解决一下 WebView2 不能用 socket5代理的问题。
cmdos
博客等级 码龄19年 83粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值