作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
迈克尔•科尔
验证专家 在工程

Michael是一位专业的全栈网络工程师, 演讲者, 拥有20多年经验和计算机科学学位的顾问.

专业知识

以前在

恩斯特 & 年轻的
分享

一股巨大的技术浪潮已经到来——虚拟现实(VR). 你第一次拿着智能手机的感觉, 第一次体验虚拟现实可以在计算的各个方面提供更丰富的情感体验. 从第一代iPhone到现在才过去了12年. 作为一个概念, VR出现的时间甚至更长, 但直到最近,将VR带给普通用户所需的技术才出现.

眼睛的追求是Facebook的虚拟现实消费游戏平台. 它的主要特点是不需要个人电脑. 它提供了一种无线、移动的VR体验. 你可以在咖啡店里递给别人一个VR头显,让他们分享一个3D模型,就像在谈话中用谷歌搜索一样尴尬, 然而,共享体验的回报更引人注目.

VR将改变我们工作、购物、享受内容的方式,等等.

在本系列中, 我们将探索当前支持WebVR和浏览器边缘计算的浏览器技术. 第一篇文章重点介绍了这些技术和我们模拟的架构.

在接下来的文章中,我们将重点介绍代码中的一些独特挑战和机遇. 为了探索这项技术,我制作了一个Canvas和WebVR演示,并在GitHub上发布了代码.

ALT_TEXT

VR对用户体验意味着什么

作为一个 Toptal开发人员,我帮助企业将项目从想法转变为用户测试. 那么VR是如何与商业网络应用相关联的呢?

娱乐内容将引领虚拟现实的发展(就像它在移动领域所做的那样). 然而, 一旦VR像手机一样成为主流, “vr优先设计”将是预期的体验(类似于“移动优先”).

“移动优先”是一种范式转变, “离线优先”是当前的一种模式转变, “虚拟现实优先”即将到来. 对于设计师和开发者来说,这是一个非常激动人心的时刻, 因为VR是一种完全不同的设计范式(我们将在本系列的最后一篇文章中对此进行探讨)。. 如果你做不到这一点,你就不是VR设计师 控制.

VR始于个人电脑(PC)革命,但作为移动革命的下一个阶段而到来. Facebook的 眼睛的追求 使用高通骁龙835系统级芯片(SoC)在Google Cardboard上构建, 头戴式跟踪(使用移动摄像头), 并在安卓系统上运行——所有这些都是包装好的,可以舒适地安装在你脸上柔软的感官上.

价值400美元的眼睛的追求拥有我可以与朋友分享的奇妙体验. 1000美元的新款iPhone不会再给人留下深刻印象. 人类是不会放弃虚拟现实的.

VR行业应用

VR开始在许多行业和计算领域发挥作用. 除了内容消费和游戏, 哪些会得到媒体的大量报道, VR正在慢慢改变从建筑到医疗保健等行业.

  • 建筑与房地产 以非凡的成本创造物理现实的价值(与数字相比), 因此,对于建筑师和房地产经纪人来说,带客户通过虚拟现实来展示体验是一个很自然的选择. VR为你价值2亿美元的体育场提供“beta测试”,或者通过电话进行虚拟演练.
  • 学习与教育 在虚拟现实中传达的体验,否则无法复制的图像或视频.
  • 汽车 公司从VR中获益,从 设计与安全 培训和市场营销.
  • 医疗保健 斯坦福大学露西尔·帕卡德儿童医院的专业人员一直在使用虚拟现实技术来计划心脏手术, 让他们在做一个切口之前了解病人的解剖结构. VR也正在取代缓解疼痛的药物.
  • 零售,市场营销和酒店 已经提供产品和地点的虚拟旅游. 随着零售商开始明白他们的购物体验有多吸引人, 零售革新者将给实体店的购物棺材钉上最后一颗钉子.

随着技术的进步,我们将看到越来越多的行业采用这种技术. 现在的问题是,这种转变将以多快的速度发生,哪些行业将受到最大的影响.

VR对网络和边缘计算意味着什么

“边缘计算”将计算移出主应用程序服务器集群,更接近最终用户. 它在市场上很受欢迎,因为托管公司迫不及待地想在每个城市为你租一台低延迟的服务器.

B2C边缘计算的一个例子是谷歌 视距服务, 在谷歌服务器上运行CPU/GPU密集型游戏工作负载的游戏, 然后将游戏发送到Netflix等设备. 任何愚蠢的Netflix Chromebook都可以像高端游戏电脑一样玩游戏. 这也为紧密集成的整体多人游戏创造了新的架构选择.

一个B2B边缘计算的例子是 Nvidia的网格该公司为廉价的Netflix类设备提供支持Nvidia gpu的虚拟远程工作站.

问题: 为什么不把边缘计算从数据中心转移到浏览器呢?

浏览器边缘计算的一个用例是计算机的“动画渲染农场”,通过将一天的过程分解成数千台计算机可以在几分钟内处理的块来渲染3D电影.

等技术 电子NW.js 将web编程引入桌面应用程序. 新的浏览器技术(比如PWA)正在将web应用程序分发模型(SaaS就是关于分发的)带回桌面计算. 例子包括SETI@Home、Folding@Home(蛋白质折叠)或各种渲染农场等项目. 而不必下载安装程序, 现在只要访问网站就可以加入计算农场.

问题: WebVR是一个“真实的东西”,还是VR内容会被挤进“应用商店”和“围墙花园”?

作为一名Toptal自由职业者和技术专家,我的工作就是了解. 所以我做了一个技术原型来回答我自己的问题. 我发现的答案是非常令人兴奋的,我写了这个博客系列与你分享.

剧透: 是的,WebVR确实存在. 是的, 浏览器边缘计算可以使用相同的API来访问支持WebVR的计算能力.

写起来很有趣! 让我们构建一个概念验证

为了验证这一点,我们将对n体问题进行天体物理学模拟.

天文学家可以用方程来计算两个物体之间的引力. 然而, 有三个或更多物体的系统没有方程, 不方便的是,已知宇宙中的每一个系统. 科学!

而n体问题没有解析解(方程), 它确实有一个计算解决方案(算法), 也就是O(n²). O(n²)几乎是最坏的情况, 但这是得到我们想要的东西的方法, 以及为什么大0符号会被发明出来.

O (n²)性能

图2: “向上,向右? 我不是工程师,但我觉得性能不错!”

如果你要掸掉你的 大O技能, 记住,大O符号衡量算法的工作是如何根据它所操作的数据的大小“扩展”的.

我们收集的是模拟中的所有尸体. 添加一个新物体意味着为集合中每个现有物体添加一个新的两物体重力计算.

While our inner loop is < n, it is not <= O(log n), so the whole algorithm is O(n²). 这些都是休息时间,没有额外的学分.

 for (let i: i32 = 0; i < numBodies; i++) {                       // n
    // Given body i: pair with every body[j] where j > i
    for (let j: i32 = i + 1; j < numBodies; j++) {               //  ½ n is > log n, so n.
      //计算物体相互作用的力
      东西=东西
    }
}

n体解决方案也让我们进入了物理/游戏引擎的世界,并探索了WebVR所需的技术.

对于我们的原型,一旦我们建立了模拟,我们会做一个 二维可视化.

最后,我们将把Canvas可视化替换为 WebVR版本.

如果你没有耐心,你可以直接跳到项目 code.

Web Workers, WebAssembly, AssemblyScript, Canvas, Rollup, WebVR, afframe

系好安全带,迎接动感十足的旅程, 充满乐趣的嬉戏,通过集群的新技术已经出现在你的现代移动浏览器(对不起, 不是你的Safari):

  • 我们将使用 Web Workers 将模拟移到自己的CPU线程中,从而提高感知和实际性能.
  • 我们将使用 WebAssembly 在高性能(C/ c++ /Rust/AssemblyScript等)中运行O(n²)算法.)在那个新线程中编译代码.
  • 我们将使用 Canvas 在2D中可视化我们的模拟.
  • 我们将使用 卷起来,大口喝 作为Webpack的轻量级替代品.
  • 最后,我们将使用 WebVRAframe 为你的手机创造一个虚拟现实.

在深入代码之前的餐巾架构

我们将从Canvas版本开始,因为您可能正在工作中阅读这篇文章.

帆布版本

在前几篇文章中, 我们将使用现有的浏览器api来访问创建CPU密集型模拟所需的计算资源,而不会降低用户体验.

然后, 我们将在浏览器中使用Canvas将其可视化, 最后使用afframe将我们的Canvas可视化转换为WebVR.

API设计和仿真回路

我们的n体模拟利用重力预测天体的位置. 我们可以用一个方程精确地计算出两个物体之间的力, 而是为了计算三个或更多物体之间的力, 我们需要将模拟分解成小的时间片段并进行迭代. 我们的目标是30帧/秒(电影速度)或~33毫秒/帧.

为了获得方向感,下面是对代码的快速概述:

  1. 浏览器获得的 指数.html
  2. 运行 main.js 如下面的代码. 的 进口使用Rollup (Webpack的替代品)来处理这些问题.
  3. 它创建了一个新的nBodySimulator()
  4. 它有一个外部API:
    1. sim卡.addVisualization ()
    2. sim卡.addBody ()
    3. sim卡.start ()
/ / src / main.js

导入{nBodyVisPrettyPrint, nBodyVisCanvas}./ nBodyVisualizer”
进口 {Body, nBodySimulator}./ nBodySimulator”

窗口.Onload = function() {
  //创建模拟
  const sim卡 = new nBodySimulator()
  
  //添加一些可视化工具
  sim卡.addVisualization(新nBodyVisPrettyPrint(文档.getElementById(“visPrettyPrint”)))
  sim卡.addVisualization(新nBodyVisCanvas(文档.getElementById(“visCanvas”)))
  
  //这是一个模拟,使用自以为是的G = 6.674e-11
  //如此无聊的价值观被允许,并创造了数十亿年后崩溃的系统.

  //对于spinny,距离=1,质量为1e10是有趣的.

  //设置Z轴为1,以获得最佳的可视化效果.
  //哈哈,创造稳定的宇宙是很难的
  //名称颜色x y z m vz vy vz
  sim卡.addBody(new Body("star", "yellow", 0,0,0,1e9))
  sim卡.addBody(new Body) ("hot jupiter", "red", - 1,1,0,1e4;  .24,  -0.05,  0))
  sim卡.addBody(new Body) ("cold jupiter", "purple", 4,4, -).1,   1e4, -.07,   0.04,  0))
  //一对遥远的小行星固定画布的可视化位置.
  sim卡.addBody(new Body("asteroid", "black", -15, -15, 0,0))
  sim卡.addBody(new Body("asteroid", "black", 15,15,0,0)))

  //启动模拟
  sim卡.start ()
  
  //添加另一个
  sim卡.addBody(new Body) ("saturn", "blue", -8, -8,  .1,   1e3,   .07,   -.035,  0))

  //这就是我为创造一个稳定的太阳系所做的努力.

  //我们现在可以在这个系统中通过扔一些碎片(内部植物).
  //因为这些碎片的质量要小得多, 它不会扰乱我们稳定的系统(希望:)
  //这就要求我们移除那些飞出我们的界外的天体,这些天体是由小行星创造的30x30空间.
  //参见sim卡卡.trimDebris (). 它有点粗糙,但我的客户(我)不想花钱,想要WebVR版本.

  函数r和o(scale) {
    返回(数学.随机()-.5) *刻度
  }

  文档.getElementById(“混乱”).addEventListener('click', () => {
    for (let x=0; x<10; x++) {
      sim卡.addBody(new Body)(“碎片”,“白色”,随机(10),随机(10),随机(10),1,随机(.1)、金兰(.1)、金兰(.1)))
    }
  })

}

这两颗小行星的质量为零,因此不受重力的影响. 他们将我们的2D可视化放大到至少30x30. 最后一点代码是我们的“混乱”按钮,用于添加10个小的内行星,以获得一些旋转的乐趣!

接下来是我们的“模拟循环”——每33毫秒,重新计算和重新绘制. 如果你从中获得乐趣,我们可以称之为“游戏循环”.“实现我们的循环最简单的方法是 setTimeout () ——这就达到了我的目的. 另一种选择是 requestAnimationFrame ().

sim卡.start () 通过调用开始动作 sim卡.步骤() 每33毫秒(约每秒30帧).


// nBodySimulator类中的方法

  //模拟循环
  start () {
    //这是模拟循环. Step()调用可视化()
    Const 一步 = 这.一步.bind ()
    setInterval(步骤,这.sim卡ulationSpeed)
  }

  //模拟循环中的一个步骤.
  异步步骤(){
    //如果worker没有准备好,跳过计算. 每33ms (30fps)运行一次,所以可能会有跳跃.
    如果(这.准备好()){
      等待这.calculateForces ()
    } else {
      控制台.日志(“跳过:${这.workerReady}, ${这个.workerCalculating}”)
    }
    //移除任何超出边界的“碎片”——这是针对按钮的
    这.trimDebris ()

    //现在更新力. 如果我们跳过上面的calculateForces (),可以重用旧的力
    这.applyForces ()

    / /好!
    这.可视化()
  }

华友世纪! 我们正在从设计走向实现. 我们将在WebAssembly中实现物理计算,并在单独的Web Worker线程中运行它们.

nBodySimulator包装了实现的复杂性,并将其分成几个部分:

  1. calculateForces () 承诺计算要施加的力.
    1. 这些主要是在WebAssembly中完成的浮点操作.
    2. 这些计算是O(n²),是我们的性能瓶颈.
    3. 我们使用Web Worker将它们移出主线程,以获得更好的感知和实际性能.
  2. trimDebris () 删除任何不再有趣的碎片(并且会缩小我们的可视化). O(n)
  3. applyForces () 将计算出的力应用到物体上. O(n)
    1. 如果因为工作线程已经很忙而跳过calculateForces (),我们就会重用旧的力. 这提高了感知性能(消除抖动),但代价是准确性.
    2. 主UI线程可以绘制旧的力,即使计算时间超过33ms.
  4. 可视化() 将物体数组传递给每个可视化器进行绘制. O(n)

这一切都发生在33毫秒内! 我们可以改进这个设计吗? 是的. 好奇还是有建议? 请查看下面的评论. 如果您正在寻找先进的现代设计和实现,请查看开源 事.js.

发射!

我很高兴创造这个,我很高兴与你分享. 待会儿见!

  1. 介绍-这个页面
  2. Web Workers——访问多个线程
  3. WebAssembly -浏览器计算没有JavaScript
  4. Rollup和Gulp——WebPack的替代品
  5. 画布-绘制到画布API和“sim卡循环”
  6. WebVR -将我们的画布可视化器换成WebVR和Aframe

娱乐将引领虚拟现实内容(如手机), 但一旦VR成为常态(比如手机), 它将是预期的消费者和生产力体验(如移动).

我们从未像现在这样有能力创造人类体验. 对于设计师和开发者来说,没有比这更令人兴奋的时刻了. 忘掉网页吧——我们将构建世界.

我们的旅程从卑微的网络工作者开始,所以请继续关注我们WebVR系列的下一部分.

了解基本知识

  • VR是如何工作的?

    当一个人把屏幕绑在脸上时,VR就发生了, 创造一种身临其境的体验,让他们“假装”自己真的在那里.

  • 什么是基于Web的VR?

    基于网络的虚拟现实利用了广告的奇异现实性, 搜索引擎优化排名, 猫的表情包(通俗地说就是“网络”)让虚拟现实更贴近人类的心灵, 但在僵化的“信息是书中的一页”范式之外. WebVR是虚拟现实公域.

  • 什么浏览器支持VR ??

    不带水肺装备的水肺潜水被称为溺水或浮潜. 和水肺一样,VR也是一项“装备运动”,所有装备都支持WebVR. 在购买高质量的无线VR耳机(400美元)之前,卢德分子可以在1500美元的台式机或700美元的手机上使用任何现代网络浏览器来“2D浮潜”VR。.

  • 边缘计算是什么意思?

    “边缘计算”是在租用新设备之前,利用运行应用程序的所有边缘设备的计算能力.

聘请Toptal这方面的专家.
现在雇佣
迈克尔•科尔

迈克尔•科尔

验证专家 在工程

达拉斯,美国

2014年9月10日成为会员

作者简介

Michael是一位专业的全栈网络工程师, 演讲者, 拥有20多年经验和计算机科学学位的顾问.

作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

专业知识

以前在

恩斯特 & 年轻的

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

Toptal开发者

加入总冠军® 社区.