作者 | 王瑞平
审校 | 云昭
51CTO读者成长计划社群招募,咨询小助手(微信号:TTalkxiaozhuli)
好消息,页游要重新崛起了!Web上有望产生3A游戏大作了!
经过6年持续不断的开发,Chrome团队于当地时间4月6日发布Web GPU。它是一种新型的API,可以让Web应用程序更多地访问你的显卡功能,能够被用来在网络上进行高性能3D图形和数据并行计算。
当日,Chrome团队还激动地宣布:“Web GPU可以在Chrome 113中默认可用,目前仍处于Beta测试阶段。”
具体来讲,Web GPU能够显著降低相同图形规模下JavaScript的工作负载量。不仅如此,它还将机器学习模型的效率提升了3倍以上。相较于前几年发布的WebGL版本,新的WebGPU具有灵活GPU编程和高级功能访问能力。
顺便说一句,WebGPU的初始版本能够在ChromeOS、macOS和Windows上使用,对其它平台的支持功能将在今年晚些时候推出。
众所周知,所有显卡在使用之前都要安装对应的驱动程序,只有显卡驱动程序与应用程序以图形API的形式互联,才能让显卡完成图形渲染与并行计算等工作。
WebGPU的初始版本可在Chrome 113、支持Vulkan的ChromeOS设备、支持Direct3D 12的Windows设备和macOS上使用。而且,Linux、Android以及对现有平台的扩展支持将很快推出。除了Chrome的初始实现外,Web GPU目前还可以在Firefox和Safari中运行。这标志着正式迈入大浏览器时代。
从专业的角度来讲,Chromium能够通过Dawn模块实现Web GPU的API。Dawn中的DawnNative模块与3大图形API沟通,向上为DawnWire模块传递信息。DawnWire模块与JavaScript API沟通,通过C++语言实现最终的API。
FireFox则用Rust语言以及与Dawn类似模块实现Web GPU的API。Safari是通过更新WebKit实现的API。
WebGPU是一种新的Web API,它公开了现代硬件功能并允许在GPU上进行渲染和计算操作,类似于Direct3D 12、Metal和Vulkan。与API的WebGL系列不同,WebGPU提供对更高级GPU功能的访问,并为GPU上的一般计算提供一流的支持。
与Direct3D12、Metal和Vulkan相似的是,Web GPU允许在GPU上进行渲染和计算操作。具体来讲,Web GPU作为前些年Web GL的升级版,不仅使用户能够访问更高级GPU,还为GPU上的一般计算提供高级支持。
不仅如此,该API在设计时充分考虑Web平台的特点,开发出符合用户习惯的JavaScript API与Promises 集成、支持导入视频和完备错误提示信息的完善开发者体验。
未来,Web GPU的初始版本将被用作更新和增强功能的构建模块。同时,该API也将提供更高级的图形功能,并鼓励开发人员申请其它功能。
此外,Chrome团队还计划在“Web GPU着色语言”中进行更多的机器学习优化和额外的人体工程学调整,从而能够对着色器核心进行深入访问。
那么,旧版本的WebGL与WebGPU在性能与参数方面究竟有何差异?在渲染性能上,WebGL比WebGPU快3倍以上。在计算性能上,WebGPU比WebGL快50倍以上。
在参数方面,WebGL的请求参数简单,主要包括性能参数和功能参数。而WebGPU分成两个阶段,请求适配器时可以对性能作要求,请求设备对象时可以对GPU各个方面的参数作校验,确定是否满足程序要求。
此外,WebGL的CPU开销比WebGPU更高,因此使用WebGPU实现相同的渲染工作负载可能会更节能,即使GPU本质上是在做同样的工作。
总之,WebGPU是一个精确的图形API,完全释放出显卡的能力,减轻了浏览器开发者的负担,有别于WebGL这样的上层API。
Web GPU可以更好地在线程中执行多种与现代图形API相关的渲染任务,包括:在线程中更新资源(如更新buffer)、并行地编译shader、并行地创建pipeline state、在线程中创建command buffer等。
目前,有两种方法实现多线程:第一种方法是通过OffscreenCanvas API,实现主线程与渲染线程分离;第二种方法是创建worker,在worker中执行WebGPU相关的渲染任务。
具体来讲,WebGPU用Pipeline Object设置渲染管线中的相关信息分为两个阶段:“记录命令”和“提交命令”。“记录命令”是一个纯CPU进程,可以分别记录在多个Worker(多线程)中,然后提交到同一个队列中。“提交命令”就是让GPU根据队列中的命令顺序执行任务。
通过多线程,Web GPU上下文可以由多个工作人员共享。这些worker只要在时间线上没有互斥操作都可以正常运行。这无疑带来了良好的开发体验。
此外,Web GPU还体现出强大的通用计算能力,通过计算着色器,使用GPU中 CU(Compute Unit,计算单元)旁边的共享内存,速度比普通的显存速度快得多。
总的来讲,Web GPU可以减少CPU开销,提供对多线程的良好支持,使用计算着色器将通用计算的强大功能引入Web,未来,还将支持“实时光线追踪”技术。
那么,从用户层面来讲,Chrome支持Web GPU会带来哪些全新的体验变化呢?
由于WebGPU的显卡被开放,便于浏览器直接运用GPU完成各种操作命令,成功实现3D图形渲染能力质的飞跃。此外,它还便于开发者为浏览器编写“更酷炫”的游戏,大幅度提升页游画面表现。

WebGPU落地的最大意义还是在于人工智能方面。根据谷歌的说法,WebGPU改变了“机器学习模型”。例如,有了WebGPU,浏览器直接就能借助NVIDIA显卡调用AI绘画所需要的算力和功能。Stable Diffusion的本地化部署可能就真的只用动动鼠标就行。
未来,WebGPU一定能在Web端释放现代图形处理器(GPU)的强大能力,无论是页游,亦或是通用并行计算带来的机器学习与AI能力。
值得一提的是,Web GPU是W3C“Web GPU”社区小组共同努力的结果。不乏来自Mozilla、苹果、英特尔和微软等大公司的贡献。从2017年开始设计以来,经过6年的开发(90位贡献者、2000次提交、3000个问题),团队终于实现Web GPU在Chrome中可用,也可支持Firefox和Safari。
无论是Chrome的Dawn库,还是Firefox的WGPU库均可作为独立包使用。它们还具有可移植性和人体工程学层,抽象出GPU API操作系统。在本机应用程序中使用这些库时,开发者还可以更容易地通过Emscripten和Rust web-sys移植到WASM。
幸运的是,许多广泛使用的WebGL库已经与WebGPU实现兼容。如果要切换WebGPU可能只需要进行一行配置。具体来讲,Babylon.Js已经完全支持WebGPU、PlayCanvas可初步支持WebGPU、TensorFlow.Js支持大多数操作符的WebGPU优化版本、Js WebGPU支持正在实现。
一位自称参与WebGPU开发的谷歌内部人士称:这是一个巨大的里程碑。早在他开发高级2D渲染器vello时,就意识到WebGPU会成为游戏规则的改变者。有了它之后,我们可以在任何地方都运行起相当现代的基础架构:Web、Windows、Mac、Linux、ChromeOS、iOS和Andriod。
此外,他还指出,通过WebGPU,运行机器学习负载的性能在1.0版本中有所不足,但想要赶上本地运行只是一个工程问题,完全可以实现的。
同时,他还爆料WebGPU团队正在开发本地扩展,以期实现人人想要的Bindless,有助于推动Web标准化。
Reddit上不少网友对于现在才推出WebGPU感到有些遗憾。“移动网络上GPU加速更常见的用例是2D游戏。即使在低端设备上,使用Pixi类似的东西,就已经足够快了。”
也有人认为有了WebGPU之后,PC或者桌面可能回到90年代的流行度。

还有一位前端网友认为,WebGPU没有囊括“现代图形API设计”的重要发展方向:无绑定(Bindless)、网格着色器、光线追踪、灵活的管道状态等等,这些WebGPU目前都没有出现。因此他感叹:WebGPU是不是来得有点晚了!
正如上文所说,WebGPU的发布,将会给PC带来翻盘的可能。但目前WebGPU表示基准是桌面+移动设备都支持,但未来的扩展应该支持仅限桌面的用例。
也许,PC作为AI技术最为前沿和先进的载体,WebGPU的出现,再加上WASM和Rust的后端支持,超越“小程序时代”的“大浏览器时代”即将来临!
https://www.theverge.com/2023/4/6/23673462/google-webgpu-chrome-113-api-machine-learning
https://blog.csdn.net/qq_43479892/article/details/122505601
https://developer.chrome.com/blog/webgpu-release/

我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
使用ruby的watir测试网络应用程序时,浏览器最后会保持打开状态。网上的一些建议是,要进行真正的单元测试,您应该在每次测试时(在拆卸调用中)打开和关闭浏览器,但这很慢而且毫无意义。或者他们做这样的事情:defself.suites=superdefs.afterClass#Closebrowserenddefs.run(*args)superafterClassendsend但这会导致摘要输出不再显示(诸如“100次测试、100次断言、0次失败、0次错误”之类的内容仍应显示)。我怎样才能让ruby或watir在我的测试结束时关闭浏览器? 最佳答案
如何检查浏览器控制台是否有错误?例如,我用Selenium开发了浏览器(chrome或firefox),我用SeleniumWebDriver做了一些操作。之后我想知道Web控制台中是否有任何错误。 最佳答案 我试着像这样处理控制台错误:defcheck_console_logconsole_log=@browser.driver.manage.get_log(:browser)ifconsole_log!=nilraise(console_log)endend并将其记录到文件中defwrite_log(file_path)work
是否有一个SASS扩展可以采用SASS样式表,找到中性属性(例如border-radius)并为其输出所有特定于供应商的属性(例如-webkit-border-radius等)自动?我真的不想手动创建所有混入,也不想手动编写代码。我确定一定有这样的扩展名,但我找不到它。帮忙? 最佳答案 有一个非常好的gem可以满足您的需求。它叫做Bourbon它不会用特定于供应商的css替换您的css,因为它可以像SASS一样工作。它基本上是一个正确生成跨浏览器css的mixin集合。 关于ruby-用
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
我正在尝试向浏览器发送多个文件。我不能像下面的代码一样为每条记录调用send_data,因为我收到双重渲染错误。根据thispost我需要创建文件并压缩它们,以便我可以在一个请求中发送它们。@records.eachdo|r|ActiveRecord::Base.include_root_in_json=true@json=r.to_jsona=ActiveSupport::MessageEncryptor.new(Rails.application.config.secret_token)@json_encrypted=a.encrypt_and_sign(@json)send_da