当前位置: 首页 > Web前端 > HTML

【WebVR系列文章(一)】WebVR与浏览器边缘计算革命

时间:2023-03-28 17:15:11 HTML

虚拟现实(VR)正在进入各个行业,但尚未成为主流。WebVR和边缘计算有可能提高VR的采用率并将VR带给更广泛的受众。在本系列文章中,我将通过详细示例向您介绍WebVR和边缘计算的基础知识。虚拟现实(VR)是一股巨大的技术浪潮,它已经到来。无论您第一次握住智能手机时的感受如何,当您第一次体验VR时,您的计算机都会在各个方面提供更丰富的情感体验。作为一个概念,VR的出现时间比第一代iPhone还长,但将VR带给普通用户所需的技术直到最近才问世。OculusQuest是Facebook的VR消费游戏平台。它的主要特点是不需要PC。因为它提供了无线、移动的VR体验。你可以给某人一个VR耳机,让他在咖啡店分享3D模型,虽然这样做就像在谈话中使用谷歌搜索一样尴尬,但分享体验的回报却更具吸引力。因此,我可以看到VR正在改变我们工作、购物、分享内容等的方式。在本系列中,我们将探讨支持WebVR和浏览器边缘计算的当前浏览器技术。本文重点介绍这些将要用到的相关技术。为了探索这项技术,我制作了一个Canvas和WebVR演示。VR对用户体验意味着什么?就像在移动设备上一样,娱乐内容将导致虚拟现实技术的采用。不过,一旦VR像手机APP一样成为主流,业内可能会出现一种说法:“VRFirst”,即VR先行。对于设计人员和开发人员来说,这是一个非常激动人心的时刻,因为VR是一种完全不同的设计范式。VR始于个人计算(PC)革命,但正在成为移动革命的下一步。Facebook的OculusQuest基于GoogleCardboard使用Qualcomm的Snapdragon835片上系统(SoC)、耳机跟踪(使用移动摄像头)构建,并在Android上运行。所有这些技术都被封装起来,可以舒适地贴合在您脸部柔软的感觉器官上。VR的行业应用VR开始出现在许多行业和计算领域。除了经常获得媒体报道的内容消费和游戏之外,VR正在慢慢改变从建筑到医疗保健的行业。建筑和房地产以非凡的成本创造了物理现实的价值,因此建筑师和房地产经纪人非常适合通过虚拟现实展示客户体验。学习和教育中的VR可以传达无法通过图像或视频复制的体验。汽车公司也从设计和安全到培训和营销的方方面面受益于VR。斯坦福大学LucillePackard儿童医院的医疗保健专业人员一直在使用VR来规划心脏手术,让他们能够在进行单个切口之前了解患者的解剖结构。VR也正在取代药物来缓解疼痛。零售、营销和酒店业也为客户的虚拟旅游提供产品和场所。随着技术的进步,我们将看到越来越多的行业采用VR。现在的问题是这种转变将以多快的速度发生,哪些行业将受到最大影响。VR对Web和边缘计算意味着什么“边缘计算”正在将计算从您的主要应用程序服务器集群转移到更接近您的最终用户。这种技术引起了市场热议,因为托管公司迫不及待地想在每个城市为您租用低延迟服务器。例如,在B2C边缘计算中,谷歌的Stadia服务就是其中之一,它在谷歌的服务器上运行CPU/GPU密集型游戏工作负载,然后将游戏发送到Netflix等设备。任何笨重的NetflixChromebook都能突然像高端游戏电脑一样玩游戏。在B2B边缘计算中,Nvidia的GRID可以提供廉价的类似Netflix的设备,以及由NvidiaGPU提供支持的虚拟远程工作站。问题:为什么不将边缘计算从数据中心转移到浏览器?答案是肯定的。浏览器边缘计算的一个例子是计算机的“动画渲染农场”,它通过将一天的过程分解成计算机可以在几分钟内处理的数千个块来渲染3D电影。Electron和NW.js等技术将Web编程带入了桌面应用程序。PWA等新的浏览器技术正在将Web应用程序分发模型带回桌面计算。用户现在无需下载安装程序,只需访问网站即可加入计算场。问题:WebVR是“真实的东西”吗?WebVR是真实的。浏览器端的边缘计算可以使用相同的API来访问支持WebVR的计算能力。为了对此进行测试,我将对N体问题进行天体物理模拟。N体问题是在经典力学下寻找具有已知初始位置、速度和质量的多个物体的后续运动。天文学家可以使用方程式来计算两个物体之间的引力。然而,对于具有三个或更多物体的系统没有方程,这对于已知宇宙中的每个系统来说都是不方便的。虽然n体问题没有解析方程,但它确实有一个计算解,即O(n2)。O(n2)几乎是最坏的情况。n-body解决方案还将我们带入了物理/游戏引擎的世界,并探索了WebVR所需的技术。WebWorkers、WebAssembly、AssemblyScript、Canvas、Rollup、WebVR、Aframe是现代移动浏览器中出现的一系列网络新技术。例如我们可以:使用WebWorkers模拟传输到它们自己的CPU线程,以提高感知和实际性能。使用WebAssembly提高编译后代码的运行效率。使用Canvas的2D视觉模拟。使用Rollup和Gulp作为Webpack的轻量级替代品。使用WebVR和Aframe为您的手机创建虚拟现实场景。API设计和模拟循环我们的n体模拟使用重力来预测天体的位置。我们可以使用方程来计算两个物体之间的精确力,但要计算三个或更多物体之间的力,我们需要将模拟分解成小的时间段并迭代。假设我们的目标是30fps(或~33ms/帧)。下面有这么一段index.html代码:

演示:WebAssembly+WebWorkers+Canvas

这个“n-body问题”是CPU密集型的,这个演示使用新的浏览器技术来突破硬件限制:WebAssembly,AssemblyScript、WebWorkers和Canvas。

太阳系=恒星+气态巨行星+“碎片”。这是一颗勉强稳定的恒星和3个气态巨行星。你能在不破坏气态巨行星稳定的情况下添加内行星吗?扔内行星碎片!-代码-3dWebVR版本

/body>这段代码中它运行了main.js://src/main.jsimport{nBodyVisPrettyPrint,nBodyVisCanvas}from"./nBodyVisualizer"import{Body,nBodySimulator}from"./nBodySimulator"window.onload=function(){//创建一个nBodySimulator实例constsim=newnBodySimulator()sim.addVisualization(newnBodyVisPrettyPrint(document.getElementById("visPrettyPrint")))sim.addVisualization(newnBodyVisCanvas(document.getElementById)("visCanvas")))//命名颜色xyzmvzvyvzsim.addBody(newBody("star","yellow",0,0,0,1e9))sim.addBody(newBody("hotjupiter","红色",-1,-1,0,1e4,.24,-0.05,0))sim.addBody(newBody("冷木星","紫色",4,4,-.1,1e4,-.07,0.04,0))sim.addBody(newBody("小行星","黑色",-15,-15,0,0))sim.addBody(newBody("小行星","黑色",15,15,0,0))sim.start()sim.addBody(newBody("土星","蓝色",-8,-8,.1,1e3,.07,-.035,0))functionrando(scale){return(Math.random()-.5)*scale}document.getElementById("mayhem").addEventListener('click',()=>{对于(letx=0;x<10;x++){sim.addBody(newBody("碎片","白色",rando(10),rando(10),rando(10),1,rando(.1),rando(.1),rando(.1)))}})}它创建了一个新的nBodySimulator()同时,这个nBodySimulator实例包含了一些API:sim.addVisualization()sim.addBody()sim。start()两颗小行星的质量为零,因此不受重力影响。他们将我们的2D可视化缩小到至少30x30。最后一段代码是添加10个小内行星的按钮事件得到!接下来是我们的“模拟循环”——每33毫秒,重新计算并重新绘制。如果您玩得开心,我们可以将其称为“游戏循环”。实现我们的循环最简单的方法可能是setTimeout()-这就是我想要的。另一种方法是requestAnimationFrame()。sim.start()通过每33毫秒(大约每秒30帧)调用sim.step()来启动操作。//nBodySimulator类的方法start(){conststep=this.step.bind(this)setInterval(step,this.simulationSpeed)}asyncstep(){if(this.ready()){awaitthis.calculateForces()}else{console.log(`Skipping:${this.workerReady},${this.workerCalculating}`)}this.trimDebris()this.applyForces()this.visualize()}我们将在WebAssembly中实现物理计算,并在单独的WebWorker线程中运行它们。nBodySimulator包装了此实现的复杂性并将其拆分为几个部分:calculateForces()承诺计算要应用的力。这些主要是浮点运算,在WebAssembly中完成。这些计算是O(n2)和我们的性能瓶颈。我们使用WebWorkers将它们从主线程中移出,以获得更好的感知和实际性能。trimDebris()移除任何不再有趣的碎片(并缩小我们的可视化)。O(n)applyForces()将计算的力应用于实体。O(n)如果我们跳过calculateForces(),我们会重用旧的力,因为工人已经很忙了。这会以准确性为代价提高感知性能(消除抖动)。即使计算时间超过33ms,主UI线程也能拉拢旧势力。Visualize()将一个对象数组传递给每个要绘制的可视化工具。O(n)这一切都发生在33毫秒内!我们可以改进这个设计吗?是的。好奇或有任何建议?检查下面的评论。如果您正在寻找尖端的现代设计和实现,请查看开源Matter.js。Endgame将引领虚拟现实(如移动)的内容,但一旦VR成为常态(如移动),它将成为预期的消费者和生产力体验(如移动)。我们从来没有比现在更有能力创造人类体验。成为设计师和开发人员从未如此激动人心。忘掉网页——我们将建设世界。我们的旅程从不起眼的WebWorker开始,敬请期待我们WebVR系列的下一部分。