关于渲染:选择渲染农场的几个标准

随着电影、电视剧等影视作品的制作越来越依赖于计算机特效,渲染农场的应用也变得越来越广泛。渲染农场是一种利用大量计算机图形处理器(GPU)来减速渲染过程的服务。在抉择渲染农场时,有几个规范能够帮忙您确定哪个农场是适宜您的我的项目。 性能和可靠性首先,您须要思考渲染农场的性能和可靠性。一些驰名的渲染农场,领有弱小的计算能力和稳固的渲染服务,能够确保您的我的项目按时实现。在抉择渲染农场时,请务必理解其性能和可靠性历史记录,以及它是否具备您须要的渲染能力和资源。 图像品质渲染农场的图像品质也是您须要思考的因素。一些渲染农场可能提供高质量的渲染,但速度较慢。另一些农场可能提供较快的渲染速度,但图像品质较差。在抉择渲染农场时,请务必理解其图像质量标准,并查看其样本或样片,以确定其是否合乎您的要求。 价格和免费形式渲染农场的免费形式和价格也是您须要思考的因素。一些渲染农场按需免费,即依据您应用的资源数量免费。另一些农场则按工夫免费,例如每小时多少钱。在抉择渲染农场时,请务必理解其免费规范和免费形式,并确保其合乎您的估算要求。 服务和反对渲染农场的客户服务和反对也是您须要思考的因素。一些渲染农场提供全天候的技术支持和客户服务,能够帮忙您解决在渲染过程中遇到的问题。在抉择渲染农场时,请务必理解其客户服务规范和反对形式,并确定其是否合乎您的需要。 可扩展性和灵活性您须要思考渲染农场的可扩展性和灵活性。您的我的项目可能在不同阶段须要不同数量的资源和计算能力。一个好的渲染农场应该可能轻松扩大其资源,以适应您的我的项目需要。在抉择渲染农场时,请务必理解其扩大能力和灵活性,并确定其是否合乎您的要求。 总之,在抉择渲染农场时,您须要思考多个因素。性能和可靠性、图像品质、价格和免费形式、服务和反对以及可扩展性和灵活性都是重要的规范。通过认真评估这些规范,您能够抉择到适宜您我的项目的最佳渲染农场,并确保您的我的项目可能按时实现并达到预期的成果。

September 19, 2023 · 1 min · jiezi

关于渲染:限时低至0028元核时火山引擎边缘渲染全面降价

火山引擎边缘渲染是基于边缘计算海量、弹性、低时延算力构建的渲染服务,反对百万级别渲染帧队列轻松编排、渲染工作就近调度、多节点并行渲染,助力影视、动画等行业晋升渲染效率,升高业务老本。 相比传统平台,火山引擎边缘渲染具备高效、平安、稳固等劣势: 并发渲染:反对百万渲染帧队列秒级调度,多任务、多节点并发渲染,反对算力资源弹性扩缩,解脱本地算力瓶颈,极大晋升渲染效率平安传输:反对 SSL 加密、断点续传,提供平安、稳固的数据传输能力,近场传输效率绝对核心最高可晋升9倍,保障高效文件传输高效存储:应用基于 NVMe SSD盘的分布式存储计划,领有超高I/O性能,轻松应答海量小文件并发读写,媲美用户本地文件加载速度 限时全面提价,低至0.028元/核时即日起火山引擎边缘渲染年度限时促销,CPU低至0.028元/核时,GPU低至1.4元/卡时,您能够轻松享受高性价比的优质云渲染服务! 同时,边缘渲染还推出年内包、年包、阶梯价格等多类型促销流动,您可抉择以最低价格购买年内包或年包,也可依据我的项目需要抉择最佳搭配,解决您不同场景应用诉求。 点击「这里」,体验超值渲染服务! 四大外围性能等你来体验 主动剖析:反对工程文件拖拽提交,零碎主动剖析并辨认渲染所需的资产文件。环境匹配:兼容支流三维图形软件和渲染器插件,反对渲染环境的灵便配置。渲染治理:涵盖从创立渲染工作、查看渲染进度、渲染后果的残缺渲染流程,反对灵便治理各环节。资产治理:反对渲染后果主动下载至本地,同时反对云端备份,实现文件资源跨设施共享。 超多优质服务教训,点击观看胜利案例边缘渲染为火山引擎3D动画宣传短片提供减速渲染效率的服务,在工期缓和的前提下,最终以晋升了20倍的效率实现了渲染工作。 优质高效渲染服务能力助力业务晋升渲染效率应用边缘渲染之前  火山引擎平台之前都是用本地机器进行渲染,一部CG短片须要20多天的渲染工夫,周期十分长。片子档期紧,须要机器数量大。 应用边缘渲染之后  火山引擎平台在接触边缘渲染后,体验了边缘渲染近场调度的劣势,同时应用1000+台机器同时渲染,提前了20天就实现了渲染工作,大大缩短了渲染周期。 火山引擎边缘渲染在影视、动画、游戏、特效、家装等多个场景落地,多样场景充沛满足您的需要。边缘渲染不仅能够缩短渲染周期,还能够在争取富裕工夫的根底上,反对客户逐渐调整成果再进行渲染,赶在档期前,实现高质量渲染。 优质高效渲染服务能力将助力您的业务晋升渲染效率,解脱资源解放! 点击「这里」,体验超值渲染服务! 对于火山引擎边缘云:火山引擎边缘云,以云原生技术为根底底座,交融异构算力和边缘网络,构建在大规模边缘基础设施之上的云计算服务,造成以边缘地位的计算、网络、存储、平安、智能为外围能力的新一代分布式云计算解决方案。

September 12, 2023 · 1 min · jiezi

关于渲染:3种渲染透明背景的方法

在大家工作的时候,会不会遇到3D设计中想渲染某几个物体的状况,想渲染模型PNG,从而把PNG图片使用在经营流动或者UI设计中的场景~而在这种状况下,你是不是不知所措,不晓得如何去做,祝贺你,本篇文章正好能够帮忙你把握这个技能。OC中的通明背景渲染共分为3种办法,每种办法所对应的场景需要都会有一些差别,三种办法各有劣势,大家能够依据本人的需要去抉择。通过本篇文章你能够学到:单个PNG模型的渲染带暗影,带环境光的PNG模型渲染多个物体的模型渲染废话不多说,咱们间接上干货~ 渲染通明背景的3种办法单个PNG模型的渲染1、点击OC设置,勾选“Alpha channel”2、点击渲染设置,在保留中勾选“Alpha通道”,抉择格局选项中的PNG3、实现PNG输入在输入过程中,背景始终是灰色,请不要狐疑,导入到PS中看看肯定是通明的PS中查看的通明图片 带暗影,带环境光的PNG模型渲染第二种办法咱们抉择用玻璃材质来做通明背景,因为玻璃材质是很通透的,它会受到环境光的影响,如何保障输入的玻璃与渲染的玻璃保持一致才是咱们所关怀的。1、先给物体一个高空,有暗影必须要有物体去承载2、而后再给高空一个材质,在材质专用中勾选“暗影捕获” 3、关上玻璃材质,勾选“影响Alpha”,玻璃变的更通透了 4、实现PNG输入,比照勾选“影响Alpha”的前后成果未勾选已勾选 多个物体的模型渲染1、别离给模型增加“Octane对象标签”2、在对象标签中,选中“对象图层”,别离给图层ID改为2和3 3、在渲染设置中,抉择OC渲染器,选中“渲染通道”,关上“启用”4、关上“渲染图层蒙版”中的ID2和ID35、增加文件保留地位,导出文件,抉择格局为PSD6、最终会导出一张PNG通明文件与PSD分层文件好了,以上是对于如何在OC中渲染通明背景的3种办法,心愿这篇文章对你在设计上有所帮忙。

August 29, 2023 · 1 min · jiezi

关于渲染:三种不同的渲染到底是啥

渲染,就是将3D模型转换成2D图像,并最终出现在屏幕上的过程。尽管这里只有一句话,然而这一句话外面蕴含了太多的数学、物理和计算机方面的常识,它形容了咱们用计算机来虚拟化真实世界的根本逻辑。渲染过程是须要计算机进行运算且耗费工夫的。 不同的渲染分类,会用到不同的渲染引擎。比方实时渲染咱们个别会用到Unity和Unreal,离线渲染咱们会用到V-ray和Keyshot。然而这些技术和引擎产品都是相通的,所以Unreal的实时渲染能力也能够部署在云端,成为云渲染的体现。 尽管,因为应用场景的不同,引擎自身的渲染算法都有本人的特点和劣势。然而,随着硬件计算能力的倒退,它们的界线也缓缓变得含糊。常见的渲染类型有以下几种:实时渲染、离线渲染、云渲染、混合渲染。它们两头有重叠穿插,也有技术区别。咱们防止太多的专业性形容,尝试用浅显易懂的形式来进行解释。 一、实时渲染实时渲染(Real-time Rendering) 从字面的意思非常容易了解,就是咱们要实时的看到渲染之后的3D物体或者场景的成果。实时,用数字怎么了解?至多24FPS:只有达到或者超过1秒钟播放24张连贯图像的速度,人眼观看时就不会造成卡顿的感觉。个别的实时渲染场景都是带有强交互属性的,比方最常见的3D游戏《王者》《吃鸡》,或者是一些带有交互的3D利用,比方智慧城市、智慧园区的可视化我的项目。实时渲染的场景中,这些利用都会独立运行在咱们的电脑、手机上,通过本地的硬件能力实现实时渲染的过程。因而,玩大型游戏的话,硬件性能肯定要好。 二、离线渲染离线渲染(Offline Rendering) 这个从字面意思了解,如同就是“断网”之后在做渲染,然而这种了解是不对的。离线渲染是跟实时渲染绝对应的,简略说就是咱们不须要实时的看到渲染成果的场景。这种场景最常见的就是咱们的家装效果图。做过装修的小伙伴应该都晓得,如果让设计公司出效果图个别都是要免费的(有些为了吸引客户当然也会收费),他们其实就是在做离线渲染的工作。那为什么咱们不能实时的去渲染一张效果图,反而要用离线渲染的机制呢?这就要看最初的渲染成果到求要多高了。 实时渲染,尽管渲染速度快,能够实时生成渲染内容,然而渲染的成果和真实度相对来说是不可能特地高的。对于离线渲染的场景,根本都是对渲染要求十分高的,甚至是齐全实在的。比方方才提到的家装效果图,你可能不须要立即看到渲染图,然而如果看到的时候,发现成果不好,就可能要换其余设计公司了。另外一个最常见的就是好莱坞影视大片、3D动画等影视场景。他们都须要达到一个十分真切的渲染成果甚至是齐全实在的场景复现,然而对实时性要求不高。 所以,个别的好莱坞大片,尤其是特效十分好的那种,拍摄实现后的制作周期都十分长。比方咱们耳熟能详的《阿凡达》,过后动用了40000颗CPU,104TB内存,10G网络带宽,整整离线渲染了1个多月。 说到这大家应该会有一个疑难了,怎么能够用到40000颗CPU来进行渲染呢?什么电脑能有这么多CPU呢?其实这就是离线渲染在概念上,容易让人误会的中央:离线渲染大多数状况反而恰好是在线的。通常状况,如果咱们在做家装效果图,是能够用本人的一台一般电脑去进行渲染制作的,然而本人的电脑硬件配置必定不会特地好。因而,实现整套渲染计算的过程到最终出图是须要很长时间的,当然电脑硬件越好,工夫越短。如果是业余的设计团队,尽管是须要使用离线渲染达到很高渲染成果,同时必定也是心愿出图的工夫越短越好。 因而就呈现了一种新的离线渲染状态:渲染农场。说到渲染农场置信很多人都不生疏,它就是在云端买了很多渲染服务器,这些服务器能够搭建成千上万颗CPU或者GPU的集群,来专门服务那些须要疾速实现离线渲染的用户。这就是为什么《阿凡达》的渲染会用到那么多CPU的起因,当然当初根本都是采纳GPU来进行渲染工作了。渲染农场其实就是搭建了渲染服务器集群,那当然就是在线的了。所以说,只有提到渲染农场,它是离线渲染场景中的一种渲染模式,然而实际上它恰好是在线的。 三、云渲染云渲染(Cloud Rendering) 这个从字面意义了解就是在云端实现渲染的意思。然而为什么下面讲到渲染农场的时候,并没有特意强调它就是云渲染呢?其实如果依照渲染产生的节点来说,渲染农场这种离线渲染就是属于云渲染领域的。然而,咱们通常对于云渲染的了解,个别都是在云端实现实时渲染的场景。下面咱们提到的实时渲染大部分时候都是在咱们本人本地的电脑或者手机上实现的,因而对于终端硬件的要求是比拟高的,不然“卡顿”必定是无奈防止的。云渲染的呈现就是为了解决这个问题:让硬件性能不太好的终端也能够实时的渲染成果不错的3D内容。 云渲染的基本原理是,把所有的3D渲染工作都交给云端。渲染实现后,编码成为视频实时的传送给咱们的客户端,客户端就变成了一个视频播放器,对视频流进行解码和播放,这个过程中能够监听一些鼠标和键盘操作,来实现交互性能。 这样大量的三维数据和美术资源不必装置到咱们的手机或者电脑的客户端,而是全副在云端实现渲染,客户端只有具备看视频的性能,就能够体验具备比拟好渲染成果的3D利用。对于公众来说,手机设施不必特地高配,就能够体验成果很好的游戏,而且手机个别也不会发烫了。目前云渲染的场景次要也是体现在游戏场景中,即云游戏。当然还包含一些对渲染品质要求比拟高的3D可视化或者数字孪生我的项目。

July 11, 2023 · 1 min · jiezi

关于渲染:智慧公安3DCAT实时云渲染助力某公安机关打造数字孪生可视化系统

近年来,随着大数据、数字孪生、云计算、人工智能等技术的飞速发展,数字化浪潮席卷全国各地公安系统。2022年全国公安工作会议中也提到,数字化改革是推动公安工作翻新倒退的大引擎、培养战斗力生成新的增长点。 随着数字警务、智慧公安策略的深刻施行,我国的城市治理及公安机关的警务治理也逐步向着数字化、智能化的状态倒退。 为推动“智慧警务”建设,瑞云科技的3DCAT元宇宙实时渲染云(以下简称“3DCAT”)与生态合作伙伴江苏数字看点科技有限公司(以下简称“数字看点”)联结为某地公安机关打造了城市治安防备三维管控平台。 该平台以“数字孪生”为核心,“智能感知”和“危险防控” 为主线,实现对“物”、对“人”、对“事件行为” 三大因素的全方位管控。实现时空数据的中心化解决, 其中包含地理信息数据、布局修建数据、业务数据、 个性化数据,以及相干数据的倒退态势和变动状况, 通过平台中枢的解决剖析,造成智能化利用伎俩,建设决策反馈体系。 3DCAT与数字看点携手共创公安数字孪生平台在该我的项目中,3DCAT为该公安机关数字孪生零碎打造了实时云渲染私有化PaaS平台。 对于公安系统而言,警务人员只须要任何能够关上链接的联网设施,例如Windows、Mac、iOS、Android & Browser、AR/VR设施,数字孪生平台以视频流的形式推向终端,缩小设施投入,能够实现终端无差化、挪动化。 对于运维人员而言,在园区内通过公有云链接拜访三维管控平台后盾,便能够随时随地对平台进行调适和保护,缩小保护老本和人力资源老本,私有化部署也保障了零碎平台的安全性和稳定性。 而对于内容创作者而言,3DCAT生态合作伙伴数字看点便能够专一内容创作自身,无需关注简单的适配、渲染等术语和工作,加重内容创作者累赘。 除了以上的PaaS平台反对外,3DCAT还为数字孪生提供一站式建模+可视化+云渲染软硬一体解决方案,为各类场景提供三维可视化与交互设计服务,SaaS、IaaS和PaaS全笼罩。 3DCAT赋能数字孪生多元利用场景除智能警务外,3DCAT利用场景还笼罩园区、社区、城市、修建、文旅、文博、批发、制作等畛域,为各畛域数字孪生化提供优质的实时云渲染一站式建模+可视化+云渲染解决方案。 以本次单干为契机,3DCAT赋能公安畛域数字化转型,推动警务巡防管理体系建设深度交融,助推公安工作品质改革、效率改革、能源改革,保护社会稳固。 接下来,3DCAT凭借当先的技术根底,将持续丰盛云渲染资源和服务供应,为更多数字孪生利用场景提供高互动性,高沉迷感、高清的产品体验,真正让XR利用触手可及,助力开启元宇宙体验新纪元! 本文《智慧公安!3DCAT实时云渲染助力某公安机关打造数字孪生可视化零碎》内容由3DCAT实时云渲染解决方案提供商整顿公布,如需转载,请注明出处及链接:https://www.3dcat.live/news/p...

January 30, 2023 · 1 min · jiezi

关于渲染:水体渲染

对于水体渲染的一个简略Demo,大部分资源以及实现都来自Unity官网我的项目BoatAttack以及GPUI插件。本文次要解说大抵实现思路,想具体理解的同学能够下载工程查看(800MB左右)。 工程链接:https://pan.baidu.com/share/i... 提取码:mrzz 须要的工具:Unity 2020,VS 2019 以下水体渲GPU实例化的演示:https://www.youku.com/video/X... 水体次要实现的成果:水体渲染成果1 水体渲染成果2 一、波浪创立一个空物体,挂上脚本ASE_Water.cs。 1. LOD波浪应用到的资源在Assets\ASE\Meshes\ASE_WaterMesh.fbx。 在Unity的Scene面板中的左上角,切换至网格渲染,该模型组如下所示,两头的网格顶点密集,边上的顶点稠密。水面网格 将该模型组增加到ASE_Water的Water Mesh列表中。 而后咱们须要在Update中实时更改其地位,使其始终保持在摄像机朝向的下方。更改水面地位 当初就失去了一个能够追随相机的水面了。 2. 顶点动画当初的水面是一个立体上的网格,须要对顶点进行偏移能力模仿波浪。 代码局部在Assets\ASE\Shaders\ASE_Water.shader 实现。 2.1 单个Sin函数顶点高度函数:Wi(x,y,t) = Aisin(Di(x,y)wi+ti) Wi:批改后的顶点地位。输出为x,y坐标(水面顶点的x,z)以及工夫t,输入为变换后的z坐标(水面顶点的y)Ai:管制水的振幅Di:波浪挪动的方向,与(x,y)点乘失去某一方向上的重量wi:频率,和波长互为倒数,管制水的波长i:与t相乘代表波峰的挪动间隔,管制水的挪动速度单个Sin函数生成波浪 法线函数:首先定义顶点坐标函数:P(x,y,t) = (x,y,Wi(x,y,t)) ,其中Wi(x,y,t)即方才的顶点高度。 一个顶点的法线怎么求得? 求出X和Y方向上的偏导B和T,再用B*T失去顶点的新法线N。 对X偏导,失去B: 同理,对Y偏导,失去T: B*T失去N: 其中: //单个Sin波浪WaveStruct SinWave(half2 pos,float waveCountMulti, half amplitude, half angle, half wavelength){ WaveStruct waveOut; float time = _Time.y; half w = 6.28318 / wavelength; half wSpeed = sqrt(9.8 * w); angle = radians(angle); half2 direction = half2(sin(angle), cos(angle)); half dir = dot(direction, pos); half calc = dir * w + time * wSpeed; // the wave calculation half cosCalc = cos(calc); half sinCalc = sin(calc); waveOut.position = 0; waveOut.position.y = amplitude * sinCalc*waveCountMulti; waveOut.normal = normalize(float3( -w*direction.x*amplitude*sinCalc, 1, -w*direction.y*amplitude*sinCalc )) * waveCountMulti; return waveOut;}2.2 叠加Sin函数顶点高度函数: ...

January 4, 2023 · 1 min · jiezi

关于渲染:建筑工程和施工产业中的3D可视化

3D视觉效果是传播想法,概念或设计的弱小工具,它也用于在概念阶段采购该想法。 AEC行业的可视化曾经走了很长一段路,从将设计提交给客户进行批准,当初用于我的项目的每个阶段,从我的项目招标,取得客户和理事会的批准,到我的项目的营销以及产生投资预施工。3D视觉效果,无论是动态图像还是视频,都能无效地展现室内设计和我的项目修建。无论是试图预售我的项目还是中标,真切的3D视觉效果在AEC行业中的应用越来越多。 为什么应用3D可视化?在咱们多年的渲染和修建可视化畛域工作中,咱们发现设计师在设计过程中应用咱们的3D渲染作为根本工具的以下六大起因: 3D可视化能加强和改善视觉传播 从最早的阶段开始,那些投资于我的项目的人须要可能看到我的项目实现后的样子。3D可视化,如360虚构游览和视频,能够疾速简略地显示我的项目从头到尾的样子。3D可视化能能够轻松显示我的项目的概念和选项 任何我的项目通常都有很多选项和概念。这可能包含运输我的项目的不同路线或建筑物的不同外观和设计,甚至是室内装修的各种设计选项。我的项目渲染能够疾速无效地向项目经理和客户展现不同的设计选项。 3D可视化能很容易销售并可共享 随着社交媒体接管世界,可能利用这些渠道将您的内容传播给公众十分重要。3D可视化是向公众采购概念或我的项目的好办法!出于营销目标,咱们发现视频通常比.pdf,图像或其余传统的我的项目交换形式更具吸引力和有效性。 3D可视化能在施工前发现问题 因为咱们应用理论设计数据以3D形式虚构构建您的我的项目,因而咱们发现此过程对于发现典型品质管制可能脱漏的潜在设计问题十分贵重。因为咱们通常应用来自大多数学科的数据,因而在可视化过程中常常会呈现跨学科问题。一个例子可能是发现隔音墙挡住了重要的标记或地标。 3D可视化能节省时间和费用 咱们都明确,节省时间就是省钱。3D 渲染和修建可视化能够帮忙建筑师和设计师协同工作并更无效地交换想法。高效的设计沟通有助于放慢审批、设计沟通和开发速度。 3D可视化能使您的我的项目在竞争中怀才不遇 高质量3D可视化的好看、简略和极其视觉性能能够以其余媒体无法比拟的形式传播您的愿景。 如何更好让3D可视化实现实时成果 传统的3D可视化更偏向于应用离线渲染,离线的反义词便是在线实时,实时相比于离线最大的劣势在于实时预览成果,这对于修建、工程施工行业中的工作效率晋升具备微小的帮忙然而渲染经常意味着算力,算力也与设施分量无关,弱小的算力须要弱小的设施反对,也意味着无奈实现设施轻量化,这不利于建筑行业中的随时随地查看3D可视化成果的便当。 3DCAT元宇宙实时渲染云的呈现为以上难题提供了优质的解决方案,3DCAT是在5G网络、云计算、游戏引擎等技术迅速倒退的前提下,为解决终端算力有余、画面体现较差、初期洽购老本低等问题应运而生的一套 利用云端渲染3D利用并实时推送到终端的综合性解决方案。目前3DCAT也是国内外比比皆是的可能同时提供私有云+公有云的实时渲染平台。 运行在3DCAT实时渲染云的三维内容,无需下载安装,灵便嵌入网站、APP、小程序等各类流量入口,反对海量用户平安拜访,主动负载平衡和伸缩扩容,不受工夫、地点、终端设备限度,随时进入元宇宙 注册立赠实时云渲染收费体验https://app.3dcat.live/register 本文《修建、工程和施工产业中的3D可视化》内容由3DCAT实时渲染解决方案提供商整顿公布,如需转载,请注明出处及链接:https://www.3dcat.live/share/...

December 19, 2022 · 1 min · jiezi

关于渲染:调试3D渲染和3D可视化的五个好处

修建和修建环境是咱们日常生活中不可避免的一部分,间接影响咱们和咱们的福祉。它能够是咱们的家、办公室、左近的教堂或城市的商业综合体;所有这所有的设计和布局都是修建。然而,具备讥刺象征的是,修建的交换往往并不具备包容性。例如,对于非技术或非修建背景的人来说,用于传播设计的次要工具,如技术打算、剖面和立面不可读或绝对容易了解。3D渲染和可视化通过使我的项目的所有利益相关者都能够拜访架构和设计来带来包容性。在3D渲染过程中,因为技术的不断进步,等轴测图和透视草图被转换为图像,使其相似于理论照片。此外,3D渲染在相干环境中应用适当的照明创立拟议修建环境的实在示意——早在建造之前。 以下是真切的视觉传播是前进方向的五个起因: 1.进步生产效率 新时代的3D渲染技术打消了简单的图纸层,并通过准确的测量简化了3D设计。因而,这项技术已成为可视化、现场图纸和施工后营销的一站式解决方案,使建筑师可能专一于设计。此外,3D可视化能够尝试模式和品质,减少扭转修建环境风貌的可能性,就像扎哈·哈迪德和弗兰克·盖里所做的那样。 2.改善合作 3D渲染和可视化通过取代相似的空间设计办法,在设计界发明了一个利基市场,从而实现了更好的修建环境和与同行的合作。现在,3D渲染工作室与受人尊敬的修建实际单干来渲染他们的我的项目,进步他们凝聚力交付的工作品质并建设更强的社区意识。 3.以客户为核心的办法 通过3D渲染和可视化摸索空间有助于依据客户要求定制设计,并使其成为设计过程的一部分。该技术让利益相关者在建造之前看到并体验理论空间,让您作为设计师能够提出解决方案并比拟不同的抉择。这个过程节俭了大量的工夫、精力和金钱,并提供了最好的后果。此外,这些3D渲染图可作为参加施工过程的所有机构的视觉参考。 4.技能造就 3D渲染有助于造就设计师的技能,并为他们的实际设定高标准。当您通过尝试动静模式和更新资料并与来自不同业余的人员单干来一直摸索和倒退时,工作品质会变得更好。 5.设计流传 3D渲染可实现有影响力的视觉传播,这有助于将查问转换为销售。3D渲染技术的美好之处在于,它容许您摸索配色计划和设计元素,从久远来看有助于构建有凝聚力的工作组合。应用高质量的3D视觉效果也简化了工作室的视觉辨认,从而进步了修建公司的品牌价值。 3DCAT实时云渲染解决方案 如果你也想体验3D渲染和3D可视化,实时的3D渲染和3D可视化你不容错过。 随同着5G网络、云计算技术和3D可视化的倒退,以及GPU性能的晋升、游戏引擎在超高清三维可视化内容的逐步推广利用,虚构研发、虚构展现、虚构拆卸、虚构驾驶等面向各个行业的数字利用和解决方案正逐步成熟。云端虚构展现正开始成为一种新的展现形式,利用云端计算资源,通过超高清、全实时、可交互、沉迷式的线上虚构模式,突破地区空间限度、实现终端设备轻量化,满足更多潜在用户便捷浏览、个性化配置需要等。 3DCAT实时渲染云是在5G网络、云计算、游戏引擎等技术迅速倒退的前提下,为解决终端算力有余、画面体现较差、初期洽购老本低等问题应运而生的一套利用云端渲染3D利用实现3D可视化并实时推送到终端的综合性解决方案。目前3DCAT也是国内外比比皆是的可能同时提供私有云+公有云的实时渲染平台。 目前,3DCAT实时渲染云已在汽车三维可视化、修建家装工程、衰弱&医疗仿真、虚构仿真教学实验、数字孪生等畛域提供业余的实时云渲染服务,帮忙不同行业客户实现云渲染赋能,晋升流传和视觉效果。注册立赠实时云渲染收费体验https://app.3dcat.live/register本文《调试3D渲染和3D可视化的五个益处》内容由3DCAT实时渲染解决方案提供商整顿公布,如需转载,请注明出处及链接:https://www.3dcat.live/share/...

December 19, 2022 · 1 min · jiezi

关于渲染:实时渲染正在改变可视化游戏

在这个疾速倒退的世界中,因为用于创立效果图的技术的提高,建筑行业中应用的效果图品质失去了极大的进步。已经须要数小时的真切渲染过程当初简直是霎时的事件。实时可视化正在成为修建和室内设计行业的重要工具。思考到工夫就是金钱,建筑师和设计师当初有必要立刻将一个人的想象力转化为虚拟现实,而这一切都是通过实时修建渲染实现的。 以后的修建可视化技术提供了减速工作流程的可视化工具。最新的建模和渲染软件是交互式的,可实现更短、更快的渲染过程。这种高效的流程能够更快地策动迭代,并容许用户查看多个选项,同时让他们更好地管制设计决策。实时可视化齐全扭转了修建渲染的概念:渲染不是装璜我的项目的简略图像,而是完满和动静集成的。 图形处理单元GPU是专门类型的微处理器,最近在渲染行业的使用量显着减少。尽管传统的渲染过程应用中央处理器来渲染图像,但实时技术最大限度地进步了GPU的效率,从而显着缩短了渲染工夫。要使 CPU以与GPU雷同的速度渲染图像,须要多个CPU互连并在相似渲染农场的环境中应用。这不仅低廉,而且占用空间。随着经济实惠的GPU和相干VR技术的衰亡,实时渲染过程对于高质量图像越来越受欢迎。这是一种更简略的办法来取得渲染,能够在很短的工夫内进步我的项目的品质。 实时渲染被证实是建筑设计服务畛域的无效工具,浏览设计、更改资料、纹理、在白天和黑夜之间切换的能力、用户敌对的界面和轻松的编辑灵活性将可视化设计的体验晋升到一个全新的程度。这并没有从真切的静止图像或渲染的创作中带走任何货色,这自身就是一种艺术模式,并将持续成为印刷畛域的一部分。另一方面,实时推动了视觉传播和设计的界线。实时云渲染彻底改变实时渲染体验虽说实时渲染正扭转除可视化游戏之外的各行各业,但咱们都晓得实时渲染极度依赖超强算力,而超强的算力意味着非常轻便的终端,对于虚构展现和宣传而言,轻便的终端会极大影响宣传成果。 而实时云渲染则是解决以上难题的最佳计划,实时就是要谋求时效性,所见即所得。它与离线渲染是绝对应的。云则是指云服务器。原来用本地渲染的画面,改由云服务器实现。那这就要求大部分的画面(至多与用户交互的画面)都是实时渲染的,而且延时要足够低,能力让用户没有卡顿的感觉。云渲染解放了本地,这能力使“轻终端”成为可能。而且因为是云计算,数字内容无需预下载到本地,用户的加载工夫被无效缩短,内容被破解或非法传输的危险也大大降低了,安全性大幅晋升。 实时云渲染还具备很多技术劣势,它延时低、无需装置客户端、极大地扩大了终端类型范畴、解决了兼容性问题,也更合乎元宇宙的技术方向。3DCAT实时渲染云是在5G网络、云计算、游戏引擎等技术迅速倒退的前提下,为解决终端算力有余、画面体现较差、初期洽购老本低等问题应运而生的一套 利用云端渲染3D利用并实时推送到终端的综合性解决方案。目前3DCAT也是国内外比比皆是的可能同时提供私有云+公有云的实时渲染平台。 该文章来源于3DCAT实时渲染云平台,如需转发和分享需表明出处及链接:https://www.3dcat.live/share/...

December 2, 2022 · 1 min · jiezi

关于渲染:分享生死狙击2的大场景草渲染

重写引擎的草渲染的原因1. 效果图 2. 为什么决定重写引擎的草渲染我的项目立项较早引擎版本为Unity 5.6,这里探讨Terrain自带草的问题,以及我一一对应的解决方案。以下的问题不是每个都必须重写渲染机制能力解决,但次要的几个需要就决定重写了。 法线问题,不带Mesh法线,用的是地表法线作为渲染法线(因为Mesh或Billboard都会用插片来做,不传法线贴图,面数限度下不可能正确表白草叶子的实在法线方向,这种模式能够根本保障光照不发黑,地表根本处于能够被阳光找到的半球)。动静Mesh问题,个别选Collect Detail Patches运行时CPU动态创建一堆Mesh,即有顶点数下限,又会引起卡顿(引擎源码批改成异步能够缩小卡顿但不缩小计算量会发热,PC发热则让一些机器CPU降频)。Hi-Z低效问题,动态创建一堆Mesh。无奈最高水平剔除每个不渲染的草,不能最大施展Hi-Z剔除性能。PBR材质问题,因为没有Smooth贴图无奈实现PBR渲染,导致材质成果十分差(这里独自传图也是能够实现)。淡入淡出问题,因为不反对淡入淡出,所以120米外草的隐没与呈现无奈做到PUBG那样的抖动半透明过渡。LOD问题,自带的草不反对LOD,改引擎也不好实现,因为合并Mesh渲染的,所以无奈逐棵切换LOD。Shadowmask问题,提早渲染下,草会获取地形的Shadowmask进行计算到G-buffer的RT4,这里能够省略优化。Shadowmap问题,草无奈投递暗影。AO问题,SSAO诚然能够减少一点草的AO,但那个精度体现的成果不显著且成果不好。草的成长方向问题,植被尽管是应该反重力成长,但游戏中的草一片表白的是一小堆草,当这些草很矮时,心愿草的成长方向按地表方向成长,相似苔藓。这样做能够无效防止底部与地形切出一条直线的问题,看起来更贴合高空。Mipmap问题,草在远处,惯例的Mipmap计算会导致剔除过多而提前隐没。应该应用间隔场贴图。PreZ效率问题,PreZ阶段只须要透明度信息,采样因Albedo精度须要而创立贴图性能不是最省,须要独立的Alpha图。解决方案1. 法线计划下图中上半局部是Unity法线策略,导致画面较平,下半局部是半球Mesh法线。树和草常常会用半球法线(原理不再赘述),间接用Mesh法线须要较粗疏的建模或法线贴图并实现双面渲染的带简略透射的光照逻辑(即法线取反再算一次亮度)。因为我是采样GPU Instance绘制,所以顶点自带了法线,如果要沿用Terrain的渲染草形式,能够把草顶点组成Buffer传Shader,而后依据VertexID来取。 近处须要法线是Mesh法线,远处须要用地形法线作为草的法线,这样能够让草与底部在远处更融为一体,所以须要对Normal做过渡。 2. Mesh与Hi-Z计划Mesh采纳ComputeShader+GPU Instance绘制,每帧给ComputeShader传入四周7x7虚构网格草的数据(一个格子40米,这样能够做到120米都有草),只传发生变化的格子,一帧传一个格子。ComputeShader每帧对这些小范畴的草进行间隔裁剪、LOD判断、视锥裁剪与Hi-Z裁剪。实现最大水平剔除。这里具体做法有之前文章介绍。 《Compute Shader 进阶利用:联合Hi-Z 剔除海量草渲染》 3. PBR材质计划因为草金属度都为0,所以只有传Smooth贴图,把它放在Albedo的a通道,因为它总是和 Albedo同一个Pass被拜访。而且只有 Alpha>0像素的Smooth数据才有意义,而草个别用Alphatest,所以须要的透明度只有不是0即可。所以能够压缩在同一个a通道,前面提到a会独自存储。传了Smooth因为提早渲染是对立的前期Lighting,所以这里不须要写光照,只须要在dot(normal,lightDir)<0的中央加一点自发光模仿背光面亮度防止发黑。 下图中上半局部是Unity的草对立Smooth,下半局部是Smooth贴图在a通道,成果比照不是特地显著。这里能够去看结尾美术调的PBR效果图。 4. 淡入淡出计划仔细观察其余游戏成果,发现用抖动半透明(Dithering Alphatest) 能够很好地实现草的呈现与隐没成果,而Unity自带的Alphatest也会因为间隔越远裁剪面积比就越大。扣除边缘比例减少来做的隐没,就相似缩放,成果必定不如挖一堆小孔(Dithering )好,Dithering的变动更平均,然而在性能上小小取胜,倡议草的可视间隔在100米内的采纳Dithering ,反之太远了看不清可用Unity这套。但有一种成果与性能均衡做法能够对Clip参数做个依据间隔变动的函数。比方: clip(a - lerp(_cutout, 1, smoothstep(hzbGrassDistance - 5, hzbGrassDistance, disCmr))); 代https://blog.uwa4d.com/admin/write-post.php#wmd-preview替简略clip(a-_cutout).比照成果:这是引擎间接Clip成果会呈现一条显著切线 这是模拟PUBG罗马之子等抖动半透明成果进行时候可看到纱窗效应 这是性能更好利用间隔动静计算Clip值的后果 但通明区域先隐没,经常是顶部先隐没,所以成果不如抖动半透明 抖动半透明淡入淡出算法 5. Shadowmask计划这个版本的GPU Instance是不带Shadowmask的,草也是不参加烘焙的,因为它的Lightmap、Shadowmask和贴着的地表十分统一,间接取对应地表的这2个图采样即可。然而这一步能够简化算法,不做任何采样。提早渲染的Shadowmask逻辑是这样的,烘焙的对象会采样Shadowmask图,并记录屏幕空间的Shadowmask到G-buffer的RT4,示意本人是否在暗影里,动静对象如果没Lightprobe,会绘制红色示意本人不在任何暗影里(因为没通过烘焙提前计算好,零碎不晓得其在不在暗影里,所以一律疏忽暗影),但如果存在Lightprobe,那么会依据左近的Probe是否在暗影里来插值计算。同样写到RT4。如果在我的项目中用到Bakey烘焙,那么对于是否让Probe烘焙遮挡信息是可选的,若不勾上就会失落Mask数据。 接下来用案例解释: 下面这张是简略烘焙的场景,带了Lightmap、Shadowmask和Lightprobe。它们是怎么表白本人在暗影里的呢? 1.渲染完底板、墙壁和小方块这3个动态物体,它们会读取烘焙的Shadowmask来写到RT4 如下图,咱们只有一个带Shadowmask烘焙的光所以只看红色通道。这里表白很分明,彩色为暗影内区域。 2.渲染小球,把它想成一堆草贴地摆放(下图),能够看到是青色(这里只探讨红色通道),截图可知是0,这套就是Unity对草的Shadowmask计算逻辑。 3.兴许你会发现一个问题:草可不可以不去写RT4呢?让地表彩色的区域仍然放弃彩色就好,最初屏幕空间计算光照时,反正都是要用平行光计算光照前获取这个像素的Mask值当作Atten用,当参加Shadowmask烘焙的只有一个平行光的时候,青色和彩色就齐全是一个后果。或者说,不须要晓得草绘制哪些区域,如果绘制了,取草背地(绝大部分都是地表)的Mask作为本人是否在暗影里的判断。这样对于海量的草即便少了这个采样仍然有肉眼可见的晋升的。 4.那么这样省略有没有问题?当然有。Unity不会白白多计算一次的,它须要思考齐全正确性,所以性能不敢省,咱们本人的我的项目能够依据理论状况取舍。这里有1个小问题,当咱们从侧面看上坡上草的时候,草的背景是天空或远方就有问题了。这时候它的前面间接用的Mask不再是地表了,会让明明在暗影里的草显得和阳光下一样亮。如下图红框内的球体局部,如果取前面的红色,示意不在暗影里,如果本人采样计算并写入RT4,就是青色(红色为0)示意在暗影里。然而Shadowmask产生在实时暗影外,少说也有70到120米,所以那时候你了解为侧面的草的透光也曾经十分不显著了,须要看我的项目接受程度。 5.如果你承受了这点瑕疵,防止了Shadowmask的采样开销,那么要如何不写RT4呢?frag/vert 模式的Shader很简略,把out float4 RT4的写入间接正文掉即可。如果是surface shader则更简略,#pragmasurface surfaceFunction lightModel noshadowmask 即可。 6.开展聊一聊Shadowmask,Unity的Shadowmask有个很乏味的特点,它是一个超级宅男,能够轻易地让3年、5年、7年、10年Unity程序、主程序、甚至TA都认不全它。先说什么叫Mask,个别渲染里可能间接查图就晓得本人是不是某个属性,或是多少这种属性的叫Mask,所以Shadowmask表白是不是在暗影里。而Shadowmap不是记录是否在暗影里,而是记录相机空间深度,失去深度不是表白是否在暗影里所以并不算Mask。 对于Unity 5.6,我所晓得的至多有4种Shadowmask,有学习脱漏的同学能够依据这个查问具体内容,补上常识空缺。 ...

November 3, 2022 · 1 min · jiezi

关于渲染:预告低成本强交互沉浸式的云游戏究竟如何实现

云游戏是近年煊赫一时的产业话题。 “云游戏”的概念早在十多年前就已被提出,承载着行业和万众的期待。只管云游戏自身具备“云端运行、超高清、零延时、即点即玩”等泛滥个性,用户体验却始终未及预期。 随着5G时代的到来,以及核心云能力下沉至边缘云,高带宽、低提早、高性能这些个性与云游戏紧密结合,冲破实时云渲染的带宽和提早问题,赋予了云游戏更大的想象力。 在云游戏之上,“云渲染技术”和“串流技术”是绕不开的外围。 就在6月,央视推出了首个大型沉迷式数字交互空间《三星堆奇幻之旅》,阿里云以云渲染与串流技术带观众破屏穿梭,“身临其境”畅游考古现场,感触历史复刻于前。 “云渲染”将大型沉迷式体验须要的图形算力、存储需要放在云端,使得观众看到和交互的画面,都是云端实时渲染计算出来的。 “串流”是实现云游戏的要害形式,通过数据中心将游戏渲染场景转换成视频流,再应用网络推送到用户终端,从而让观众解脱本地硬件限度,低成本地体验沉迷式交互。 在云游戏的画面和玩家的刹时互动中,会给视频串流带来了泛滥挑战。当串流电视或电影时,观众能够忍耐一开始时的短短几秒缓冲,但当串流高画质的游戏时,不仅要将提早降到毫秒级,还要实时出现高保真的画面质感,以满足游戏的沉迷感。 于是,云渲染串流技术,正在开启低成本、强交互的沉迷式体验。 针对这一议题,阿里云高级技术专家李忠将在一场寰球分布式云大会-云游戏论坛中,与大家分享其中精华。 借此云游戏论坛,也将着眼进步云游戏用户体验,丰盛云游戏内容品质,摸索更有价值的云游戏商业模式。 寰球分布式云大会-云游戏论坛 随着边缘计算和GPU虚拟化技术的疾速倒退,长期妨碍3D云渲染倒退的延时问题和应用老本等外围挑战正逐渐失去解决。而元宇宙行业趋势的浪潮衰亡,以云游戏为代表的云渲染技术开始规模化落地。 其中,云渲染串流技术是用户体验的外围。阿里云凭借音视频技术的长期积攒,深刻优化了软硬联合的视频解决效率、QOS自适应的窄带高清编码、与边缘计算联合的超低延时传输,大幅晋升了云渲染串流的用户体验,并显著升高了云渲染的计算成本。 云渲染串流技术 开启低成本强交互沉迷式体验 演讲前瞻: 云渲染技术简介与挑战阿里云在云渲染串流的体验与老本优化云渲染技术的将来瞻望8月26日,本周五,倒计时2天,以云游戏串流技术,共赴一场沉迷式技术盛宴! 「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实际技术文章,在这里与音视频畛域一流工程师交换切磋。公众号后盾回复【技术】可退出阿里云视频云产品技术交换群,和业内大咖一起探讨音视频技术,获取更多行业最新信息。    

August 25, 2022 · 1 min · jiezi

关于渲染:3D渲染和动画制作KeyShot-Pro-激活工具

KeyShot 11是一款相当优良的专业化实时3D渲染工具,应用它能够简化3d渲染和动画制作流程,并且提供最精确的材质及光线,渲染成果更加实在,KeyShot为您提供了应用 CPU 或 NVIDIA GPU 进行渲染的能力和抉择,并可能线性扩大以取得无可比拟的性能,从静止图像和动画到交互式 Web 和挪动内容,KeyShot 发明最高品质视觉效果的能力可确保您应用最佳工具来满足您的所有可视化需要。 KeyShot Pro 激活工具

August 11, 2022 · 1 min · jiezi

关于渲染:Mac电脑上的3D渲染和动画制作软件KeyShot-Pro

KeyShot 11 Mac是一款相当优良的专业化实时3D渲染工具,应用它能够简化3d渲染和动画制作流程,并且提供最精确的材质及光线,渲染成果更加实在,KeyShot为您提供了应用 CPU 或 NVIDIA GPU 进行渲染的能力和抉择,并可能线性扩大以取得无可比拟的性能,从静止图像和动画到交互式 Web 和挪动内容,KeyShot 发明最高品质视觉效果的能力可确保您应用最佳工具来满足您的所有可视化需要。

August 11, 2022 · 1 min · jiezi

关于渲染:LRTimelapse-for-Mac专业延时摄影渲染工具

LRTimelapse for Mac是MAC上的一款视频编辑软件,LRTimelapse mac是一款配合 Adobe Lightroom、Adobe Camera RAW 和 Adobe After Effects 等程序制作延时摄影的软件。lrtimelapse mac将带你到下一个程度的电影。 LRTimelapse for Mac(业余延时摄影渲染工具) 动画和关键帧曝光,白平衡和其余任何Lightroom编辑工具。您能够应用Lightroom / ACR的全副后劲进行调色,甚至还能够制作突变,径向和油漆刷子过滤器让时间推移摄影的“圣杯” - (白天到黑夜的过渡)非常简单 - 只需在拍摄时手动调整相机或应用诸如qDslrDashboard之类的ra子机即可。只需点击一下Deflicker - 基于开发的图像的外观,而不用来到RAW工作流程。这给你最好的品质可能。与弱小的LRTExport插件无缝集成Lightroom CC Classic高性能的视频渲染引擎,可解决高达8K分辨率的高质量视频和MP4 / H.264,ProRes(甚至Windows),H.265和MJpeg。

August 7, 2022 · 1 min · jiezi

关于渲染:二次元卡通渲染进阶技巧

前言随着《原神》游戏的流行,国内对于二次元游戏这块儿畛域越来越看重了。二次元我的项目中自身基于日本的卡通动漫而来,所以最初的实质都是为了尽量还原2D立绘,而并不像PBR谋求物理正确,只有难看,还原立绘,那么就是胜利的。所以说到这里,咱们的指标就是还原立绘。 卡通渲染畛域,其实有一些卡通格调独有的成果,这里就集体对于二次元和日本动漫的了解,收集了一些卡通渲染中独有的成果,以及集体在这块儿爬过的坑记录下来,抛砖引玉,给大家分享下本人的实现思路,如果能帮忙到各位,则甚之好矣(注:本文中的所有代码思路均基于Built in内置管线)。 一、眼睛眉毛穿过头发,俗称飘眉这个也属于惯例成果了,个别做老二次元美术都会要求这个成果,也是动画摄影中很重要的一个评判成果,目前有两种伎俩,基于深度Depth和基于Stencil。 基于深度Depth代码(劣势:多一个Pass,多一个Draw Call)。 先画脸部和头发,都保留默认不通明队列即可"Queue" = "Geometry"。再画眉毛(须要两个Pass),设置队列在脸部和头发之后"Queue" = "Geometry+10"。画眉毛的第一次Pass {ZTest LEqual........}(画没有被头发挡住的局部)。画眉毛的第二次Pass {ZTest GEqual......}(画被头发挡住的局部)。基于Stencil代码。 先画眉毛,设置眉毛队列 "Queue" = "Geometry-10",同时设置Stencil: Stencil{ Ref 2 Comp GEqual Pass Replace Fail Keep}再画脸部和头发,对于头发的Stencil设置: Stencil{ Ref 1 Comp Greater Pass Keep Fail Keep}留神:不做任何设置状况下,Stencil的默认值是0。 二、自定义管制Bloom区域这个是比拟一般的公众需要了,很多二次元游戏中只让脸部泛光,但身材偏白的区域还是能够不泛光的,当然这个如果是齐全本人写前期Bloom成果会容易很多,咱们这里通过批改Unity默认的PPSV2,将该成果融进去,因为目前很多公司都间接采纳了Unity自带的后处理了,的确不便,成果调整也能够。 大略实现思路: 失常渲染角色,而后将须要Bloom的遮罩区域,通过设置输入色彩的A通道outcolor.a =黑白区域 ,保留到A通道中,会跟着流水线走到前期所须要用的色彩缓冲区的RT中。失常Post Bloom,批改Bloom.shader文件,利用以后屏幕RT的Alpha值。三、基于深度的额发投影这个分游戏我的项目,国内的确也有大部分游戏我的项目间接不让头发投影解决完事。然而这样会少一层投影关系,立体感可能会削弱,不过对于玩家而言也无所谓了。如果采纳Unity自带的Shadowmap,因为Shadowmap是依据灯光方向计算出来,很难管制,比方右边额发投下来的影子适合了,左边就可能投到脸上了,因为灯光方向不好把控,无奈做到正好只是整个额发投下来的成果,看上去很薄,很纸片的美妙感觉。 参考文章《【Unity URP】以Render Feature实现卡通渲染中的刘海投影》 找到的资源,头发和眼睛在一个网格上,所以眼睛区域也绘制出了投影,真正做的时候必定会离开的 大略思路: 画脸部和眼睛(头发以外的其余头部区域Mesh)通过第一个Pass,只写入深度。画头发,采纳第2个Pass,画出头发区域遮罩(只保留洁净的头发区域),黑白图。在脸部Shader中采样黑白图,在灯光的摄像机空间,依照灯光方向偏移第2点中的黑白图,失去额发投影。代码实现(基于Built in管线)。 画头发用的C#局部: public class HairMaskGenerate : MonoBehaviour{ public Renderer faceRenderer1;//脸部Renderer public Renderer faceRenderer2;//脸部Renderer public Renderer eyeBrowRenderer;//眉毛 //public Renderer eyeRenderer;//眼睛 public Renderer hairRenderer;//头发Renderer public Material hairMaskMaterial; private CommandBuffer cmb = null; private RenderTexture hairMaskRT = null; private Camera mRTGenerateCamera; void Start() { mRTGenerateCamera = GetComponent<Camera>(); cmb = new CommandBuffer(); cmb.name = "Cmb_DrawHairMask"; hairMaskRT = new RenderTexture(mRTGenerateCamera.pixelWidth, mRTGenerateCamera.pixelHeight, 24); cmb.SetRenderTarget(hairMaskRT); cmb.ClearRenderTarget(true, true, Color.black); //脸部有两局部mesh组成, 只画深度 cmb.DrawRenderer(faceRenderer1, hairMaskMaterial, 0, 0); cmb.DrawRenderer(faceRenderer2, hairMaskMaterial, 0, 0); cmb.DrawRenderer(eyeBrowRenderer, hairMaskMaterial, 0, 0); //cmb.DrawRenderer(eyeRenderer, hairMaskMaterial, 0, 0); //画出头发的区域,黑白遮罩图 cmb.DrawRenderer(hairRenderer, hairMaskMaterial, 0, 1); mRTGenerateCamera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, cmb); } // Update is called once per frame void Update() { mRTGenerateCamera.CopyFrom(Camera.main);//对立地位和角度信息,放弃和主相机统一 mRTGenerateCamera.farClipPlane = Camera.main.farClipPlane; mRTGenerateCamera.nearClipPlane = Camera.main.nearClipPlane; mRTGenerateCamera.fieldOfView = Camera.main.fieldOfView; Shader.SetGlobalTexture("_FaceShadow", hairMaskRT); }}画头发遮罩用的Shader: ...

July 28, 2022 · 5 min · jiezi

关于渲染:实时云渲染有哪些优势

实时云渲染是什么 实时云渲染就是把十分重的图形计算放到云端,云端服务器能够配置较高端的GPU设施,通过云端服务器进行计算,进行实时编码,编码后将其“流化”,通过网络,把计算结果实时推送至终端(例如手机、PC、平板和XR设施) 实时云渲染解决哪些问题设施无奈轻量化的问题本地渲染对GPU的要求高,而GPU占用大量的空间和分量,使得终端设备的分量和体积往往很大,无奈实现轻量化。 本地渲染老本高本地渲染须要洽购低廉的设施,最新的RTX显卡须要上万元,算上其余的整机,几万的设施能力反对良好的实时渲染画面。 数据安全无奈失去保障若是本地实时渲染,往往须要事后下载插件、大型可执行文件或内容文件,在携带这些文件的过程中,失落的危险异样的高。且携带着大型设施,设施被物理毁坏或者散热反常导致死机的可能性更加大,这将对业务产生毁灭性影响。 实时云渲染劣势技术架构当先实时云渲染通过将重度计算置于云端、将实时计算结果推流到轻量化终端的形式,能够大幅升高终端计算压力,升高终端生产老本,而且用户能够体验到更加真切、炫酷的视觉效果; 反对多种终端和跨平台适配实时云渲染形式只须要打包上传一种格局(exe),即可在多种终端和零碎上运行。只有终端(零碎)能关上浏览器即可拜访各种交互式利用。 设施轻量化实时云渲染利用内容以视频流的形式推向终端,能够实现终端无绳化、挪动化,尤其对于VR一体机来说,极大解放了用户的应用限度。 数据安全更有保障计算模型和数据都部署在云端,对于客户端来说这是一种“零装置”的解决方案。最终用户不须要事后下载插件、大型可执行文件或内容文件,不须要装置任何货色。用户所生产的仅仅是流化数据——就像视频流一样。数据并不会下载,因而也就没有某些用户可能放心的平安问题了。同时,用户与利用数据隔离,实时云渲染平台本身也领有多重保障。 利用对立部署在云端,便于内容的对立保护和治理每次更新对用户无感,只须要关上利用即是最新版本; 3DCAT实时渲染云利用场景3DCAT实时云渲染是在5G网络、云计算、游戏引擎等技术迅速倒退的前提下,为解决终端算力有余、画面体现较差、初期洽购老本低等问题应运而生的一套利用云端渲染3D利用并实时推送到终端的综合性解决方案。目前3DCAT也是国内外可能同时提供私有云+公有云的实时渲染平台。 目前,3DCAT实时渲染云已在汽车三维可视化、修建家装工程、衰弱&医疗仿真、虚构仿真教学实验等畛域提供业余的技术服务,为不同行业迈入元宇宙做后盾。 3D交互式看车 通过各种终端以沉迷式、交互式看车,可能明显增强消费者对品牌的感知价值,晋升汽车品牌竞争力;加深消费者对汽车的理解,减速决策过程,晋升电子商务成单率; 医疗教育 基于实时渲染技术,能够在医疗教学中构建信息化、数字化的人体,通过采取与人体解剖学、古代影像相结合的模式,获取人体解剖构造和数据信息。通过利用3DCAT实时渲染云,在云上搭建数字化人体教学利用,能够将人体构造性能数字化、可视化、互动式地展示进去,极大地晋升教学质量; 数字房产展现 突破被社交间隔限度的看房模式,利用高沉迷感带来感官冲击,是房地产销售的利器。看房者既能够浏览房源的全貌,也能够步入房间查看细节,甚至实时体验关上抽屉、更换壁纸的成果。除了沉迷式体验外,还能够失去房间的长、宽、高、年限、周边配套等全方位数据展现,便于全面把握房屋信息; 智慧城市(园区)可视化展现 能够精确、直观地显示城市、园区运行根底数据、负载状况等,与区域的其它信息化零碎互联互通、数据共享,充沛挖掘信息资源的外在价值。 虚构数字人实时渲染 虚构数字人指存在于非物理世界中,由计算机图形学、深度学习等伎俩发明及应用, 并具备多重人类特色的综合产物。具备虚构、数字及人三大特色。 本文《实时云渲染有哪些劣势》内容由__3DCAT实时渲染解决方案提供商__整顿公布,如需转载,请注明出处及链接:https://www.3dcat.live/share/...

July 26, 2022 · 1 min · jiezi

关于渲染:Unity移动端游戏性能优化简谱之-以引擎模块为划分的CPU耗时调优

《Unity挪动端游戏性能优化简谱》从Unity挪动端游戏优化的一些根底探讨登程,例举和剖析了近几年基于Unity开发的挪动端游戏我的项目中最为常见的局部性能问题,并展现了如何应用UWA的性能检测工具确定和解决这些问题。内容包含了性能优化的根本逻辑、UWA性能检测工具和常见性能问题,心愿能提供给Unity开发者更多高效的研发办法和实战经验。 明天向大家介绍文章第三局部:以引擎模块为划分的CPU耗时调优,共9大节,蕴含了渲染模块、UI模块、物理模块、动画模块、粒子系统、加载模块、逻辑代码、Lua等多个模块等常见的游戏CPU耗时调优解说。(全文长约14115字,预计浏览工夫约30分钟) 文章第一局部《Unity挪动端游戏性能优化简谱之 前言》、第二局部《Unity挪动端游戏性能优化简谱之 常见游戏内存管制》可戳此回顾,残缺内容可返回UWA学堂查看。 1. 总览1.1 模块划分UWA将CPU中工作内容明确、耗时占比个别较高的函数整顿划分为:渲染、UI、物理、动画、粒子、加载、逻辑等模块。但这并不意味着模块之间的工作相互独立毫无关联。举例而言,渲染模块的性能压力势必受到简单的UI和粒子影响,而加载模块的很多操作实际上都是在逻辑中调用并实现的。 划分模块有利于咱们确认问题、找到重点。与此同时,也要建设起模块之间的关联,有助于更高效地解决问题。 1.2 耗时瓶颈当一个我的项目因为CPU端性能瓶颈而产生帧率偏低、卡顿显著的景象时,如何提炼出哪个模块的哪个问题是造成性能瓶颈的次要问题就成了要害。只管咱们曾经对引擎中次要模块做了整顿,各个模块间会呈现的问题还是会千奇百怪不可一以概之,而且它们对CPU性能压力的奉献也不尽相同。那么咱们就须要对什么样的耗时能够认为是潜在的性能瓶颈有精确的认知。 在挪动端我的项目中,咱们CPU端性能优化的指标是可能在中低端机型上大部分工夫跑满30帧的晦涩游戏过程。为了达成这一指标,简略做一下除法就失去咱们的CPU耗时均值应管制在33ms以下。当然,这并不意味着CPU均值曾经在33ms以下的我的项目就曾经把CPU耗时管制的很好了。游戏运行过程中性能压力点是不同的,可能一系列UI界面中压力很小、但反过来游戏中最重要的战斗场景中帧率很低、又或者是存在大量几百毫秒甚至几秒的卡顿,而最终均匀下来依然低于33ms。 为此,UWA认为,在一次测试中,当33ms及以上耗时的帧数占总帧数的10%以下时,能够认为我的项目CPU性能整体管制在失常范畴内。而这个占比越高,阐明以后我的项目的CPU性能瓶颈越重大。 以上的探讨内容次要是围绕着咱们对CPU性能的宏观的优化指标,和内存一样,咱们仍要联合具体模块的具体数据来排查和解决我的项目中理论存在的问题。 2. 渲染模块围绕渲染模块相干优化更全面的内容能够参考《Unity性能优化系列—渲染模块》。 2.1 多线程渲染个别状况下,在单线程渲染的流程中,在游戏每一帧运行过程中,主线程(CPU1)先执行Update,在这里做大量的逻辑更新,例如游戏AI、碰撞检测和动画更新等;而后执行Render,在这里做渲染相干的指令调用。在渲染时,主线程须要调用图形API更新渲染状态,例如设置Shader、纹理、矩阵和Alpha交融等,而后再执行DrawCall,所有的这些图形API调用都是与驱动层交互的,而驱动层保护着所有的渲染状态,这些API的调用有可能会触发驱动层的渲染状态地扭转,从而产生卡顿。因为驱动层的状态对于下层调用是通明的,因而卡顿是否会产生以及卡顿产生的工夫长短对于API的调用者(CPU1)来说都是未知的。而此时其它CPU有可能处于闲暇期待的状态,从而造成节约。因而能够将渲染局部抽离进去,放到其它的CPU中,造成独自的渲染线程,与逻辑线程同时进行,以缩小主线程卡顿。 其大抵的实现流程是,在主线程中调用的图形API被封装成命令,提交到渲染队列,这样就能够节俭在主线程中调用图形API的开销,从而进步帧率;渲染线程从渲染队列获取渲染指令并执行调用图形API与驱动层交互,这部分交互耗时从主线程转到渲染线程。 而Unity在Project Settings中反对且默认开启了Multithreaded Rendering,个别倡议放弃开启。在UWA的大量测试数据中,还是发现有局部我的项目敞开了多线程渲染。开启多线程渲染时,CPU期待GPU实现工作的耗时会被统计到Gfx.WaitForPresent函数中,而敞开多线程渲染时这一部分耗时则被次要统计到Graphics.PresentAndSync中。所以,我的项目中是否统计到Gfx.WaitForPresent函数耗时是判断是否开启了多线程渲染的一个根据。特地地,在我的项目开发和测试阶段能够思考暂时性地敞开多线程渲染并打包测试,从而更直观地反映出渲染模块存在的性能瓶颈。 对于失常开启了多线程渲染的我的项目,Gfx.WaitForPresent的耗时走向也有相当的参考意义。测试中部分的GPU压力越大,CPU期待GPU实现工作的工夫也就越长,Gfx.WaitForPresent的耗时也就越高。所以,当Gfx.WaitForPresent存在数十甚至上百毫秒地继续耗时时,阐明对应场景的GPU压力较大。 另外,依据UWA的大量我的项目和测试教训,GPU压力过大也会使得渲染模块CPU端的主函数耗时(Camera.Render和RenderPipelineManager.DoRenderLoop_Internal)整体相应回升。咱们会在最初专门探讨GPU局部的优化。 2.2 同屏渲染面片数影响渲染效率的两个最根本的参数无疑就是Triangle和DrawCall。 通常状况下,Triangle面片数和GPU渲染耗时是成正比的,而对于大部分我的项目来说,不通明Triangle数量又往往远比半透明Triangle要多,尤其须要关注。UWA个别倡议在低端机型上将同屏渲染面片数管制在25万面以内,即使是高端机也不倡议超过60万面。当应用工具发现部分同屏渲染面片数过高后,能够联合Frame Debugger对重点帧的渲染物体进行排查。 常见的优化计划是,在制作上须要严格控制网格资源的面片数,尤其是一些角色和地形的模型,应严格警觉数万面及以上的网格;另外,一个很好的办法是一通过LOD工具缩小场景中的面片数——比方在低端机上应用低模、缩小场景中绝对不重要的小物件的展现——进而升高渲染的开销。 须要指出的是,UWA工具所关注和统计的面片数量并不是以后帧场景模型的面片数,而是以后帧所渲染的面片数,其数值不仅与模型面片数无关,也和渲染次数相干,更加直观地反映出同屏渲染面片数造成的渲染压力。例如:场景中的网格模型面片数为1万,而其应用的Shader领有2个渲染Pass,或者有2个相机对其同时渲染;又或者应用了SSAO、Reflection等后处理成果中的一个,那么此处所显示的Triangle数值将为2万。所以,在低端机上应严格警觉这些一下就会使同屏渲染面片数加倍的操作,即使对于高端机也应做好衡量,三思而后用。 2.3 Batch(DrawCall)在Unity中,咱们须要辨别DrawCall和Batch。在一个Batch中会存在有多个DrawCall,呈现这种状况时咱们往往更关怀Batch的数量,因为它才是把渲染数据提交给GPU的单位,也是咱们须要优化和管制数量的真正对象。 升高Batch的形式通常有动静合批、动态合批、SRP Batcher和GPU Instancing这四种,围绕Batch优化的探讨较为简单,再写一篇文章也不为过,所以本文不再开展来探讨,但在UWA DAY 2020中咱们具体探讨和分享了DrawCall与Batch的关系以及这4种Batching的应用详解,供大家参考:《Unity移动游戏我的项目优化案例剖析(上)》。 上面简略总结动态合批、SRP Batcher和GPU Instancing的合批条件和优缺点。 (1)动态合批条件:不同Mesh,只有应用雷同的材质球即可。长处:节俭顶点信息地绑定;节俭几何信息地传递;相邻材质雷同时, ,节俭材质地传递。毛病:离线合并时,若合并的Mesh中存在反复资源,则容易使得合并后包体变大;运行时合并,则生成Combine Mesh的过程会造成CPU短时间峰值;同样的,若合并的Mesh中存在反复资源,则会使得合并后内存占用变大。 (2)SRP Batcher条件:不同Mesh,只有应用雷同的Shader且变体一样即可。长处:节俭Uniform Buffer的写入操作;按Shader分Batch,事后生成Uniform Buffer,Batch外部无CPU Write。毛病:Constant Buffer(CBuffer)的显存固定开销;不反对MaterialPropertyBlock。 (3)GPU Instancing条件:雷同的Mesh,且应用雷同的材质球。长处:实用于渲染同种大量怪物的需要,合批的同时可能升高动画模块的耗时。毛病:可能存在负优化,反而使DrawCall回升;Instancing有时候被打乱,能够本人分组用API渲染。 2.4 Shader.CreateGPUProgram该API经常在渲染模块主函数的堆栈中呈现,并造成渲染模块中的大多数函数峰值。它是Shader第一次渲染时产生的耗时,其耗时与渲染Shader的复杂程度相干。当它在游戏过程中被调用并且造成较高的耗时峰值时应引起留神。 对此,咱们能够将Shader通过ShaderVariantCollection收集要用到的变体并进行AssetBundle打包。在将该ShaderVariantCollection资源加载进内存后,通过在游戏后期场景调用ShaderVariantCollection.WarmUp来触发Shader.CreateGPUProgram,并将此SVC进行缓存,从而防止在游戏运行时触发此API的调用、防止部分的CPU高耗时。 然而即使是曾经做过以上操作的我的项目也常会检测到运行时偶然的该API耗时峰值,阐明存在一些“漏网之鱼”。开发者能够联合Profiler的Timeline模式,选中触发调用Shader.CreateGPUProgram的帧来查看具体是哪些Shader触发了该API,能够参考《一种Shader变体收集和打包编译优化的思路》。 2.5 Culling绝大多数状况下,Culling自身耗时并不显眼,它的意义在于反映一些与渲染相干的问题。 (1)相机数量多当渲染模块主函数的堆栈中Culling耗时的占比比拟高(个别我的项目中在10%-20%左右)。 (2)场景中小物件多Culling耗时与场景中的GameObject小物件数量的相关性比拟大。这种状况倡议研发团队优化场景制作形式 ,关注场景中是否存在过多小物件,导致Culling耗时增高。能够思考采纳动静加载、分块显示,或者Culling Group、Culling Distance等办法优化Culling的耗时。 (3)Occlusion Culling如果我的项目应用了多线程渲染且开启了Occlusion Culling,通常会导致子线程的压力过大而使整体Culling过高。 因为Occlusion Culling须要依据场景中的物体计算遮挡关系,因而开启Occlusion Culling尽管升高了渲染耗费,其自身的性能开销却也是值得注意的,并不一定实用于所有场景。这种状况倡议开发者选择性地敞开一部分Occlusion Culling去测试一下渲染数据的整体耗费进行比照,再决定是否须要开启这个性能。 ...

June 23, 2022 · 2 min · jiezi

关于渲染:Cube-技术解读-Cube-渲染设计的前世今生

作者:何瑾(潇珺) 本文为《Cube 技术解读》系列第四篇文章,往期文章欢送大家回顾。 《Cube 技术解读 | Cube 小程序技术详解》《Cube 技术解读 | 支付宝新一代动态化技术架构与选型综述》《Cube 技术解读 | Cube 卡片技术栈详解》阿里是个重经营的公司,前端开发者居多,2016-2017年,在Weex还是1.0时代,React Native开源还没多久,Flutter还没诞生的时候,如何在贴合前端开发环境的前提下,疾速铺到android/iOS双平台是个大热点,支付宝外部孵化一个动态化跨平台计划趁势而生。 后面三篇文章别离介绍了Cube以后架构,Cube卡片和Cube小程序技术产品状态。这篇文章次要探讨Cube的渲染设计,帮忙大家理解Cube卡片渲染技术的前世今生。 Native原生渲染的问题咱们都晓得一个原生view渲染上屏须要几个步骤,以android举例:create、measure、layout、draw,这些须要在主线程实现,当实现原生列表时,即便完满复用item,对不同数据渲染时,也须要measure、layout、draw几步缺一不可,而且随着view嵌套层级越深,对主线程资源耗费越大,当列表fly起来当前,帧率疾速降落,造成页面卡顿,基于这个问题,cube在调研期间,如何解决渲染效率是重要的一part。 通常来说优化列表滚动帧率,也就是view层级、布局复杂度、去掉不必要背景色,解决适度绘制,图片懒加载、item复用等方面下手,但基本还是绕不过measure、layout、draw。彼时的weex和RN,也都还是将html中的标签映射到平台层view,在某些场景下,开发者又不能像原生开发一样自行优化,在渲染性能上饱受诟病。因而cube调研期间渲染指标是:优化渲染效率+跨平台。 跨平台异步渲染计划异步渲染基于下面提到的背景和需要,那么咱们就想,是否有一种形式,把关键步骤移除出线程呢,即异步渲染。在列表滚动时根本只有零碎手势和列表自身滚动算法、动画须要占用主线程,将大大提高帧率。视图内元素绘制的产物是一个像素缓存(Cube采纳的设计是Bitmap),回到主线程给视图进行刷新显示。 跨平台架构另一个指标跨平台,是要做到能够疾速扩大其余平台,cube将波及平台的局部分离出来,造成platform 层。 platform 这里提供了各平台通用的规范c++原子接口,在不同平台用平台语言实现,初步只实现了android、iOS两个平台,android通过jni调用java办法,iOS在实现文件中c++、OC混编。如果将来须要扩大其余平台例如macOS,只需实现platform层定义的接口即可,能够达到疾速扩大其余平台的指标。 core library是基于platform原子接口用c++实现的是根底库,例如文件IO、UI控件、图片下载、音讯通信等,供下层引擎应用。library之上,就是cube渲染的外围实现,渲染局部包含数据模型和渲染逻辑,组件库指cube外部反对的一些零碎实体控件,或者开发者可外接的实体组件。 下图是第一版cube渲染架构图。 cube渲染架构图 异步渲染技术选型后面提到了,异步渲染计划里异步绘制的“产物”是一张bitmap交给“容器”View,为什么是bitmap呢,看起来对内存很不敌对,View又是个什么View,有没有特殊性,上面聊聊cube调研期间都钻研过哪些计划,最终为什么选型bitmap。 Android平台技术选型android的选型之路崎岖起伏,最先能想到的反对独立渲染线程的textureView、GLSurfaceView做为容器,但有显著缺点,是不能用于常见业务的列表场景的,只能利用于特定场景。 SurfaceView、GLSurfaceViewSurfaceView从android1.0开始就有,次要特点是它的渲染能够在子线程中实现,因而存在的问题是,尽管它继承View,然而它领有独立的Surface,不在View hierachy中,它的显示也不受View的属性管制,因而不能像一般view一样缩放平移,更不能作为item放在listView/RecycleView中当作一般view应用,滚动起来会有不同步的问题。 GLSurfaceView继承SurfaceView,它自带GLThread,有和GLSurfaceView雷同的问题,总之,这两个view更适宜单个视频渲染或者像地图类渲染场景。 有人可能要问,整个页面都用SurfaceView/GLSurfaceView不就行了,连列表也在render线程实现?这里两个问题: 1、如果列表容器也在render线程实现,正如当初的flutter一样,那么列表滑动手势解决须要本人实现,比方drag,fling,各种列表滚动个动画,以及滚动加速度计算等,老本很高。并且,touch事件捕捉依然依赖平台层,而处理事件须要切换到render线程,这两头肯定有线程切换老本造成的不跟手的体验问题。当初很多基于flutter引擎革新的渲染引擎,正面临着这些问题; 2、在过后cube团队的次要指标是疾速验证 ,列表的实现这种老本过高,不是主要矛盾所在。 TextureVIewtextureView是google从android4.0开始提供的,它的呈现很大水平上是为了补救SurfaceView、GLSurfaceView与原生View交融的有余,基于下面一节形容的这两个view与原生view一起动画的问题,textureView仿佛更适宜咱们的场景,既能反对独立render线程,又能保障与原生view完满交融。 然而,在理论的调研过程中发现,textureView的渲染机制,不适用于长列表,如果每个列表的item是一个textureView,那么就波及到出屏回收,进屏创立,否则会带来内存问题。而回收和创立SurfaceTexture是异步过程,呈现了闪黑屏问题。除此之外,进一步发现textureView的数量和容量(每个view的尺寸累计)存在某个下限,而且不同手机下限也差别很大。简略说,这是一个看起来很美妙,然而兼容性坑有数的技术路线。 Bitmap+一般View最终抉择了bitmap看起来并不完满的计划,尽管这被大多数android开发认为bitmap带来大量内存耗费,视为不可承受,但随着cube的利用范畴越来越广,这逐步被证实是在过后,最普适的一个计划。 每一个layer对应一个零碎view,每个view的绘制内容在子线程通过CanvasAPI异步绘制在bitmap上,当view上屏时,零碎onDraw绘制这个bitmap“产物”。 BitmapCache 尽管用了Bitmap绘制计划,但必须要思考内存过载的问题,这里咱们采纳了BitmapCache,次要针对列表类型场景,依赖零碎的item回收回调告诉,将bitmap画布放入Cache,item上屏渲染时,优先从cache取bitmap画布应用,优先取雷同大小的,如果不存在,则取width、height大于指标width、height,让view只绘制bitmap部分,达到正确渲染的目标 iOS平台技术选型iOS的实现原理与android大致相同,区别是,iOS异步线程绘制实现的“产物”,不会在UIView的drawRect里利用CoreGraphics进行渲染,这种形式效率很低,页面卡顿显著,最终采纳的是将画布赋值给UIView的layer,托管给零碎渲染layer。 渲染技术的演进下面讲了cube异步渲染大体计划和关键技术选型,事实上,从19年初上线答答星球,到当初,cube在支付宝内利用越来越宽泛,这两头也随同着cube团队依据理论业务场景一直摸索、优化的过程,渲染链路经验了两次重构。须要强调的,这个演进过程是在严格的内存/性能下实现的,而且要对Android兼容性做出斗争。一些看起来不那么优雅或者先进的设计,事实上是不得不这么做,比方抉择Bitmap作为像素缓冲,比方接入三方组件的设计等。从某种意义上,抛开束缚议论技术优劣也意义不大。咱们已经借鉴flutter的局部,但Cube最终还是沿着适宜本身场景的技术路线往前走。 常见术语LayoutTree:DomApi通过add、update、remove构建的通过yoga布局的,用来形容节点父子关系,蕴含布局信息的原始树型构造;RenderTree:用来形容绘制节点父子关系,蕴含绘制信息的树型构造,与layoutTree的区别举例:一个layoutNode visible为gone,则该节点不会在RenderTree中呈现;Layer:个别状况下,根节点及其子节点绘制在同一个画布上,定义为一个layer,对应平台层一个view,当子节点有动画属性,或者超出父节点范畴,则须要独立出一个layer;LayerTree:下面提到的layer节点,构建的树型构造,一个layer对应平台层一个view,咱们叫ContainerView;实体节点:须要独立layer的节点为实体节点;虚构节点:除了实体节点以外,其余节点均会被绘制在父容器的画布上,这些是虚构节点。演进过程调研初期——1.0验证计划的可行性调研期间验证计划可行性,场景比较简单,以支付宝内敌人动静页面为验证场景,每条状态(一个item/cell)作为一个渲染单元,这里只思考了layerTree只有一个layer的状况,头像、昵称、工夫、配图、“赞”、“赏”,“评”等元素均绘制在root节点对应的layer上,“赞”、“赏”,“评”文本旁边的小图标则作为外接实体组件,通过addSubView增加在rootLayer的View上。 数据模型 如下图所示,依据layoutTree构建RenderTree,但非渲染节点不在renderTree上,layerTree只有一个自绘制layer(rootLayer),和其余自定义组件X,最终除自定义组件外,其余所有节点都绘制在rootLayer上。 渲染流程 bridge线程通过DomApi构建layoutTree,当主线程触发渲染时,主线程依据layoutTree构建RenderTree,构建过程中遇到外接实体组件,创立实例并addSubView,之后切换子线程绘制RenderTree,即rootLayer上的所有虚构节点,绘制实现后切换主线程贴图(bitmap“产物”)。 毛病 不能反对多layer构造实体view没有复用,也就是敌人动静列表中有多少item/cell,就会有多少“赞”、“赏”,“评”实体组件但这个调研验证了异步渲染的可行性,在列表滚动时帧率大幅晋升。 产品化期间——2.0反对多layer后面验证了可行性,在进行产品化设计时,就必须要满足多layer构造了,即理论的一张卡片中,会有一个或几个不同的节点被设置为layer,这些节点及其子节点,别离绘制在不同画布上,供不同的layer渲染。 数据模型 改良之处时layerTree里有个多layer节点,layer节点上面的子虚构节点,将绘制在该layer的bitmap“产物”上。 渲染流程 brige线程构建layoutTree的过程中,每个指令(addNode、removeNode……)都会相应散发到render模块的主线程,render依据指令构建RenderTree,并用指令信息生成task入队,当VSync信号来时,触发工作出队并去重,构建layerTree,不同layer散发到不同draw线程绘制,绘制实现后切主线程贴图(bitmap“产物”)。 毛病 ...

June 10, 2022 · 1 min · jiezi

关于渲染:跨平台多媒体渲染引擎OPR简介

背景在最新的优酷版本中曾经反对了基于端侧实时人体辨认的弹幕穿人能力,该能力大抵能够合成为视频渲染模块、视频画面辨认前解决模块、弹幕mask文件离屏合成模块、弹幕渲染模块,而这些模块正是搭载在咱们构建的跨平台渲染引擎OPR上。其实弹幕穿人对于多媒体播放场景来说只能算较小利用之一,咱们甚至能够在弹幕渲染里就列举出更多的特效例如:3D弹幕、多并发的动静弹幕、须要音视频信息实时配合的节奏弹幕等等;而在音视频渲染畛域咱们也不仅有画面辨认的前解决、更多还有相似超分、插帧、音视频加强、色弱、护眼等观影模式的后处理反对。在多媒体播放这种“争分夺秒”的的场景下如何高效的实现以及组织上述性能,甚至能够实时对渲染成果做检测和统计,以及对于将来视频游戏化、互动化留有空间和技术储备,都是咱们须要思考的,正是基于这种思考咱们设计了跨平台的多媒体渲染引擎OPR,来撑持咱们的构想。 OPR架构设计从性能上来说咱们须要将音视频前解决、后处理、渲染,2D(弹幕)渲染,3D渲染,互动及画面检测等能力集成到一起,从个性上来说咱们须要兼顾高性能、热插拔、高可保护。纵观市面成熟的引擎,其实咱们找不到一款合乎上述要求的,GPUImage更多关注的是视频后处理,并且其跨平台实现须要不同技术栈;SDL跨平台技术栈雷同然而更多实现的是音视频的渲染,无奈基于其实现前后解决的扩大;像FlameMaster更是只实现了Android端的弹幕渲染,局限性太大,无奈扩大出炫彩的特效。深究咱们提到的2D渲染能力、互动性等其实是个别游戏引擎具备的特点,并且视频游戏化也是将来的方向,基于此咱们也须要将游戏引擎纳入咱们的思考,然而游戏引擎存在一个致命的问题就是从基因里就没有思考过音视频后处理的事件,而后解决个别须要多个简单算法的串并联执行,须要非凡的设计能力实现。另外思考到渲染的高性能需要,咱们须要应用native的GPU渲染,在借鉴了cocos2D、GPUImage、SDL等引擎的状况下咱们设计出了OPR的根本架构,如图: 能够看出,音频的跨平台实现绝对比拟容易,音频后处理及渲染均是在CPU中实现,且大部分平台提供的渲染接口也都是基于native的(Android端audiotrack须要通过jni反射Java层接口),同时音频解决算法复杂度和算力耗费绝对视频来说均不在一个量级,这些都对咱们跨平台的封装提供了便当。然而图像的解决及渲染的难度就不可同日而语,思考到图像的计算量和并发个性咱们最好应用GPU进行计算,而不同端的渲染协定接口和脚本语言又不尽相同,经统计如果要反对Android、iOS、macOS、Windows这4种支流零碎,咱们须要对至多3种编程语言(c++、Java、oc)和3种脚本语言(glsl、msl、hlsl)进行封装。如何屏蔽不同平台渲染协定的个性和语言差别设计出一套对立的流程和接口就成为了咱们实现跨平台高性能渲染引擎的重点,最终咱们设计出如图架构: 如上,咱们基于两个维度来封装不同平台的渲染协定:渲染流程和渲染因素。对于渲染流程咱们划分了渲染最小单元:renderPass,其对应了一个render command的执行,在实际意义上可能意味着单条弹幕的渲染。对于渲染因素在抽取不同协定的共同点之后咱们造成了:buffer、shader、program、texture、env、device、utils 7大组成。其中env负责本地UI零碎与渲染协定的桥接,例如Android下须要egl连贯surfaceView和OpenGL ES,utils负责将架构对立的规范翻译为不同协定各自的形式,例如OPRPixelFormat::RGBA8888对于OpenGL ES意味着GL_RGBA,对于metal则意味着MTLPixelFormatRGBA8Unorm,utils负责保留和屏蔽这些映射关系;而device是一个工厂类,负责生产其余5大渲染因素,以此来升高不同模块对渲染因素的依赖复杂度。渲染流程通过command来和渲染因素进行链接,command中的type用来决定是否须要微调渲染流程,zOrder则决定了该command的执行程序,blend在形容不同command渲染后果的叠加形式,colorAttachment指定了渲染后果的保留对象,programState保留了渲染所需的因素及其对应的值。commandbuffer通过拆解command上述因素做出具体的执行。最终render通过封装commandBuffer和commandQueue实现了基于命令流的渲染,做到了技术实现和业务彻底解耦。 基于native UI的弹幕渲染上文中咱们曾经介绍了如何打造跨平台的音画渲染器,而图像渲染自身其实就是一个可视化的过程,所以咱们对于图像渲染的能力封装就是提供可视化控件。这样做的益处有:●性能解耦,升高了单个性能开发复杂度的同时也进步了稳定性,防止了新性能的开发对存量性能的影响;●类UI控件的设计更合乎业务同学的开发习惯,升高应用难度;●尽可能小的性能划分能够晋升复用率,有利于控制代码规模和调试难度;●基于UI控件的交互更贴近用户应用习惯,因为咱们要打造的是一款可交互的多媒体渲染引擎,而不是单纯的展现;到这里可能又带来了很多纳闷,既然咱们最终提供的是UI控件的性能封装,为什么不间接应用原生UI控件或者QT、flutter这种跨平台的UI零碎呢?首先是因为既然曾经阐明是原生则注定是成长在特定的零碎里,高度依赖特定零碎的上下文,当业务简单到肯定水平的时候这种跨平台的性能迁徙是无奈接受的;其次原生UI性能在高并发工作下存在有余,且大部分的UI还是偏差于展现型,咱们提供的UI更偏重特效;而后就是性能,咱们基于GPU渲染的UI控件可无效升高CPU应用和内存占用,晦涩度晋升。而至于QT和flutter则是有点杀鸡用牛刀的象征,并且在多媒体解决及渲染畛域也不会有咱们业余,咱们更聚焦!回到UI控件的问题,咱们认为其在多媒体相干的应用场景下具备三大因素:款式、布局能力、交互。款式既外观,这也是咱们最善于的畛域,利用shader咱们能够写出十分酷炫的款式,这里只有想不到没有做不到,而布局次要解决控件的地位关系、程序关系和嵌套关系,交互意味着控件能够承受输出能够产出输入。然而个别的基于GPU的渲染都比拟依赖上下文,这决定了咱们不可能设计出实在相似于原生的UI零碎,这里咱们借鉴了游戏引擎的理念,引入了director和scene的概念。Director能够看做是一个timer的主体,像OpenGL这种强线程要求的,咱们能够利用director将其进行束缚,确保咱们所有的OpenGL提交都是在一个线程里,而scene能够看做是一个容器,包容了须要显示的控件,切换scene能够实现不同页面的切换。最终综合上述因素咱们设计出了如下的nativeUI零碎: 在实现nativeUI零碎的构建后,弹幕引擎相对来说就是瓜熟蒂落的工作了,首先创立timer对director的render进行驱动,这里咱们能够设置罕用的60HZ,或者特色能力90、120hz,进行按需设置。具体到单个的弹幕咱们能够用sprite控件进行图片例如JPG、png的展现,利用animated sprite控件进行对GIF、apng等动图的展现,而label则负责文字展现,借用零碎或者freetype咱们能够实现不同字体的展现。如果咱们须要更简单的单体弹幕特效展现,则能够从新继承node,通过控件组合或者专项开发来实现,这些操作都是简略而高效的。而整体的弹幕特效的切换则能够通过切换scene来实现,在正在状况下label、sprite等单体字幕都是以scene的child的形式进行治理,在须要整体切换至相似打call等特效时咱们能够在一般scene和effect scene来实现平滑切换,甚至是定制适度成果。 既要又要还要的音视频渲染上文中咱们形容了如何构建基于GPU渲染的nativeUI零碎,并且在该零碎上跑通了弹幕能力,接下来咱们就须要思考一个更根本的场景,如何在前述的条件下跑通音视频解决及渲染能力。就视频解决及渲染而言,其不具备弹幕渲染那么显著的UI个性,没有简单条目并行处理及多条目整体特效切换等需要,但这不意味着复杂度的升高,反而因为视频画面清晰度日益增长(目前挪动端1080P曾经遍及,4K在某些平台也能够看到),画面加强、风格化、插帧等性能不断涌现,不同平台软硬解、不同格局数据的兼容等都为视频渲染带来了 更大的难度。它既要保障高可复用的性能组合、动静插拔,又要保障对绝大部分机型的笼罩和最低的性能要求,还要留有将来视频互动化游戏化的余地,在整个多媒体播放的技术链路中也是属于相对的技术洼地。 尽管咱们提到了很多须要解决的难题,然而设计一个高性能、多功能、高可扩大的视频渲染框架仍是咱们的乐趣所在。首先咱们借鉴GPUImage进行了性能的filter封装,这能够解决咱们链式的性能叠加,而通过twopass filter以及group filter的扩大咱们更是实现了filter的串并联,从而实现了图式的性能复合应用。而filter封装了command,承载了根本的渲染能力,这也是和弹幕渲染不同之处,弹幕以控件维度进行了command封装,视频渲染则更细化到了filter的维度。而后咱们构建了render pipeline,带有工厂属性,能够在播中动态创建filter插入到以后的pipeline中,这样咱们就解决了性能复用和动静插拔的问题。当初咱们须要解决的是如何使视频渲染具备根本的交互能力以及进一步的“改装”空间。在个别的视频渲染场景里,一个上屏surface对应一个播放实例也对应一个渲染实例,在这里的渲染实例咱们能够定义为一个videoLayer,这个videoLayer继承自上文提到的node,如果须要失去鼠标点触等互动事件则能够再继承eventLayer,而videoLayer外部则封装了咱们提到的pipeline,这样咱们的渲染实例在整体上以一个控件的模式融入到了咱们的整体nativeUI架构中,失去了布局、事件交互等UI个性,对内的pipeline封装则保障了其所需的简单解决链路,最终videoLayer不同于其余简略控件封装一个command,而是对外提供了一个command序列,通过order来组织其执行程序。而对于高性能的保障是从咱们的设计理念登程,贯通于咱们的实现过程,体现在各个细节。自底向上,咱们从一开始就抉择基于GPU的计算,保障了低CPU占用、高并发性能,在实现上咱们的外围代码均采纳C++实现,保障平台复用的同时,极大的晋升了性能,在细节上pipeline o(1)简单的的查找算法、位运算、代码块复用及性能提取都是咱们为性能做出的致力,最终咱们设计出如图视频渲染架构: 视频渲染构建的另外一个难点是须要兼容不同平台的硬解,iOS的vtb解码能够间接吐出pixelbuffer,能够间接出现数据,然而相似Android mediacodec、Windows平台为了保障性能是不倡议间接读取到内存再进行渲染。在这种状况咱们构建了基于texture的surfacewrap,数据间接更新至纹理,这样咱们就能够提供咱们的后处理能力,通过这种形式咱们使得不同的零碎播放器能够接入OPR,从而另零碎播放器也能够反对咱们特色的护眼、超分、插帧、截图等后处理能力。 监控链路为体验保驾护航在咱们实现上述性能之后须要另外思考的问题就是成果如何,在这里咱们须要定义如何来掂量成果的好坏。个别咱们认为良好的成果就是是否如实的还原了须要展现的音视频内容,并且展现过程是否晦涩。据此咱们布局了基于内容和基于流程的两种监控形式。对于内容监控,咱们从客诉登程总结最被诟病的视频渲染异样为黑屏、花屏、绿屏等,对于音频则是音量或者静音,针对这些咱们的监控零碎反对按配置以肯定距离对音视频进行对应的检测。对于流程监控,咱们从内存占用和均匀渲染时长进行统计,其中内存咱们可细化至显存、内存堆、栈的别离统计,帮忙咱们及时理解某局部内存的突出占用来解决内存IO引起的卡顿问题,而针对渲染时长的统计能够帮忙咱们定位是否存在某些计算量大的filter影响晦涩度,针对上述异样咱们也能够最后一些针对性的复原措施。 将来瞻望尽管咱们曾经实现了一些工作然而还有很多须要做的事件,例如目前咱们还没有针对Android平台的Vulkan反对,对于VR的反对还是依赖第三方库,还须要探索更多互动和视频渲染的联合,不依赖底层开发的特效反对,简略编辑器能力等。置信OPR的将来会变得更好。

June 9, 2022 · 1 min · jiezi

关于渲染:优酷弹幕穿人渲染技术揭秘

弹幕穿人性能,能使用户在弹幕刷屏的状况下,又不错过人物画面。因而,弹幕穿人性能一经推出就受到了宽广用户的青睐。就技术计划而言,弹幕穿人计划能够分为以下两大类:“云端离线人体宰割+端侧渲染”和“端侧实时人体宰割+端侧渲染”。在这里咱们别离简称为云端计划和端侧计划。不论是云端计划还是端侧计划,高效的弹幕渲染及弹幕穿人成果的渲染都是其中不可或缺的重要组成部分。本文次要聚焦在优酷弹幕穿人渲染相干技术介绍,包含弹幕渲染流程、弹幕穿人渲染实现及工程上的优化实际等相干方面。 一. 背景1 弹幕穿人成果咱们先体验一下目前在优酷主客上曾经上线的弹幕穿人成果。(1)截图: 通过截图咱们能够看出,整体人物穿透的成果解决上很赞,肩膀和胳膊边缘、特地是发丝等细节处的解决都十分细腻。 (2)录屏: 通过录屏咱们能够看到,弹幕穿人的成果把整个视频画面分为了3个档次:人物在最外层,两头一层是弹幕,最外面一层是视频画面背景。这样给人一种很好的观影沉迷感,能无效晋升在满屏弹幕下的观影体验。 **2 弹幕穿人计划介绍2.1 云端弹幕穿人计划**整体流程如下云端和挪动端两大部分: 2.1.1 云端次要实现人体图像宰割数据的生产和部署:算法同学提供AI算法,部署到云端服务器上,针对须要穿人成果的剧进行离线人体模板数据生产。而后将生产进去的模板数据对接到ups服务中,成为ups的一个节点。这样,端侧在播放对应视频时,同步申请ups对应节点拿到对应的模板数据资源链接,就能够做后续的下载、解码、弹幕穿人等相干的解决来实现弹幕穿人的成果了。2.1.2 挪动端分为两块:(1). MetaPipe:MetaPipe是端智能算法的集大成者。对应弹幕穿人场景,MetaPipe实现模板数据的下载、解析和解码等工作,对接OPR吐出对应pts的人体宰割模板数据。(2). OPR渲染:OPR渲染次要实现人体宰割模板数据的获取、弹幕及模板数据的渲染等工作,从而实现弹幕穿人的成果。具体实现细节后续章节会具体介绍。2.2 端侧弹幕穿人计划 端侧弹幕穿人是纯端侧计划,相较于云端计划的显著劣势是实时(能实用于直播等实时场景),生产成本低,并且在视频介质发生变化时不必从新生产(云端计划必须从新生产)。简略介绍一下端侧弹幕穿人流程:端侧在video失常渲染的同时,截取视频帧画面,送给OPR端智能模块去做数据处理。对应弹幕穿人这种场景,端智能算法负责实时实现人体图像宰割,生成人体宰割模板数据。最初将以后帧的人体宰割模板数据送给OPR弹幕渲染模块去做穿人成果的渲染。 2.3 弹幕穿人在挪动端的根本要求弹幕穿人作为一个新的互动状态,弹幕在渲染每一帧的时候,都会波及大量的运算,特地是纯端侧计划场景更是如此(高效截取视频帧画面,人体检测,弹幕及穿人成果渲染等等)。弹幕穿人要能在挪动端落地产品化,须要满足以下两个条件:(1)穿人成果要能失去保障,不能呈现错位、偏移、穿人弹幕画面频繁闪动等影响观感的状况产生,这样能力给用户很好的观感和用户体验。(2)不能因为引入新的计算量而产生弹幕卡顿、抖动、闪动等不良影响,不能呈现系统资源包含CPU/GPU和内存占用等增长过多,否则影响视频画面观感成果,那就是本末倒置了! 二. 优酷弹幕穿人渲染技术1 弹幕渲染技术弹幕的渲染能够通过canvas来实现(比方驰名的开源框架烈焰弹幕使),也能够通过opengl/metal在GPU中来实现。为了更好的渲染性能,优酷挪动端弹幕的渲染全副通过opengl/metal在GPU中实现。**2 弹幕穿人渲染技术2.1 简略流程图** 整体流程如下:opr拿到以后视频帧的人体轮廓数据,上传到GPU中去做blur,而后把blur后的数据作为alpha通道去跟弹幕纹理做blend,就能失去穿人成果,最初上屏。**2.2 实现细节2.2.1 架构图** 2.2.2 实现步骤(1)OPR针对以后video的pts拿到人体轮廓mask数据(无论是云端计划从MetaPipe获取还是端侧计划从OPR端智能模块实时获取的),先把纹理数据上传到GPU。弹幕穿人轮廓数据,RLE解码后就是0和255(二值数据更利于做RLE编码,编码进去的数据更小),如下图所示: 这个数据对应如下画面: (2) 在GPU里通过shader实现高低及左右各5个像素做gaussian blur,这样做有两个益处:a.主体mask数据没有变动,但边缘处会更平滑、不会那么突兀,锯齿感也会抹平。b.会减少mask数据的容错性,如果检测进去的人体轮廓有些许偏差,blur解决后会使偏差看起来没那么显著。 (3) 将blur后的mask纹理作为alpha通道,去跟弹幕的纹理做一次blend。针对每一个点去调整弹幕内容的alpha值,从而达到人体局部的穿透成果。(4) 最初将blend之后的数据上屏,失去最终的穿人成果如下图: 三. 工程上的优化要达到一个最优的显示成果,在产品中落地,工程上要做大量的优化。2018年优酷也有团队做过尝试,过后遇到的种种问题最终没能上线。这些问题咱们在落地过程中也都遇到,并都解决掉了。上面举几个例子:1 人体边缘突兀、不天然 能够看一下下面截图,因为边缘处没有解决好,导致人物头发、眼部的弹幕文字显得特地突兀不天然。2 视频与弹幕宽高比不同时导致弹幕mask错位 如上图所示,弹幕是全屏的,视频画面会依据视频的宽高比等比缩放,个别左右两端或高低两端会留黑。如果拿到视频的人体轮廓数据间接往全屏弹幕上贴的话,产生的就是上图成果,弹幕mask错位。所以,每一帧人体轮廓数据,咱们不能间接贴到弹幕下来做blend,而须要依据两者的尺寸比例差去调整贴图的坐标。3 性能相干问题弹幕对性能十分敏感。好多因素会导致弹幕渲染性能的降落,频繁切换render target是导致渲染性能急剧下降的次要因素之一。咱们以这一因素为例解说一下咱们是如何做优化的。因为不是每一帧都有轮廓数据,在没有轮廓数据时,弹幕须要间接上屏,这时就会波及render target的频繁扭转。因为每一次扭转,相当于一次render pipeline的重建,对性能会有肯定的损耗。render target的频繁扭转会导致渲染性能的急剧下降,从而产生弹幕画面卡顿、抖动等景象。为了解决这一难题,咱们采纳一种比拟tricky的做法:针对须要做弹幕穿人的场景,咱们把渲染管线固定为始终有弹幕穿人的mask。在某一帧视频画面没有人体轮廓数据时,咱们会拿一个1x1的假数据作为伪mask,而后去跟弹幕数据做blend。这样既不会对弹幕画面产生任何影响,也不会减少渲染耗时,从而十分无效解决了频繁切换render target导致的性能急剧下降问题。目前发现的影响弹幕穿人渲染性能的其余问题,咱们也都一一解决了。 **查看系列文章:优酷挪动端弹幕穿人架构设计与工程实战总结PixelAI挪动端实时人像宰割 四. 参考**https://developer.aliyun.com/...https://www.khronos.org/openg...https://developer.apple.com/l...https://developer.apple.com/m...https://developer.apple.com/d...

June 8, 2022 · 1 min · jiezi

关于渲染:5G实时云渲染让元宇宙应用触手可及

从2021年初被称为“元宇宙第一股”的罗布乐思(Roblox)正式在纽交所上市,到2021年10月Facebook更名为“Meta”发表进军元宇宙,再到现在各大厂在元宇宙赛道上争相布局,“__元宇宙__”的话题频繁地呈现在人们的视线里,各界对其的探讨堪称是七嘴八舌,各执一词。 其实精确地说,元宇宙并不是一个新概念。这更像是一个经典概念的新生,它是在云计算、扩大事实(XR)、数字孪生、区块链等簇新技术下的进一步交融。 <center>(图片来源于网络)</center> 经济学家朱嘉明认为,“__元宇宙__ 是一个平行于事实世界,又独立于事实世界的虚拟空间,是映射事实世界的在线虚拟世界,是越来越实在的数字虚拟世界”。 清华大学新闻学院沈阳传授则示意,“__元宇宙__ 自身不是一种技术,而是一个理念和概念,它须要整合不同的新技术,如5G、6G、人工智能、大数据等,强调虚实相融。” 而要进入元宇宙,这 六大撑持技术 必不可少,它们别离是区块链技术、交互技术、物联网技术、网络及运算技术、人工智能技术、电子游戏技术。 <center>(图来自“头豹”)</center> 交互技术:通往元宇宙的实现门路在这几个撑持技术中,交互技术能够说是元宇宙的外围局部,是通往元宇宙的实现门路,甚至很多人认为基于高度沉迷式的扩大事实(XR)实现的虚构游戏宇宙是元宇宙倒退的终极状态。 VR虚拟现实技术——VR等显示技术为元宇宙用户带来更沉迷式的体验,VR目前应用残缺的头显而不是眼镜,可让用户沉迷在360°虚拟世界中。 <center>(图片来源于网络)</center> AR加强事实技术——AR头显以事实世界的实体为主体,借助数字技术帮忙元宇宙用户更好地摸索事实和虚拟世界。 <center>(图片来源于网络)</center> 而无论是VR、AR还是MR,背地的运行离不开元宇宙核心技术「实时渲染」,而传统的实时渲染依赖于本地的算力进行实时渲染,这个过程须要弱小的GPU和其余硬件,难以实现终端的轻量化,不利于构建弱小的元宇宙。 实时云渲染:突破空间枷锁的利器随着智能网络技术「__5G、云计算__」的倒退,__实时云渲染技术__ 突飞猛进,也成为了元宇宙外围撑持技术之一。 由瑞云科技推出的3DCAT实时渲染云基于云计算理念,将XR利用部署在云端运行,云端资源进行图形数据的实时计算和输入,并把运行后果用“流(Streaming)”的形式推送到终端进行出现,终端用户可随时随地交互式拜访各种XR利用,无论何时何地,均可突破时空枷锁,畅享元宇宙的世界。 这是因为,咱们把十分重的图形计算放到云端,云端服务器能够配置较高端的GPU设施,通过云端服务器进行计算,进行实时编码,编码后将其“流化”,通过网络,把计算结果实时推送至终端(例如手机、PC、平板和XR设施)。 咱们在终端做出的任何交互动作(比方手指滑动屏幕、PC上点击了一下鼠标等)的信号也是通过网络实时地传输到云端服务器,云端服务器接管到信号再通过云端计算后将计算结果回传到终端。这个过程在网络好的状况下能够在 100毫秒 以内实现,空间的解放将被彻底突破。 「重云端轻终端」的云渲染将更多的图形算力、存储等需要放到云端,终端对于图形算力、存储硬件配置要求大幅升高,为终端交互硬件轻量化、便携化提供了根底SaaS级反对,同时也是对终端硬件制作老本的优化,推动元宇宙生产级硬件的疾速浸透,进一步减速元宇宙的遍及。 3DCAT实时渲染云的“公”“私”赋能通过私有云进入元宇宙云计算波及的概念比拟多,比如说云计算、雾计算、边缘计算等。通常所说的云计算,个别指的是私有云计算。 3DCAT实时渲染云公有化构造是指XR利用云渲染服务,以自研云流送技术为外围,利用云端海量GPU算力资源解决沉重的图像渲染计算,并串流同步输入到终端设备从而实现终端设备的轻量化,满足客户随时随地跨终端、可交互、超高清、沉迷式拜访XR利用的需要。 <center>(3DCAT私有云计划架构图)</center> 通过公有云进入元宇宙目前,对于对成果及安全性要求较高的公有单位,比如说军事院校等,云渲染能够提供公有云方面的服务,实现私有化部署。 云渲染私有化部署计划将三维内容部署在公有云上,利用公有云进行实时渲染,克服终端运行艰难的瓶颈。通过局域网形式拜访相应资源,实现私有化部署。云渲染私有化计划适宜对画质要求高、平安要求高、稳固要求高的用户,在局域网环境下,私有化计划可能最大限度施展实时渲染的平台劣势,让用户体验最好的成果。 <center>(3DCAT公有云计划架构图)</center> 云渲染私有化计划可提供软硬一体部署形式,一站式解决客户终极需要。硬件品种丰盛,可依据用户需要灵便配置。 <center>(3DCAT私有化部署计划劣势)</center> 不同行业解决方案目前,3DCAT实时渲染云已在 汽车三维可视化、修建家装工程、衰弱&医疗仿真、虚构仿真教学实验 等畛域提供业余的技术服务,为不同行业迈入元宇宙做后盾。 (1)汽车行业 元渲染技术可帮忙车企解脱了传统借助文字、图片、视频等单向输入信息的宣传形式,3D交互式看车实现了用户和车辆之间的深度交互,加深消费者对汽车的理解,减速决策过程,晋升电子商务成单率。 <center>3DCAT案例:奥迪3D汽车选配零碎</center> (2)修建家装行业 将基于游戏开发引擎(Unity、 UE4)制作的超高清可交互三维可视化修建家装内容进行云端计算渲染,并通过网络及串流技术,实时推送到终端。用户在线上就能够浏览屋宇全貌,也能够步入房间查看细节,除了沉迷式体验外,还能够失去房间的长、宽、高、年限、周边配套等全方位数据展现,便于全面把握房屋信息。 <center>3DCAT智慧看房</center> (3)医疗衰弱行业 应用3DCAT实时渲染云,医疗机构只需提供仿真课程资源,部署、云服务、机房、网络等均由我司实现,提供统⼀接⼝服务,在实训基地的轻量化终端上,实现⼀键接⼊,满足多用户高并发在线拜访服务。 福建水立方三维数字科技有限公司通过应用3DCAT实时渲染云服务,搭建对立的医疗虚构仿真护理平台,让学校对立入驻云服务,上传虚构仿真教学利用,即点即用,解决学校因为设施老旧无法访问操作精美课程教学的问题,真正做到了将凋谢共享利用于日常教学过程中,实现终端轻量化共享学习模式。 <center>福建水立方医疗虚构仿真护理平台</center> (4)教育行业 3DCAT实时渲染云能够为学校/企业提供仿真课程的各种云端资源,提供统⼀接⼝服务, 不便校企搭建对立的在线培训平台。 深圳职业技术学院携手3DCAT实时渲染云服务推出5G+XR智慧校园——构建虚实一体沉迷式智慧校园,为各地师生提供在线虚构仿真教学反对,实现5G+VR/AR/MR 沉迷式教学。 <center>走进慕尼黑-利用MR技术创设情境</center> <center>VR课堂-学生热情高涨</center> <center>课程资源-学习者随时随地可拜访</center> ...

April 29, 2022 · 1 min · jiezi

关于渲染:实时云渲染有哪些优势

随着元宇宙的衰亡,作为六大核心技术之一的实时云渲染技术引发了激烈的探讨。很多还在应用传统实时渲染的小伙伴们就有点蠢蠢欲动,试了到底是不是真的好用?每当新事物呈现时,总有人会踌躇,然而越是踌躇越可能赶不上返回元宇宙的首班车,当初我给大家讲讲实时云渲染的劣势。 一、设施轻量化 因为GPU对机箱空间有要求,本地渲染往往须要携带惨重的服务器工作站返回场地提前拉线和部署,耗时耗力。 3DCAT实时云渲染只须要任何能够关上链接的联网设施,例如Windows、Mac、iOS、Android & Browser、AR/VR设施,利用内容以视频流的形式推向终端,缩小设施投入,能够实现终端无绳化、挪动化,尤其对于VR一体机来说,极大解放了用户的应用限度; 二、老本低廉化 本地渲染须要洽购低廉的设施,最新的RTX显卡须要上万元,算上其余的整机,几万的设施能力反对良好的实时渲染画面,而在云端进行实时渲染,只须要折合几元到几十元每小时的应用费用,便可领有画质极高的云端3D渲染服务。不须要关怀各种网络硬件高级词汇,无需繁琐配置,省下了金钱老本,更省下了工夫老本,毕竟对于工作来说,工夫就是生命,同时咱们也该当留神到,画质的降级始终在继续产生,本地渲染时,每次晋升配置需淘汰原有旧配置,又是一笔大开销。而实时云渲染则能够在后盾一键配置低端、中端、高端等多种显卡计划,无需淘汰旧设施,0额定折旧费用思考。 三、协同能力智能化 传统的本地电脑装置大量软件和插件进行渲染,一方面是十分轻便繁琐,最重要是在疫情背景下无奈与远方的合作伙伴同步观看同一画面,不利于合作,而3DCAT实时渲染云将所有操作稀释进一个链接中,多人关上同一链接,即可实现多人同屏互动性能。全新推出的「投屏」性能还能反对切换不同操作人,极大解决了实操展现的需要,不便及时处理我的项目或与寰球合作伙伴共享我的项目。 四、画质全面提高 目前中国的5G技术正在减速倒退,5G网络领有增强型挪动宽带、超高牢靠低时延通信、海量机器类通信三大技术特点。网络已不再束缚咱们体验到极佳的画质品质。 因而在3DCAT实时云渲染自研串流和编码压缩技术加持下,最高反对4k@60fps,分辨率主动获取,码率、FPS等参数可调节,能够说,这样的体验与本地所反对的参数相差无几。且3DCAT在云端部署了最新的NVIDIA RTX GPU,基于PBR物理拟真渲染,出现犹如事实世界的品质,展示真切光影和细节。 五、数据安全更有保障 如果是传统的本地实时渲染,往往须要事后下载插件、大型可执行文件或内容文件,在携带这些文件的过程中,失落的危险异样的高。且携带着大型设施,设施被物理毁坏或者散热反常导致死机的可能性更加大,这将对业务产生毁灭性影响。 而对于实时云渲染而言计算模型和数据都部署在云端,对于客户端来说这是一种“零装置”的解决方案。最终用户不须要事后下载插件、大型可执行文件或内容文件,不须要装置任何货色。用户所生产的仅仅是流化数据——就像视频流一样。数据并不会下载,因而也就没有某些用户可能放心的平安问题了。同时,用户与利用数据隔离,云平台本身也领有多重保障; 3DCAT云端实时渲染服务器均搁置在高行业标准的数据中心,领有 T3+ 等级,通过了国内ISO认证,领有9级以上抗震构造,全年无休运维服务,节点机的机柜铜墙铁壁,物理因素不会影响到用户业务,客户无需操心机房内经营保护的繁琐工作。 六、随时随地的跨平台体验,不受工夫、地点、终端设备限度 实时云渲染只须要三个步骤,上传XR利用(exe),生成利用拜访形式(例如链接),后便能够即可在多种终端和零碎上运行。领有实时云渲染,无论你在哪里,都能够通过共享的URL或XR利用程序界面轻松拜访超高清的XR内容,并领有交互体验,一次公布,多终端拜访。 综上所述,能够发现实时云渲染在这项将来的技术拥有者举世无双的特色和劣势,必然是元宇宙的将来核心技术。3DCAT实时渲染云将继续提供优质的实时云渲染服务,基于云端弱小的图形渲染算力,渲染XR利用并实时推送到终端,为用户提供私有云+公有云解决方案,一键赋能元宇宙 当初注册,立即享受125分钟实时云渲染体验:https://app.3dcat.live/register

April 26, 2022 · 1 min · jiezi

关于渲染:react拖曳组件reactdnd的简单封装使用

分享起因因为我的项目中须要应用拖曳组件(需要:全局,跨组件,跨数据),我抉择了react-dnd 概念React DnD 是一组 React 高阶组件,咱们在应用的时候只须要将指标元素进行包裹,就能够实现目标元素具备拖动或承受拖动的性能。它将整个拖动的事件残缺的形容了进去,这使得咱们在应用的过程变得简略易用和扩大上有了有限的可能,在解决简单拖曳和丰盛需要的时候强烈建议应用它。官网 https://react-dnd.github.io/r... 根本Item type:跟redux或其余组件一样,item用来形容拖动dom的数据对象,type用来标识一组可拖动和接管Backend:用来体现dom拖动景象,我应用了HTML5BackendMonitors:用来查问以后拖动状态(数据,dom,地位等),弱小的收集性能Connectors:用于Backend和组件状态之间的连贯hook:useDrag 将组件作为可拖动的起源注册到dnd useDrop 将组件作为可接管拖动起源注册到dnd 应用办法导入 npm install react-dnd react-dnd-html5-backend 初始化 import { HTML5Backend } from 'react-dnd-html5-backend'; <DndProvider backend={HTML5Backend}> .... </>组件参数type.ts export type DragProps = { name: string; //名称标记 type: string; //暂用于标记拖拽类型,接收者和发送者统一 role: string; // data: any; //绑定的数据用于拖曳后操作数据 content: JSX.Element; //绑定的元素 onDragFinished: Function; //拖动完结回调.};export type AcceptorProps = { name: string; //名称标记 type: string; //暂用于标记拖拽类型,接收者和发送者统一 role: string; // data: any; //绑定的数据用于拖曳后操作数据 content: JSX.Element; //绑定的元素 styleType: 'background' | 'border'; // customStyle:{ // canDrop:string, // isActive:string // } onHover: Function; //移入区域.};组件MyDrag.ts ...

November 26, 2021 · 3 min · jiezi

关于渲染:渲染引擎分析-鸿蒙OpenHarmony-JS-UI-源码阅读笔记

作者:门柳 鸿蒙是华为研发的新一代终端操作系统,能实用于 IoT、手表、手机、Pad、电视等各种类型的设施上,扛起“国产操作系统”的大旗,也蒙受了很多非议。2021 年 6 月初公布了 OpenHarmony 2.0 Canary 版本,开源了更多子系统的代码,反对内存 128MB 以上的设施。其中就蕴含了新版本的 JS UI 框架,本文重点剖析这部分代码。(文章内容仅供参考,如有任何形容不精确的内容,感激大家后盾留言探讨与斧正~) 鸿蒙零碎概述零碎架构分层倡议去 OpenHarmony 官网[1] 上理解更多信息,上面是官网的技术架构图: 总结一下分为:应用层、框架层、零碎服务层、内核层四个局部。内核层次要是宏内核的 Linux 和微内核的 LiteOS,以及各项硬件驱动程序。框架层和零碎服务层分割比拟严密,有横向的框架和纵向的服务,细分成很多绝对独立的子系统,UI 框架和 Ability 框架都在这里。 留神这是 OpenHarmony 的架构,不含 GMS 和 HMS、不含 AOSP 也不反对安卓 API,与华为手机中推送的 HarmonyOS 版本是有差异的,下文开展比照。 HarmonyOS 和 OpenHarmony 的区别中文名都叫做「鸿蒙」,背地还是有一些区别的。HarmonyOS 是华为研发的商用操作系统,OpenHarmony 是华为募捐给凋谢原子开源基金会(OpenAtom)的开源版本,两个版本之间有穿插局部,概念上有混同,所以很多探讨都在“自研”和“套壳”之间摇摆不定。 我尝试整顿了各项概念之间的关系,如下图所示。非官方图,仅供参考,所有以官网口径为准。 首先鸿蒙利用是打包成 HAP (Harmony Ability Package) 格局散发的,和安卓 APK 一样都是压缩包,包构造大同小异。散发到端上之后,对立由鸿蒙(概念)的 API 承接,而后就分了不同的模式。在华为手机上推送的鸿蒙版本,能够无感兼容安卓利用,必定是依赖了 AOSP 的。而开源的局部次要面向低端的 IoT 设施,或者手表手环之类的,甚至能够没有屏幕,2021年6月开源的版本刚反对了内存 128MB 以上的设施,还无奈独立撑持手机上的利用。这是“套壳”和“自研”的两个极其场景,都未必是稳固的最终状态。而介于两者之间,总架构里框架层和零碎服务层的各项子系统,是比拟独立解耦的,能同时用在这些场景中,然而性能还不够健全,一部分曾经开源了,比方微内核和 JS UI 框架,还有一部分未开源。兼容安卓不是长久之计,开源局部性能简陋,那么两头不确定的这一块会不会是将来的主链路呢?鸿蒙将来会不会真的倒退成一个自主研发的全平台操作系统呢?刮目相待吧。 那么能够尝试答复社区里探讨鸿蒙最多的问题: 鸿蒙是不是自研的?必定有自研局部,也必定依赖一些(国外)三方代码。 现阶段要求所有代码都自研是不事实的,不是一两年能实现的,必定要先站在伟人的肩膀上施展翻新,而后进一步缩小依赖,解决好协定和版权问题即可。 ...

September 7, 2021 · 4 min · jiezi

关于渲染:鱼眼特效

模仿鱼眼特效,即实现视觉球形突出的成果。原理 不限度畸变水平 向量oc‘与弧DC占整个直径与弧度的比例相等 $$r*asin(len(oc')/r)/(pi*r)=fac/(2r)$$ 限度畸变水平 待更新

July 19, 2021 · 1 min · jiezi

关于渲染:如何更快地渲染深入了解3D渲染性能的指南2

如何更快地渲染-概述: 我将把本文分为两个次要局部: 能够优化的外部渲染因子能够优化的内部渲染因子您会发现外部渲染因子与您想要更快地优化/渲染的场景严密相干,须要更改场景元素和渲染设置。 另一方面,优化内部渲染因子基本不须要或简直不须要更改场景。这些是内部因素,例如整体硬件性能或渲染管理器拾取场景的形式。 您能够优化两者中的任何一个并取得不错的减速,或者能够同时解决外部和内部因素,并看到渲染工夫缩小得更多! 工夫至关重要,所以让咱们开始吧! 如何更快地渲染-方法论有两种办法能够解决此问题:您能够试着尝试以下某些我的项目,心愿对您有所帮忙,或者能够剖析场景和环境,而后利用正确的修复程序。 后一种抉择所需的步骤很简略: 1、找出为什么场景渲染如此迟缓的起因 2、修理它 这又使咱们想到了另一件事:相对而言,“慢”是什么? 您的场景可能会进行十分杰出的优化,您的硬件是最好的,然而您对领有数百万棵树的森林进行25K全景渲染仍须要5分钟吗? 好吧,思考到场景的复杂性,这实际上一点也不慢。但这不是您在这里的目标,对吧? 您心愿场景的渲染速度比当初快,这就是咱们将要实现的指标。 这使咱们回到减速场景的两个步骤,并将其更改为: 1、找到须要起码工夫和金钱来解决的最大瓶颈 2、修理它 这次介绍差不多实现了,只是一件事:我置信您会在您的职业生涯中构建更多的3D场景,并在未来从事许多我的项目。从创立任何我的项目的一开始,就须要将本指南中的想法利用到整个我的项目中。 不要在最终须要进行渲染时才进行优化,要在构建场景时就思考视口或渲染性能的优化。 可能更快地渲染,使您在解决场景时能够更频繁地进行迭代,提高质量,缩小破费的工夫,最终使你成为一个更具竞争力的3D艺术家。从长远看来,能够使您要求更高的费率或更高的薪水。 渲染引擎如何工作咱们将从高层次的角度开始钻研渲染引擎的工作原理,以及如何减少渲染工夫以更好地指出为了使场景渲染更快而须要更改的内容。 为了简略起见,我能够这样说:一般来说,在任何给定场景中,咱们只有3种类型的对象: 发光的物体,例如灯或太阳物体反射和折射光的水平不同咱们认为的相机实际上,咱们的事实世界是相似构建的,咱们的眼睛有时是照相机。 渲染引擎“渲染”或计算3D场景的外观,与咱们理论的世界十分类似。 像太阳一样的光源收回的光会从一个或多个外表反射,直到射入咱们的眼睛,而后产生的光使咱们以不同的形式看到物体。 渲染时,您的计算机必须认真地“计算”真实世界中由物理实现的操作。 例如,采取从外表反射的光线。计算机必须计算以下内容: 光线从物体以什么角度反弹排汇了多少光线多少光线沿不同方向或进入外表散射多少光被反射或折射那只是一个简略场景中的一条光线。设想一下,计算机必须为场景的每个外表计算很多很多光线。 侥幸的是,PC的CPU(处理器)和GPU可能疾速且十分善于进行此类计算,比咱们的人类要好得多,特地是GPU(图形卡或视频卡)是针对此类图形和“光线跟踪”定制的”计算。 当初,咱们须要做什么? 只管咱们能够更深刻地钻研渲染引擎的工作原理,然而下面的形容应该曾经足以剖析和优化场景以更快地渲染: 因为渲染引擎所做的大部分工作是在场景中拍摄一束光线,而后从物体上反射回来,因而咱们曾经能够得出以下论断: 渲染无噪图像所需的光线越少,渲染过程将实现得越快“无噪音”:这是一个新名词,咱们将疾速介绍一下: 您最有可能看过它。低质量渲染的图像不平滑或不清晰。它们到处都是噪点或颗粒,因而很难分辨细节。 起因很简略,这是本文所须要的入门实践的最初一部分,所以再多花一点工夫。 这是乐音的起源以及咱们如何打消它: 任何图像(是否渲染)都由像素组成。渲染引擎为每个像素采样。 为了简略起见,咱们将其搁置在场景相机中的渲染引擎通过每个像素拍摄一束光线,而后晓得该特定像素前面的内容。这也称为“采样”。 射出光线穿过像素并击中木头,那里有木头。射出光线穿过像素并找到金属,图像的那个区域中有金属。很简略。 然而,这是重要的局部:像素不是一维的,而是二维的。基本上,每个像素都是一个二维正方形。一堆正方形在一起就是图像。 那么为什么这很重要?因为咱们穿过一个像素来查看背地3d场景中的光线或样本是一维的。为了取得像素整个正方形区域前面的平均值,咱们将必须通过该像素和每个像素发射多条光线(采集多个样本)。 举这个例子: 图像起源:维基百科 如果咱们仅通过X射线照射到橙色三角形,则渲染引擎会认为整个像素都被橙色三角形填充/笼罩,而实际上它仅笼罩了该像素的右下局部。 通过对该像素进行屡次射线/采样,咱们将晓得该像素的90%实际上是红色/灰色而不是橙色(有些也是绿色的)。因而,应用多个样本,咱们能够扣除该像素的均匀色彩。 因而,如果咱们每个像素仅应用一个或大量样本,则咱们不齐全晓得整个像素背地是什么,而在采样样本的一维点之后。 后果:咱们的谬误阈值很高,并且咱们失去了嘈杂的图像。 咱们通过每个像素拍摄的样本越多,误差阈值或噪点阈值就越低,并且最终图像的颗粒度也越小。 !那是对渲染理论工作形式的外部运作的一次考查。 当初请记住,所有渲染引擎都有本人的优化某些事物的办法,并且有一些办法能够伪造或优化某些过程,然而对于任何渲染引擎,通用性能都能够被广泛应用。 您对场景进行的采样越多,后果越平滑。 咱们也能够这样说:如果场景中没有太多事件产生,那么与场景中充斥了简单物体,简单资料或简单照明的状况相比,您将可能取得更少的样本。 未完待续...

January 20, 2021 · 1 min · jiezi

关于渲染:渲染引擎Blender的2021年最佳渲染引擎下

上篇文章《【渲染引擎】Blender的2021年最佳渲染引擎(上)》介绍了Blender的Cycles、Eevee、Workbench和OctaneRender这四种渲染引擎。本文咱们将持续给您介绍Blender的其余渲染引擎。(Renderbus瑞云渲染反对Blender渲染引擎~) Blender的2021年最佳渲染器(渲染引擎)LuxCoreRenderLuxCoreRender不仅是街机上最古老的,无偏见的,物理上正确的渲染引擎(承载着可追溯至2007年的古老LuxRender的外壳),它也是性能最弱小的引擎之一。LuxCoreRender也是一个开源我的项目,在这方面使其成为Blender的一种相似的精力。 LuxCoreRender的设计理念是在计算渲染时无障碍,齐全物理准确的模型。 开箱即用的后果是一些最令人印象粗浅的渲染。它甚至比“传统”门路追踪用具有更多的功能集,即便在最具挑战性的场景中也能够计算光线信息,因而它的性能更为弱小。 这使得LuxCoreRender在渲染场景时具备难以置信的弱小性能,重点放在折射强烈的物体,焦散或暗淡的室内。 它还具备轻分组性能,这时循环重大缺失。 尽管这种不斗争的办法最后意味着费时的渲染工夫,但性能和GPU渲染的更新以及弱小的降噪性能极大地提高了渲染性能。 LuxCoreRender还能够与Blender一起很好地工作,它能够作为插件应用(与Octane不同),并且能够解析Cycles材质节点(只管它的确领有本人的节点以获得最佳性能以及材质库!) Radeon ProRenderRadeon ProRender是AMD的收费Path-Tracing渲染器。 它以其翻新的“全频谱渲染”模式将本人定位在Cycles和Eevee之间。 此模式利用其Vulcan API后端,可将栅格化(例如Eevee)和光线跟踪(例如循环)联合应用,以创立视觉吸引人的渲染,同时仍具备交互式实时视口体验。 在实践中,将光线跟踪的元素(例如反射和暗影)与光栅化的根本图像联合在一起,尝试实现完满的折衷方案。 ProRender具备功能强大的Blender插件,该插件随附材料库以及Cycles-to-ProRender节点转换器。 只管在此阶段它可能不像Cycles那样残缺,但事实证明,此渲染器是与前述“全光谱渲染”一起用于独特性能的十分乏味的测试平台。 具备杰出的性能,例如“每秒采样数”性能,能够管制视口帧频,6000系列AMD卡上的硬件加速光线跟踪,疾速雾化选项等等。 右上角的混合渲染性能是Full Spectrum Rendering的成名之举,它将光栅化的根本图像与光线跟踪的反射和暗影相结合。 BeerBeer渲染引擎建设在Malt后端之上,是Blender NPR社区众筹的收费和开源的Blender实时非PhotoRealistic(Or NPR)渲染引擎。 Beer渲染引擎是Blender渲染器场景的一个绝对较新的成员,因为它是从头开始设计时就思考到Blender的性能,因而它与Blender完满集成。 它的目标是通过易于应用的图层零碎和更基于NPR着色器的基于特色的着色来从新组织着色器,从而扩大Blender的风格化渲染性能。这意味着,当应用Beer渲染NPR场景时,能够找到能够联合应用的“边缘光”、“轮廓”、“柔边卡通”着色器。 然而,这种易用性通过弱小的可扩展性失去补充,着色器很容易被黑客入侵并能够批改为新的着色器。Beer仍处于倒退阶段,如果您违心,能够为Beer筹款做出奉献。 Blender的其余和行将推出的渲染器在咱们关注的各个开发阶段中,有几个驰名的渲染引擎与行将到来的Blender集成在一起。 RendermanRenderMan是Pixar屡获殊荣的渲染引擎,并发表将反对Blender。 凭借其重要的版本24,它将是第一个蕴含GPU渲染的工具,这是早先被称为Blender Bridge Tool版本的一个受欢迎的补充。 Blender Bridge Tool是Blender的一个较旧的,不再保护的Renderman插件的继承者,承诺提供更严密的集成,包含视口渲染,灯光链接和灯光混合反对,ILM的LAMA着色器反对,甚至反对油脂铅笔。 Redshift for Blender电影和电视节目(例如Starz American Gods)中应用的功能强大的GPU渲染器Redshift行将来到Blender。 目前,所有Redshift许可证持有者都能够应用Beta版的Blender插件。只管插件的以后迭代短少一些性能,例如灯光链接和静止含糊,但开发仍在持续,直到Blender插件与引擎达到性能雷同。 Redshift凭借其有偏差的架构(就义了计算精度以进步速度)而领有基于GPU的疾速渲染能力。 它提供了大量的管制和自定义选项,以磨合您在渲染时所需的准确的视觉保真度和速度。 同时提供令人印象粗浅的功能集,例如体积渲染、头发渲染、镶嵌和置换、专用皮肤着色器等。 英伟达Omniverse英伟达公布了Omniverse,它是基于美元的内容创立/渲染混合体。 只管内容创立模块的合作模式及其集成的GPU减速的动静模仿令人印象粗浅,但至多能够说,渲染模块是咱们特地感兴趣的。 Omniverse的渲染模块被称为“ Omniverse RTX Renderer”,利用Nvidia硬件和软件渲染技术的最新更新,在视口中进行实时光线追踪。坦率地说,开箱即用的后果令人印象粗浅,麻痹的速度。 Omniverse的渲染模块还处于起步阶段,其性能还远远不够欠缺,它依然必须在生产环境中进行证实,但这曾经是一个十分有心愿的开始。 Nvidia正在与Omniverse进行Blender集成,只管到目前为止还没有公布音讯。 AMD的USD Hydra附加组件AMD为Blender公布了USD Hydra附加组件,从Blender的渲染后劲方面看,它无望成为扭转游戏规则的人。 Hydra是Pixar开发的框架,是其美元生态系统的一部分。Hydra充当DCC之间基于USD的接口。与Hydra框架进行通信的渲染器称为Hydra Render Delegates,它容许3D内容创立程序包通过Hydra插件托管多个Render引擎。 实际上,通过Hydra插件,Blender当初能够托管所有具备Hydra Render Delegate版本的渲染引擎,包含ProRender,RenderMan,Arnold,Octane,Redshift等。 ...

January 15, 2021 · 1 min · jiezi

关于渲染:渲染引擎Blender的2021年最佳渲染引擎上

Blender最终解脱了“乖僻的孩子”的装束,并穿上了更为庄重和受人尊敬的“ 3D强人”。 它已在业界取得宽泛认可,许多工作室和艺术家正在将其纳入他们的产品线。 您会问,动画工序末端的闪亮内容是什么? 好吧,它是渲染!当然,Blender的生态系统并不短少功能强大的渲染解决方案。Blender自身包含三个现成的多功能渲染器,还有更多来自第三方的渲染器(Renderbus瑞云渲染农场反对Blender)。 在本文中,Renderbus云渲染农场将介绍所有这些渲染器。 Blender的2021年最佳渲染器(渲染引擎)Cycles首先,是Cycles渲染器。Cycles是Blender中性能最丰盛,通过生产验证的渲染器。 这是一个门路跟踪引擎,这意味着它特地擅长于再现场景四周反弹的光的复杂性并与其中的各种元素进行交互。 它曾经在许多电视和电影制作。 Cycles领有丰盛的渲染性能,包含弱小的PBR着色节点,准确的公开散射,矢量位移和自适应细分,体积散射和排汇,焦散,明码遮罩反对等等。 Cycles失去了严格的保护和更新,最近的倒退集中在严格的优化上。 这使得Cycles在其曾经令人印象粗浅的功能集之上成为了一个绝对较快的门路跟踪器,尤其是在增加了OptiX技术的渲染之后,使其能够利用RTX内核来大大提高渲染速度。它还具备多个视口和渲染降噪器,包含弱小的OIDN(CPU)和OptiX(GPU)降噪器。 它还具备对Nvidia和AMD GPU的多GPU渲染反对,以及带有图块窃取性能的GPU + CPU“混合”渲染反对。 话虽如此,Cycles的确有其局限性。 目前,在caustics等畛域,LuxCoreRender在速度和准确性方面均胜过它。它还短少轻链接,这是许多间接竞争对手中都十分须要的性能。 通过将其移植到其余3D软件的插件(例如Insydium的Cycles4D),Cycles曾经证实了其胜利,该插件将Blender的渲染引擎引入了Maxon的Cinema 4D。 EeveeEevee最后是作为Blender的“实时”视口设计的,目标是成为帮忙其老兄Cycles的着色工作流程的预览工具,现已成为本人的野兽。 Eevee是Blender的实时栅格化渲染引擎,它代替了Blender 2.80中的Blender Internal渲染器。 自公布以来,Eevee始终风行一时,只管它是栅格化引擎,但下一个演示却展现了其弱小性能。 只管它永远都无奈击败门路跟踪引擎,尤其是在“全局照明”、“折射”和“焦散”等畛域,但Eevee仍领有弱小的功能集,以其极高的疾速渲染速度而著称: 体积渲染、次外表散射、头发反对,用于NPR着色的弱小的Shader-to-RGB节点,以及最近增加的Motion Blur和Cryptomatte反对。 Eevee以后的开发周期专一于填补其性能集中的空白,以使其齐全能够用作生产渲染选项,并且Blender Animation Studio宽泛地在Coffee Run短片上宽泛应用它。 Eevee的最大力量是速度。 这是以就义其最大毛病为代价的,这正是其光栅化设计的实质: 反射、折射、接触暗影等都是“屏幕空间”成果,这意味着没有真正的门路跟踪性能能够计算出超出渲染屏幕的光弹。 这可能会使实现真切的渲染更具挑战性,尤其是与其更准确但门路跟踪弟兄比较慢的渲染。 Workbench该Workbench引擎是“规范”的发动机提供能源Blender的视口。 它的主要职责是在执行纹理/着色/光照/渲染之前的所有工作时放弃安稳的性能。 然而,这并非全是灰色暗影,因为Workbench具备一些弱小的性能,旨在在视觉上帮忙用户实现多种工作,例如cavity 渲染、matcaps、轮廓和X射线选项。 一些冒险的用户甚至试图驯服Workbench引擎,使其迅速吐出“实现的”渲染,但这并不是出于胆大或容易实现的目标。 TrollTew设计的Stoner与Workbench引擎一起渲染 Blender的OctaneRenderOctaneRender首次公布时是GPU渲染畛域的先驱之一,自那当前就成为功能强大而又疾速渲染的妇孺皆知的名字。 这是一个无偏见的、频谱正确的渲染引擎,它在最大水平上充分利用了RTX硬件,能够在视口中以极快的速度渲染精确的图像。 它具备分层资料(与手动混合着色层相同),具备齐全Nuke集成的光谱随机行走次外表散射、体积渲染或深像素渲染等性能。 针对较大场景优化了外围外几何图形,以及两个新的“ Vectron”和“ Spectron”模块,可渲染十分大的程序几何图形和体积。 侥幸的是,对于Blender用户,Octane提供了其Blender插件的非凡收费层,但须要留神的是,上述收费版本仅反对一个GPU。 该插件采纳非凡的Blender外部版本的模式,可间接下载,并内置了OctaneRender引擎,这对于日常构建Blender高级用户而言可能会带来不便。 另一个正告是,Octane带有本人的着色器节点/编辑器,因而Cycles材质不会主动移植到OctaneRender。 然而,都是基于PBR的渲染引擎,着色器结构背地的逻辑足够靠近,足以使着色器(至多基于图像纹理的着色器)的移植足够简略。

January 14, 2021 · 1 min · jiezi

关于渲染:服务端渲染搭建示例

前言局部开发者在着手搭建自建渲染服务时会产生一些疑难,本文以我司云渲染产品的架构进行举例,不便客户了解云渲染部署须要做哪些事件。 服务器环境和SDK部署首先下载SDK,并集成进开发环境中 http://www.seeshiontech.com/docs/page_8.html。 装置依赖首先须要禁用默认的显卡驱动sudo vim /etc/modprobe.d/blacklist-nouveau.conf 增加以下内容:blacklist nouveauoptions nouveau modeset=0 保留退出后,执行上面命令更新 kernel initramfssudo update-initramfs -u 重启之后,运行上面的命令, 查看nouveau有没有运行:lsmod | grep nouveau   没有输入代表禁用失效其次须要装置相干依赖apt-get -y install dirmngr apt-get -y install software-properties-common sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8CF63AD3F06FC659 add-apt-repository ppa:jonathonf/ffmpeg-4 apt-get update apt-get -y  --allow-unauthenticated  install ffmpeg apt-get -y install libfreeimage3 装置对应的显卡驱动模板治理局部后端将保护一个资源列表,保留着模板的压缩包以及config.json文件。在用户拜访前端页面时,将依据用户抉择的模板id返回模板的config.json文件给前端,前端将用这个文件生成编辑界面。 工作生成局部后端须要裸露一个web接口,这个接口会接管自前端提交来的渲染和用户相干的数据,前端上传好相干素材,将素材的下载连贯、文字内容、模板id提交到web接口中。 在后端接口接管到模板id、素材下载地址、文字内容后,可自行进行一些业务解决,尔后将组合好的工作数据推入一个队列中。 工作解决局部负责解决渲染工作的业务代码须要和工作生成的业务逻辑拆离开,可将编译好的渲染平台代码放在多个GPU服务器中运行。 渲染平台须要程序做以下工作。 监听渲染工作队列,抢占式获取渲染工作。筹备渲染数据:a.下载工作数据中的模板地址、图片素材、视频素材、音频素材b.将下载好的素材的本地门路以及渲染工作中的文字信息混合好,按官网中要求的replaceJson格局生成渲染工作数据 启动渲染,并期待渲染后果。渲染完结后向渲染后果队列中传入渲染后果告诉数据。服务监控局部服务监控平台将负责以下工作 继续监听渲染后果队列,在获取到音讯时,依据工作后果作相应解决。每隔一段时间查问最近时间段内的工作的失败状况

December 14, 2020 · 1 min · jiezi

关于渲染:3D渲染集群你了解多少

摘要:渲染是批处理运行模式,那能不能应用Docker容器技术,做大规模的渲染集群呢?咱们先说说3D渲染波及哪些畛域: 1、什么是3D渲染简略粗犷的讲:就是将虚拟世界里的3D模型,变为(人眼看到)立体图片。 比方你画了个3D模型,通过渲染,变成了最终咱们看到的图片: (3D模型) (2D图片) 2 、3D模型,怎么失去2D图片将一个设想的“摄像机”放到3D空间中,去拍摄图片。这个“摄像机”跟咱们的眼睛相似,它看到的就是2D的图片(视网膜上)。 墙裂倡议去看看这个教程:https://www.khanacademy.org/p... 所以简化后就是,一个“摄像机”+ 一个“视窗”。如下图: 画重点:从摄像位,收回一束射线,穿过栅格,打到3D模型上,并记录下击中的那个点的色彩。 反复上述步骤,扫描每个栅格下面的点,失去所有点的色彩。这就失去栅格最终的图片: 这种形式也叫光线追踪,这个词也比拟常见。 每张图片里的每个像素点,都是通过“摄像机”+“栅格”拍摄进去的。 3 、3D->2D 更简单的场景理论渲染状况下,并不只是这么简略,因为3D模型外表的色彩,会受到它四周的环境的影响。比方:3D模型的左近有个光源,3D模型的外表润滑水平等等。 所以即便你晓得“摄像机”收回的那束光击中了3D模型的地位,你也并不能马上失去该点的色彩(底色+烦扰=最终色彩)。 所以真正计算像素点的色彩,工作量还是十分大的。留神,这还是一张图片(一帧)的计算量,一部动画电影得有多少帧图片? 4 、完满的批处理工作一部电影由很多的帧组成,每一帧都由下面光线追踪算法计算出每个像素点的色彩。留神:每一张图片,都能够别离计算的,相互之间并不影响。 (每一帧,独自进行渲染解决) 渲染是创立 3D 模型并将其转换为 2D 图像的过程。 在 Autodesk 3ds Max、Autodesk Maya 和 Blender 等应用程序中创作 3D 场景文件。 Autodesk Maya、Autodesk Arnold、Chaos Group V-Ray 和 Blender Cycles 等渲染应用程序可生成 2D 图像。 有时,能够从场景文件创建繁多的图像。 然而,常见的操作是建模并渲染多个图像,而后将其组合成动画。传媒娱乐行业往往应用渲染工作负荷来生成特效 (VFX)。 广告、批发、石油和天然气及制作等其余泛滥行业也会应用渲染。渲染过程属于计算密集型工作;要生成的帧/图像数可能很多,而渲染每个图像可能须要大量的工夫。 因而,渲染是一个完满的批处理工作负荷,能够利用 Batch 类服务来并行运行多个渲染器。5 、渲染云厂商各大通用类云厂商,个别都是通过间接买买买,取得了云渲染的能力。 ...

August 25, 2020 · 1 min · jiezi

Life-of-a-Pixel浏览器渲染流程概要

本文是 Chrome 团队新人入职学习资料《Life of a Pixel》的概要版,首发于我的博客(点此查看),欢迎关注。原文 Slides 地址:https://bit.ly/lifeofapixel中文字幕演讲视频地址:https://www.bilibili.com/vide...《Life of a Pixel》内容讲的是开发者编写的 web 内容(也就是通常所说的 HTML+CSS+JS 以及 image、video 等其他资源)渲染为图形并呈现到屏幕上的整个过程。我将其演讲内容分为以下三个部分,第一个是静态渲染过程,讲述一个完整的从 content 到 pixel 的渲染过程;第二个是动态更新过程,讲述浏览器如何高效更新页面内容。 概览首先看一下整个过程的概览。在了解详细内容前,我们也大概知道浏览器最终是通过调用 GPU 完成像素到屏幕的绘制。但这个过程中有很多的步骤。注意概览图中浏览器的渲染进程是放在沙箱进程中由 Blink 处理的,这也是其安全策略。 静态渲染过程这一页的内容对于广大前端从业者来说应该都比较熟悉。首先是 HTML 通过 HTMLDocumentParser 转换为 DOM 树,CSS 通过 CSSParser 转换为 StyleRule 集。每个 StyleRule 包含 CSSSelector 和 CSSPropertyValue,当然二者间存在对应关系。再加上浏览器提供的每种类型元素的 DefaultStyle,经过一系列的计算(这一步称为 recalc)生成所有元素包含所有 style 属性值的 ComputedStyle,如右上角的图所示。ComputedStyle 也通过开发者工具和 JS API 暴露了出来,相信大家也不陌生。 接下来一步就是 layout。layout 的功能是根据上一步得到的所有元素的 computedStyle,将所有元素的位置布局计算好。每个元素在这一步会生成一个 LayoutObject,简单来说其包含四个属性:x、y、width 及 height 用于标识其布局位置。layout 最简单的情况就是,所有的块按照 DOM 顺序从上往下排列,也就是我们常说的流。layout 也包含很复杂的情况,比如带有 overflow 属性的元素,浏览器会计算其 border-box 的长宽和实际内容的长宽。如果设置为 scroll 并且内容超出,还要为其预留滚动条的位置。此外, float、flexbox 等布局也会使得 layout 变复杂。。所以为了解决复杂性的问题,layout 阶段浏览器首先会生成一个和 DOM 树节点大致一一对应的 layout 树,然后遍历该树,将经过计算后得出的位置布局数据填入节点。对于这个过程,Chrome 团队认为没有很好地分离输入和输出,因此下一代的 layout 系统会进行重构,使得分层更加清晰。 ...

August 17, 2019 · 2 min · jiezi

如何从请求传输渲染3个方面提升Web前端性能

什么是WEB前端呢?就是用户电脑的浏览器所做的一切事情。我们来看看用户访问网站,浏览器都做了哪些事情: 输入网址 –> 解析域名 -> 请求页面 -> 解析页面并发送页面中的资源请求 -> 渲染资源 -> 输出页面 -> 监听用户操作 -> 重新渲染。 通过上面的路径可以看出浏览器分为请求、传输、渲染三部分来实现用户的访问,本文就从这三个部分来浅析如何提升WEB前端性能。 一、请求浏览器为了减少请求传输,实现了自己的缓存机制。浏览器缓存就是把一个已经请求过的Web资源拷贝一份副本存储在浏览器中,当再次请求相同的URL时,先去查看缓存,如果有本地缓存,浏览器缓存机制会根据验证机制(Etag)和过期机制(Last-Modified)进行判断是使用缓存,还是从服务器传输资源文件。具体流程如下图所示: 浏览器的请求有些是并发的,有些是阻塞的,比如:图片、CSS、接口的请求是并发;JS文件是阻塞的。请求JS的时候,浏览器会中断渲染进程,等待JS文件加载解析完毕,再重新渲染。所以要把JS文件放在页面的最后。 JS也可以通过两种方式由阻塞改成并行:一种是通过创建script标签,插入DOM中;另一种是在Script标签中增加async属性。 每种浏览器对同一域名并发的数量有限制,IE6/7是2,IE9是10,其他常见的浏览器是6,所以减少资源请求数量和使用多域名配置资源文件,能大大提高网站性能。 减少资源请求数量的方法,大致有以下几种: 1、通过打包工具,合并资源,减少资源数量。就是开发版本是很多个资源文件,部署的时候,按类合并成几个文件来输出。在实现模块管理的同时,实现统一输出。 2、CSS中,使用css sprite减少图片请求数量。 3、通过延迟加载技术,在用户无感知的情况下请求资源。 4、通过服务器配置,实现一次请求,返回多个资源文件,如淘宝CDN那样。 除了减少请求数量,也可以使用CDN镜像,来减少网络节点,实现快速响应。使用了CDN的请求,会根据用户所处的地理位置,找寻最近的CDN节点,如果请求是新的,则从资源服务器拷贝到节点,然后再返回给客户端。如果请求已经存在,则直接从节点返回客户端。 通过上面我们了解的缓存机制,如果我们部署上线的时候,是需要刷新缓存的。普通缓存通过强刷就能改过来,而CDN缓存则需要通过改变URL来实现。同时我们不可能要求用户按着Ctrl来刷新,所以通过打包工具,在部署的时候,统一更改URL是最有效的方式。而不常变更的库文件,比如echart、jquery,则不建议更改。 二、传输从服务器往客户端传输,可以开启gzip压缩来提高传输效率。 Gzip有从1-10的十个等级。越高压缩的越小,但压缩使用的服务器硬件资源就越多。根据实践,等级为5的时候最均衡,此时压缩效果是100k可以压缩成20k。 三、渲染浏览器在加载了html后,就会一边解析,一边根据解析出来的结果进行资源请求,并生成DOM树。而加载完毕的CSS,则被渲染引擎根据生成好的DOM树,来生成渲染树。等所有资源解析完毕计算好layout后,向浏览器界面绘制。随着用户操作,JS会修改DOM节点或样式,重新绘制和重新排列。重新绘制指的是绘制DOM节点对应的渲染节点,重新排列是指重新计算这些节点在浏览器界面的位置。很显然,重排是非常耗性能的。我们要做的是减少重排的次数。 生成DOM树的时候,我们可以通过减少DOM节点来优化性能。最初都是用table布局,节点深度和数量相当复杂,性能很差。同样CSS作为层叠样式表,层级也不可太深,不然遍历的成本很高。另外CSS的expression属性相当耗性能,能不用则不用。动画效果能用CSS写的就不用JS写,渲染引擎不一样,性能损耗也不一样。 上面说的是解析渲染的过程,我们再接着说说用户交互操作的过程。用户操作就会导致重绘和重排,重排一定会引起重绘,而重绘不一定会引起重排。到底怎样会引起重排呢?简单的定义,DOM结构的变化,以及DOM样式中几何属性的变化,就会导致重排。几何属性顾名思义,就是宽、高、边框、外补丁、内补丁等俗称盒模型的属性。同时还有offset之类的边距属性。 重排是最耗能的,减少重排的方法有: 1、如果需要多次改变DOM,则先在内存中改变,最后一次性的插入到DOM中。 2、同上一条,如果多次改变样式,合成一条,再插入DOM中。 3、由于position的值为absoute和fixed时候,是脱离文档流的,操作此类DOM节点,不会引起整页重排。所以动画元素设置position使其脱离文档流。 4、当DOM节点的display等于none的时候,是不会存在于渲染树的,所以如果有比较复杂的操作,先使其display等于none,等待所有操作完毕后,再将display设成block,这样就只重排两次。 5、获取会导致重排的属性值时,存入变量,再次使用时就不会再次重排。获取这些属性会导致重排:offsetTop、offsetLeft、offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight 以上就是浏览器如何把资源变成肉眼所见的页面的,除了上述根据浏览器流程而总结出来的性能优化,我们还需要看看javascript作为程序,需要的优化。先来看看javascript的垃圾回收机制。 Javascript的引擎会在固定的时间间隔,将不再使用的局部变量注销掉,释放其所占的内存。而闭包的存在,将使引用一直存在,无法被释放掉。全局变量的生命周期直至浏览器卸载页面才会结束。所以一般来讲,内存溢出就是由于全局变量的不释放和闭包引起。为了防止内存溢出,我们可以做的方法有: 1、业务代码放在匿名立即执行函数里面,执行完毕会立即释放掉。 2、少用全局变量,同时用完的变量手动注销掉。 3、使用回调来代替闭包访问内部属性 4、当不可避免使用闭包时,慎重的对待其中的细节。不用的时候注销掉。 5、通过浏览器自带的工具profiles,来检查内存活动情况。如果是波浪型的,说明正常。如果是倾斜式渐进上涨的,说明有内存不会被释放,需要检查相应的函数。 最后再说一点,函数里返回异步取的值,经常有人这么: Var getList = function(){ $.ajax().then(function(data){ Return data;}) };Var users = getList();毫无疑问,由于函数内的返回是异步的,所以返回只能是undefined,而不是想要的data。于是为了实现返回data,就把ajax的async属性设置成了false,由异步改为同步,来获取到data。然而最大的问题来了,同步是会中断渲染进程的,也就是请求返回的等待中,整个页面是卡死的,用户操作也不会有响应。这个问题真正的解决方案是返回promise对象,而不是把异步改成同步。 作者:马宗泽 拓展阅读:数据中台:宜信敏捷数据中台建设实践|分享实录

May 30, 2019 · 1 min · jiezi

浏览器渲染机制

本文示例源代码请戳github博客,建议大家动手敲敲代码。前言浏览器渲染页面的过程从耗时的角度,浏览器请求、加载、渲染一个页面,时间花在下面五件事情上:DNS 查询TCP 连接HTTP 请求即响应服务器响应客户端渲染本文讨论第五个部分,即浏览器对内容的渲染,这一部分(渲染树构建、布局及绘制),又可以分为下面五个步骤:处理 HTML 标记并构建 DOM 树。处理 CSS 标记并构建 CSSOM 树将 DOM 与 CSSOM 合并成一个渲染树。根据渲染树来布局,以计算每个节点的几何信息。将各个节点绘制到屏幕上。需要明白,这五个步骤并不一定一次性顺序完成。如果 DOM 或 CSSOM 被修改,以上过程需要重复执行,这样才能计算出哪些像素需要在屏幕上进行重新渲染。实际页面中,CSS 与 JavaScript 往往会多次修改 DOM 和 CSSOM。1、浏览器的线程在详细说明之前我们来看一下浏览器线程。这将有助于我们理解后续内容。浏览器是多线程的,它们在内核制控下相互配合以保持同步。一个浏览器至少实现三个常驻线程:JavaScript 引擎线程,GUI 渲染线程,浏览器事件触发线程。GUI 渲染线程:负责渲染浏览器界面 HTML 元素,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。在 Javascript 引擎运行脚本期间,GUI 渲染线程都是处于挂起状态的,也就是说被”冻结”了。JavaScript 引擎线程:主要负责处理 Javascript 脚本程序。定时器触发线程:浏览器定时计数器并不是由 JavaScript 引擎计数的, JavaScript 引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确, 因此浏览器通过单独线程来计时并触发定时。事件触发线程:当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待 JS 引擎的处理。这些事件包括当前执行的代码块如定时任务、浏览器内核的其他线程如鼠标点击、AJAX 异步请求等。由于 JS 的单线程关系所有这些事件都得排队等待 JS 引擎处理。定时块任何和 ajax 请求等这些异步任务,事件触发线程只是在到达定时时间或者是 ajax 请求成功后,把回调函数放到事件队列当中。异步 HTTP 请求线程:在 XMLHttpRequest 在连接后是通过浏览器新开一个线程请求, 将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件放到 JavaScript 引擎的处理队列中等待处理。在发起了一个异步请求时,http 请求线程则负责去请求服务器,有了响应以后,事件触发线程再把回到函数放到事件队列当中。2、构建DOM树与CSSOM树浏览器从网络或硬盘中获得HTML字节数据后会经过一个流程将字节解析为DOM树:编码: 先将HTML的原始字节数据转换为文件指定编码的字符。令牌化: 然后浏览器会根据HTML规范来将字符串转换成各种令牌(如<html>、<body>这样的标签以及标签中的字符串和属性等都会被转化为令牌,每个令牌具有特殊含义和一组规则)。令牌记录了标签的开始与结束,通过这个特性可以轻松判断一个标签是否为子标签(假设有<html>与<body>两个标签,当<html>标签的令牌还未遇到它的结束令牌</html>就遇见了<body>标签令牌,那么<body>就是<html>的子标签)。生成对象: 接下来每个令牌都会被转换成定义其属性和规则的对象(这个对象就是节点对象)构建完毕: DOM树构建完成,整个对象集合就像是一棵树形结构。可能有人会疑惑为什么DOM是一个树形结构,这是因为标签之间含有复杂的父子关系,树形结构正好可以诠释这个关系(CSSOS同理,层叠样式也含有父子关系。例如: div p {font-size: 18px},会先寻找所有p标签并判断它的父标签是否为div之后才会决定要不要采用这个样式进行渲染)。整个DOM树的构建过程其实就是: 字节 -> 字符 -> 令牌 -> 节点对象 -> 对象模型,下面将通过一个示例HTML代码与配图更形象地解释这个过程。<html> <head> <meta name=“viewport” content=“width=device-width,initial-scale=1”> <link href=“style.css” rel=“stylesheet”> <title>Critical Path</title> </head> <body> <p>Hello <span>web performance</span> students!</p> <div><img src=“awesome-photo.jpg”></div> </body></html>当上述HTML代码遇见<link>标签时,浏览器会发送请求获得该标签中标记的CSS文件(使用内联CSS可以省略请求的步骤提高速度,但没有必要为了这点速度而丢失了模块化与可维护性),style.css中的内容如下:body { font-size: 16px }p { font-weight: bold }span { color: red }p span { display: none }img { float: right }浏览器获得外部CSS文件的数据后,就会像构建DOM树一样开始构建CSSOM树,这个过程没有什么特别的差别。3、构建渲染树在构建了DOM树和CSSOM树之后,浏览器只是拥有了两个互相独立的对象集合,DOM树描述了文档的结构与内容,CSSOM树则描述了对文档应用的样式规则,想要渲染出页面,就需要将DOM树与CSSOM树结合在一起,这就是渲染树。浏览器会先从DOM树的根节点开始遍历每个可见节点(不可见的节点自然就没必要渲染到页面了,不可见的节点还包括被CSS设置了display: none属性的节点,值得注意的是visibility: hidden属性并不算是不可见属性,它的语义是隐藏元素,但元素仍然占据着布局空间,所以它会被渲染成一个空框)对每个可见节点,找到其适配的CSS样式规则并应用。渲染树构建完成,每个节点都是可见节点并且都含有其内容和对应规则的样式。4、布局与绘制CSS采用了一种叫做盒子模型的思维模型来表示每个节点与其他元素之间的距离,盒子模型包括外边距(Margin),内边距(Padding),边框(Border),内容(Content)。页面中的每个标签其实都是一个个盒子布局阶段会从渲染树的根节点开始遍历,然后确定每个节点对象在页面上的确切大小与位置,布局阶段的输出是一个盒子模型,它会精确地捕获每个元素在屏幕内的确切位置与大小,所有相对的测量值也都会被转换为屏幕内的绝对像素值。<html> <head> <meta name=“viewport” content=“width=device-width,initial-scale=1”> <title>Critial Path: Hello world!</title> </head> <body> <div style=“width: 50%"> <div style=“width: 50%">Hello world!</div> </div> </body></html>当Layout布局事件完成后,浏览器会立即发出Paint Setup与Paint事件,开始将渲染树绘制成像素,绘制所需的时间跟CSS样式的复杂度成正比,绘制完成后,用户就可以看到页面的最终呈现效果了。我们对一个网页发送请求并获得渲染后的页面可能也就经过了1~2秒,但浏览器其实已经做了上述所讲的非常多的工作,总结一下浏览器关键渲染路径的整个过程:处理HTML标记数据并生成DOM树。处理CSS标记数据并生成CSSOM树。将DOM树与CSSOM树合并在一起生成渲染树。遍历渲染树开始布局,计算每个节点的位置信息。将每个节点绘制到屏幕。5、外部资源是如何请求的为了直观的观察浏览器加载和渲染的细节,本地用nodejs搭建一个简单的HTTP Server。index.jsconst http = require(‘http’);const fs = require(‘fs’);const hostname = ‘127.0.0.1’;const port = 8080;http.createServer((req, res) => { if (req.url == ‘/a.js’) { fs.readFile(‘a.js’, ‘utf-8’, function (err, data) { res.writeHead(200, {‘Content-Type’: ’text/plain’}); setTimeout(function () { res.write(data); res.end() }, 5000) }) } else if (req.url == ‘/b.js’) { fs.readFile(‘b.js’, ‘utf-8’, function (err, data) { res.writeHead(200, {‘Content-Type’: ’text/plain’}); res.write(data); res.end() }) } else if (req.url == ‘/style.css’) { fs.readFile(‘style.css’, ‘utf-8’, function (err, data) { res.writeHead(200, {‘Content-Type’: ’text/css’}); res.write(data); res.end() }) } else if (req.url == ‘/index.html’) { fs.readFile(‘index.html’, ‘utf-8’, function (err, data) { res.writeHead(200, {‘Content-Type’: ’text/html’}); res.write(data); res.end() }) }}).listen(port, hostname, () => { console.log(‘Server running at ’ + hostname + ‘:’ + port);});index.html<!DOCTYPE html><html><head> <meta charset=“utf-8”> <meta http-equiv=“cache-control” content=“no-cache,no-store, must-revalidate”/> <meta http-equiv=“X-UA-Compatible” content=“IE=edge”> <title>浏览器渲染</title> <link rel=“stylesheet” href=“http://127.0.0.1:8080/style.css”> <script src=‘http://127.0.0.1:8080/a.js’></script></head><body><p id=‘header’>1111111</p><script src=‘http://127.0.0.1:8080/b.js’></script><p>222222</p><p>3333333</p></body></html>style.css#header{ color: red;}a.js、b.js暂时为空可以看到,服务端将对a.js的请求延迟5秒返回。Server启动后,在chrome浏览器中打开http://127.0.0.1:8080/index.html我们打开chrome的调试面板第一次解析html的时候,外部资源好像是一起请求的,说资源是预解析加载的,就是说style.css和b.js是a.js造成阻塞的时候才发起的请求,图中也是可以解释得通,因为第一次Parse HTML的时候就遇到阻塞,然后预解析就去发起请求,所以看起来是一起请求的。6、HTML 是否解析一部分就显示一部分我们修改一下html代码<!DOCTYPE html><html><head> <meta charset=“utf-8”> <meta http-equiv=“cache-control” content=“no-cache,no-store, must-revalidate”/> <meta http-equiv=“X-UA-Compatible” content=“IE=edge”> <title>浏览器渲染</title> <link rel=“stylesheet” href=“http://127.0.0.1:8080/style.css”></head><body><p id=‘header’>1111111</p><script src=‘http://127.0.0.1:8080/a.js’></script><script src=‘http://127.0.0.1:8080/b.js’></script><p>222222</p><p>3333333</p></body></html>因为a.js的延迟,解析到a.js所在的script标签的时候,a.js还没有下载完成,阻塞并停止解析,之前解析的已经绘制显示出来了。当a.js下载完成并执行完之后继续后面的解析。当然,浏览器不是解析一个标签就绘制显示一次,当遇到阻塞或者比较耗时的操作的时候才会先绘制一部分解析好的。7、js文件的位置对HTML解析有什么影响7.1 js文件在头部加载。修改index.html:<!DOCTYPE html><html><head> <meta charset=“utf-8”> <meta http-equiv=“cache-control” content=“no-cache,no-store, must-revalidate”/> <meta http-equiv=“X-UA-Compatible” content=“IE=edge”> <title>浏览器渲染</title> <link rel=“stylesheet” href=“http://127.0.0.1:8080/style.css”> <script src=‘http://127.0.0.1:8080/a.js’></script> <script src=‘http://127.0.0.1:8080/b.js’></script></head><body><p id=‘header’>1111111</p><p>222222</p><p>3333333</p></body></html>因为a.js的阻塞使得解析停止,a.js下载完成之前,页面无法显示任何东西。7.2、js文件在中间加载。<!DOCTYPE html><html><head> <meta charset=“utf-8”> <meta http-equiv=“cache-control” content=“no-cache,no-store, must-revalidate”/> <meta http-equiv=“X-UA-Compatible” content=“IE=edge”> <title>浏览器渲染</title> <link rel=“stylesheet” href=“http://127.0.0.1:8080/style.css”></head><body><p id=‘header’>1111111</p><script src=‘http://127.0.0.1:8080/a.js’></script><script src=‘http://127.0.0.1:8080/b.js’></script><p>222222</p><p>3333333</p></body></html>解析到js文件时出现阻塞。阻塞后面的解析,导致后面的不能很快的显示。7.3、js文件在尾部加载。<!DOCTYPE html><html><head> <meta charset=“utf-8”> <meta http-equiv=“cache-control” content=“no-cache,no-store, must-revalidate”/> <meta http-equiv=“X-UA-Compatible” content=“IE=edge”> <title>浏览器渲染</title> <link rel=“stylesheet” href=“http://127.0.0.1:8080/style.css”></head><body><p id=‘header’>1111111</p><p>222222</p><p>3333333</p><script src=‘http://127.0.0.1:8080/a.js’></script><script src=‘http://127.0.0.1:8080/b.js’></script></body></html>解析到a.js部分的时候,页面要显示的东西已经解析完了,a.js不会影响页面的呈现速度。由上面我们可以总结一下直接引入的 JS 会阻塞页面的渲染(GUI 线程和 JS 线程互斥)JS 不阻塞资源的加载JS 顺序执行,阻塞后续 JS 逻辑的执行下面我们来看下异步js7.4、async和defer的作用是什么?有什么区别?接下来我们对比下 defer 和 async 属性的区别:其中蓝色线代表JavaScript加载;红色线代表JavaScript执行;绿色线代表 HTML 解析。情况1<script src=“script.js”></script>没有 defer 或 async,浏览器会立即加载并执行指定的脚本,也就是说不等待后续载入的文档元素,读到就加载并执行。情况2<script async src=“script.js”></script> (异步下载)async 属性表示异步执行引入的 JavaScript,与 defer 的区别在于,如果已经加载好,就会开始执行——无论此刻是 HTML 解析阶段还是 DOMContentLoaded 触发之后。需要注意的是,这种方式加载的 JavaScript 依然会阻塞 load 事件。换句话说,async-script 可能在 DOMContentLoaded 触发之前或之后执行,但一定在 load 触发之前执行。情况3 <script defer src=“script.js”></script>(延迟执行)defer 属性表示延迟执行引入的 JavaScript,即这段 JavaScript 加载时 HTML 并未停止解析,这两个过程是并行的。整个 document 解析完毕且 defer-script 也加载完成之后(这两件事情的顺序无关),会执行所有由 defer-script 加载的 JavaScript 代码,然后触发 DOMContentLoaded 事件。defer 与相比普通 script,有两点区别:载入 JavaScript 文件时不阻塞 HTML 的解析,执行阶段被放到 HTML 标签解析完成之后。在加载多个JS脚本的时候,async是无顺序的加载,而defer是有顺序的加载。8、css文件的影响服务端将style.css的相应也设置延迟。fs.readFile(‘style.css’, ‘utf-8’, function (err, data) { res.writeHead(200, {‘Content-Type’: ’text/css’}); setTimeout(function () { res.write(data); res.end() }, 5000)})<!DOCTYPE html><html><head> <meta charset=“utf-8”> <meta http-equiv=“cache-control” content=“no-cache,no-store, must-revalidate”/> <meta http-equiv=“X-UA-Compatible” content=“IE=edge”> <title>浏览器渲染</title> <link rel=“stylesheet” href=“http://127.0.0.1:8080/style.css”></head><body><p id=‘header’>1111111</p><p>222222</p><p>3333333</p><script src=‘http://127.0.0.1:8080/a.js’ async></script><script src=‘http://127.0.0.1:8080/b.js’ async></script></body></html>可以看出来,css文件不会阻塞HTML解析,但是会阻塞渲染,导致css文件未下载完成之前已经解析好html也无法先显示出来。我们把css调整到尾部<!DOCTYPE html><html><head> <meta charset=“utf-8”> <meta http-equiv=“cache-control” content=“no-cache,no-store, must-revalidate”/> <meta http-equiv=“X-UA-Compatible” content=“IE=edge”> <title>浏览器渲染</title></head><body><p id=‘header’>1111111</p><p>222222</p><p>3333333</p><link rel=“stylesheet” href=“http://127.0.0.1:8080/style.css”><script src=‘http://127.0.0.1:8080/a.js’ async></script><script src=‘http://127.0.0.1:8080/b.js’ async></script></body></html>这是页面可以渲染了,但是没有样式。直到css加载完成以上我们可以简单总结。CSS 放在 head 中会阻塞页面的渲染(页面的渲染会等到 css 加载完成)CSS 阻塞 JS 的执行 (因为 GUI 线程和 JS 线程是互斥的,因为有可能 JS 会操作 CSS)CSS 不阻塞外部脚本的加载(不阻塞 JS 的加载,但阻塞 JS 的执行,因为浏览器都会有预先扫描器)参考浏览器渲染过程与性能优化聊聊浏览器的渲染机制你不知道的浏览器页面渲染机制 ...

April 19, 2019 · 3 min · jiezi

现代浏览器探秘(part3):渲染

翻译:疯狂的技术宅原文:https://developers.google.com…渲染器进程的内部工作原理这是关于浏览器内部工作原理系列的第3部分。 之前,我们介绍了多进程架构和导航流程。 在这篇文章中,我们将看看渲染器进程内部发生了什么。渲染进程涉及Web性能的诸多方面。 由于渲染进程中发生了很多事情,因此本文不能一一赘述。 如果你想深入挖掘,可以在Web基础的性能部分找到更多内容。渲染器进程处理Web内容渲染器进程负责选项卡内发生的所有事情。 在渲染器进程中,主线程处理你为用户编写的大部分代码。 如果你使用了web worker 或 a service worker,有时JavaScript代码的一部分将由工作线程处理。 排版和栅格线程也在渲染器进程内运行,以便高效、流畅地呈现页面。渲染器进程的核心工作是将HTML、CSS和JavaScript转换为用户可以与之交互的网页。图1:渲染器进程内部有主线程、工作线程、排版线程和栅格线程解析构建DOM当渲染器进程收到导航的提交消息并开始接收HTML数据时,主线程开始解析文本字符串(HTML)并将其转换为文档对象模型(DOM—Document Object Model )。DOM是页面在浏览器中的内部表示,同时也是Web开发人员可以通过 JavaScript 与之交互的数据结构和API。HTML标准将HTML文档解析为DOM。 你可能已经注意到,将HTML提供给浏览器从不会引发错误。 例如,缺少结束</ p>标记是有效的HTML。 像 Hi! <b>I’m <i>Chrome</b>!</i> 这样的错误标记(b标签在i标签之前被关闭)被看作是 Hi! <b>I’m <i>Chrome</i></b><i>!</i>。 这是因为HTML规范旨在优雅地处理这些错误。 如果你对如何完成这些工作感到好奇,可以阅读HTML规范中的“解析器中的错误处理和奇怪情况介绍”部分。子资源加载网站通常使用图像、CSS和JavaScript等外部资源。 这些文件需要从网络或缓存中加载。 主线程可以在解析构建DOM时会逐个请求它们,但为了加快速度,“预加载扫描器”也会同时运行。 如果HTML文档中存在<img>或<link>之类的内容,则预加载扫描器会检查由HTML解析器生成的标记,并在浏览器进程中向网络线程发送请求。图2:主线程解析HTML并构建DOM树JavaScript可以阻止解析当HTML解析器找到<script>标记时,它会暂停解析HTML文档,并且必须加载、解析和执行JavaScript代码。 为什么要这样处理? 因为JavaScript可以使用像document.write() 那样改变整个DOM结构的东西来改变文档的形状(HTML规范中的解析模型概述有一个很好的示意图)。 这就是HTML解析器在重新解析HTML文档之前必须等待JavaScript运行的原因。 如果你对JavaScript执行中发生的事情感到好奇,V8团队的博客对此进行了讨论。提示浏览器如何加载资源Web开发人员可以通过多种方式向浏览器发送提示,以便很好地加载资源。 如果你的JavaScript不使用 document.write(),则可以向<script>标记添加async或defer属性。 然后,浏览器异步加载和运行JavaScript代码,不会阻止解析。 如果合适,你也可以使用JavaScript模块。 <link rel =“preload”>是一种通知浏览器当前导航肯定需要这个资源的方法,你希望尽快下载。 你可以在资源优先级找到更多信息。样式表计算拥有DOM不足以知道页面的外观,因为我们可以在CSS中设置页面元素的样式。 主线程解析CSS并确定每个DOM节点的计算样式。 这是有关基于CSS选择器将哪种样式应用于每个元素的信息。 你可以在浏览器中开发者工具中的computed部分中看到此信息。图3:主线程解析CSS以添加计算样式即使你不提供任何CSS,每个DOM节点都具有计算样式。比如 <h1>标签的显示要大于<h2>标签,同时为每个元素定义边距。 这是因为浏览器具有默认样式表。 如果你想知道Chrome的默认CSS是什么样的,你可以在此处查看源代码。布局现在,渲染器进程知道每个节点的文档和样式的结构,但这还不足以呈现页面。 想象一下,你正试图通过手机向朋友描述一幅画: “有一个大的红色圆圈和一个小的蓝色方块” 这并不能完全让你的朋友了解这幅画的外观。图4:一个人站在一幅画,通过电话线与另一个人联系布局是查找元素几何的过程。 主线程遍历DOM并计算样式和创建布局树,其中包含x y坐标和边界框大小等信息。 布局树可以是与DOM树类似的结构,但它仅包含与页面上可见内容相关的信息。 如果display:none,则该元素不是布局树的一部分(但是在布局树中包含visibility:hidden的元素)。 类似地,如果应用具有类似p::before {content:“Hi!}之类的内容的伪类,则它将包含在布局树中,即使它不在DOM中。图5:主线程通过DOM树生成计算样式和布局树确定页面布局是一项具有挑战性的任务。 即使是最简单的页面布局,如从上到下的块流,也必须考虑字体的大小以及在哪里划分它们,因为它们会影响段落的大小和形状; 然后影响下一段所需的位置。图6:由于换行符而移动的段落的框布局CSS可以使元素浮动到一侧,掩盖溢出项,并更改写入方向。 你可以想象,这个布局阶段是一项艰巨的任务。 在Chrome项目中,有一个完整的工程师团队负责布局。 如果你想看到他们工作的细节,看看这些会议记录非常有意思。绘制拥有了DOM、样式和布局仍然不足以呈现页面。 假设你正在尝试重现一幅画。 你不仅需知道元素的大小,形状和位置,还需要判断绘制它们的顺序。图7:一个在画布前拿着画笔的人,正在思考是应该先画圆圈还是矩形例如:可以为某些元素设置z-index,在这种情况下,按HTML中编写的元素顺序绘制将导致不正确的呈现。图8:页面元素按HTML标记的顺序出现,会导致错误的渲染图像,因为没有考虑z-index在此绘制步骤中,主线程遍历布局树以创建绘制记录。 绘制记录是绘制过程的一个注释,如“背景优先,然后是文本,最后是矩形”。 如果你使用JavaScript绘制了<canvas>元素,那么可能对此过程很熟悉。图9:主线程遍历布局树并生成绘制记录更新渲染通道的成本很高在渲染通道中最重要的一件事就是在每个步骤中,前一个操作的结果被用于创建新数据。 例如:如果布局树中的某些内容发生更改,则需要为文档的受影响部分重新生成绘制顺序。图10:DOM + Style,布局和绘制树的生成顺序如果要为元素设置动画,则浏览器必须在每个帧之间运行这些操作。 我们的大多数显示器每秒刷新屏幕60次(60 fps); 当你在每一帧移动屏幕时,动画对人眼来说会很平滑。 但是如果动画错过了其中的帧,则页面将发生闪烁。图11:时间轴上的动画帧即使你的渲染操作能够跟上屏幕刷新,这些计算也是在主线程上运行的,这意味着当你的应用运行 JavaScript 时它可能会被阻止。图12:时间轴上的动画帧,但JavaScript阻止了一帧你可以将JavaScript操作划分为小块,并使用 requestAnimationFrame() 安排在每个帧上运行。 有关此主题的更多信息,请参阅优化JavaScript执行。 你也可以在 Web Workers 中运行 JavaScript 来避免阻塞主线程。图13:在动画帧的时间轴上运行的较小的JavaScript块合成你会如何绘制一个页面?现在浏览器知道文档的结构,每个元素的样式,页面的几何形状和绘制顺序,它是如何绘制页面的? 将此信息转换为屏幕上的像素称为光栅化。图14:简单光栅化过程也许处理这种情况的一种简单的方法是在视口(viewport)内部使用栅格部件。 如果用户滚动页面,则移动光栅帧,并通过更多光栅填充缺少的部分。 这就是Chrome首次发布时处理栅格化的方式。 但是,现代浏览器运行一个称为合成的更复杂的过程。什么是合成合成是一种将页面的各个部分分层,分别栅格化,并在一个被称为合成器线程的独立线程中合成为页面的技术。 如果发生滚动,由于图层已经被栅格化,所以它所要做的就是合成一个新帧。 通过移动图层和合成新帧,可以用相同的方式实现动画。图15:合成过程的示意动画你可以使用浏览器开发者工具的“layout”面板中查看你的网站如何划分为多个图层。分为几层为了找出哪些元素需要放在哪些层中,主线程通过遍历布局树以创建层树(此部分在DevTools性能面板中称为“Update Layer Tree”)。 如果页面某些应该是单独图层(如滑入式侧面菜单)的部分但是没有分配到图层,那么你可以使用CSS中的will-change属性提示浏览器。图16:主线程生通过遍历布局树来成层树也许你想要为每个元素提供图层,但是过多的图层进行合成可能会导致比每帧光栅化页面的小部分更慢的操作,因此测量应用程序的渲染性能至关重要。 有关主题的更多信息,请参阅Stick to Compositor-Only Properties and Manage Layer Count光栅和复合关闭主线程一旦创建了层树并确定了绘制顺序,主线程就会将该信息提交给合成器线程。 合成器线程然后栅格化每个图层。 一个图层可能像页面的整个长度一样大,因此合成器线程会将它们分成图块,并将每个图块发送到光栅线程。 栅格线程栅格化每一个tile并将它们存储在GPU内存中。图17:栅格线程创建tile位图并发送到GPU合成器线程可以优先考虑不同的aster线程,以便视口(或附近)内的事物可以先被光栅化。 图层还具有多个不同分辨率的倾斜度,可以处理放大操作等内容。一旦tile被光栅化,合成器线程会收集称为绘制四边形(draw quads )的tile信息来创建合成器帧(compositor frame)。绘制四边形包含信息,例如图块在内存中的位置以及在考虑页面合成的情况下绘制图块的页面中的位置。合成器帧表示页面帧的绘制四边形的集合。然后通过IPC将合成器帧提交给浏览器进程。这时可以从UI线程添加另一个合成器帧以用于浏览器UI更改,或者从其他渲染器进程添加扩充数据。 这些合成器帧被发送到GPU用来在屏幕上显示。 如果发生滚动事件,合成器线程会创建另一个合成器帧并发送到GPU。图18:合成器线程创建合成帧。 帧先被发送到浏览器进程,然后再发送到GPU合成的好处是它可以在不涉及主线程的情况下完成。 合成线程不需要等待样式计算或 JavaScript 执行。 这就是合成动画是平滑性能的最佳选择的原因。 如果需要再次计算布局或绘图,则必须涉及主线程。总结在本文中,我们研究了从解析到合成的渲染通道。 在本系列的下一篇文章中,我们将更详细地介绍合成器线程,并了解当用户进行鼠标移动和单击等操作时会发生什么。本文首发微信公众号:jingchengyideng点击下面链接查看其它章节文章现代浏览器探秘(part1):架构现代浏览器探秘(part2):导航现代浏览器探秘(part3):渲染现代浏览器探秘(part4):事件处理 ...

January 17, 2019 · 1 min · jiezi

Vue项目预渲染机制引入实践

周末想顺便把已经做好静态页面的webApp项目做一下SEO优化,由于不想写蹩脚的SSR代码,所以准备采用预渲染,本来想着网上有这么多预渲染的文章,随便找个来跟着做不就完了嘛,结果年轻的我付出了整个周末….. 这篇文章就记录一下最后是怎么配置的 T.T声明:以下配置只保留有必要的生成目录这里使用base代替,请自行修改vue-cli模板使用webpack,其他模板类推webApp - 在线预览1. 简介与使用场景我们知道SPA有很多优点,不过一个缺点就是对(不是Google的)愚蠢的搜索引擎的SEO不友好,为了照顾这些引擎,目前主要有两个方案:服务端渲染(Server Side Rendering)、预渲染(Prerending)。如果你只需要改善少数页面(例如 /, /about, /contact 等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML (服务端渲染, SSR),而是使用预渲染方式,在构建时(build time)简单地生成针对特定路由的静态 HTML 文件。它主要使用 prerender-spa-plugin 插件,其与SSR一样都可以加快页面的加载速度,并且侵入性更小,在已上线的项目稍加改动也可以轻松引入预渲染机制,而SSR方案则需要将整个项目结构推翻;访问预渲染出来的页面在访问时与SSR一样快,并且它将服务端编译HTML的时机提前到了构建时,因此也降低了服务端的压力,如果你的服务器跟我的一样买的 1M1G1核 的小水管服务器 ( 穷 ),那么预渲染可能更适合你。不过SSR和预渲染的使用场景还是有较明显的区别的。预渲染的使用场景更多是简单的静态页面。服务端渲染适用于复杂、较大型、与服务端交互频繁的功能型网站,比如电商网站。2. 安装配置首先来看看相关技术栈:vue^2.5.2、vue-router^3.0.1、vue-cli^2.9.6、webpack^3.6.0、prerender-spa-plugin^3.3.02.1 安装安装跟其他库一样# Yarn$ yarn add prerender-spa-plugin -D# or NPM$ npm install prerender-spa-plugin –save-dev2.2 前端配置首先看看文件结构,用的是vue-cli2的webpack模板生成的文件结构│ .babelrc│ index.html│ package.json│ README.md├─build│ build.js│ check-versions.js│ utils.js│ vue-loader.conf.js│ webpack.base.conf.js│ webpack.dev.conf.js│ webpack.prod.conf.js├─config│ dev.env.js│ index.js│ prod.env.js├─src│ │ App.vue│ │ main.js│ │ │ ├─assets│ ├─components│ ├─router│ │ index.js│ ├─styles│ ├─utils│ └─views│ BigData.vue│ CompanyHonor.vue然后是router/index.js的配置,预渲染要求是histroy模式,有的文章说不需要history模式,这是错的,否则生成的页面都是同一个html。另外注意加上base否则如果你希望跳转到二级页面的localhost/base/home时候,在页面中点击<router-link to="/home">home</router-link>的时候会跳转localhost/home// src/router/index.jsimport Vue from ‘vue’import Router from ‘vue-router’Vue.use(Router)export default new Router({ mode: ‘history’, base: ‘/base/’, routes: […]})然后是config,这里注意assetsPublicPath不是./,// config/index.jsconst path = require(“path”)module.exports = { build: { index: path.resolve(__dirname, “../base/index.html”), assetsRoot: path.resolve(__dirname, “..”), assetsSubDirectory: “base/static”, assetsPublicPath: “/”, }}然后是插件的配置,是放在prod中的,因为只有build的时候会用// build/webpack.prod.conf.jsconst path = require(‘path’)const config = require(’../config’)const PrerenderSPAPlugin = require(‘prerender-spa-plugin’)const Renderer = PrerenderSPAPlugin.PuppeteerRendererconst webpackConfig = merge(baseWebpackConfig, { new PrerenderSPAPlugin({ staticDir: config.build.assetsRoot, outputDir: path.join(config.build.assetsRoot, ‘base’), indexPath: config.build.index, // 对应路由文件的path routes: [ ‘/’, ‘/BigData’, ‘/CompanyHonor’ ], renderer: new Renderer({ headless: false, renderAfterDocumentEvent: ‘render-event’ }) })})注意上面一个renderAfterDocumentEvent: ‘render-event’了么,这个意思是在render-event事件触发之后执行prerender,这个事件我们在main.js中mounted钩子触发// src/main.jsimport Vue from ‘vue’import App from ‘./App’new Vue({ el: ‘#app’, render: h => h(App), mounted() { document.dispatchEvent(new Event(‘render-event’)) }})还有个配置要注意下在 build/utils.js 中的 ExtractTextPlugin.extract 的 publicPath ,否则一些vue中引用的资源会找不到// build/utils.jsExtractTextPlugin.extract({ use: loaders, fallback: ‘vue-style-loader’, // publicPath: ‘../../’})这时候执行npm run build就可以生成刚刚配置在PrerenderSPAPlugin插件中routes中的页面html了,这过程中会一闪而过的短暂打开chromium浏览器,不用管。最后生成的目录树:│ index.html├─BigData│ index.html├─CompanyHonor│ index.html└─static ├─css ├─fonts ├─img └─js最后如果希望进一步优化生成出来页面的SEO,可以配合 vue-meta-info 这个网上有很多文章,就不赘述了2.3 nginx配置顺便贴一下nginx配置location ~ ^/base/ { try_files $uri $uri/ /base/index.html =404;}网上的帖子大多深浅不一,甚至有些前后矛盾,在下的文章都是学习过程中的总结,如果发现错误,欢迎留言指出~参考:Vue.js 服务器端渲染指南Vue 服务端渲染 & 预渲染vue-cli v3, can’t get it to work.. issue #215When assetsPublicPath is set, the… issue #176vue.js vue-router history模式路由,域名二级目录子目录nginx配置 ...

September 3, 2018 · 2 min · jiezi