当前位置: 首页 > news >正文

Godot-3D教程-02.3D性能和局限性

介绍 Introduction

Godot遵循表现与性能平衡信条。在这个表现的世界中,它们总是有许多约定俗成的东西,主要是在用执行速度换取可用性与扩展性方面。下面是一些实际的例子:

  • 高效地渲染对象是比较简单的,但是当需要渲染一个大场景的时候就会变得效率低下。为了解决这个问题,我们只把可见性对象加入到渲染线程中,尽管这样也会失去一部分效率,但是这样在同一时间需要渲染的对象减少了,也就大大的提高了整体的效率。
  • 为每一个对象设置材质属性将会使渲染变得异常缓慢。为了解决这个问题,渲染对象将按照材质进行排序以减少消耗,但是同一时间进行排序也同样有消耗。
  • 在三维物理世界中也会出现同样的情况。即使最好的算法处理大量的物理对象(如SAP),在加入/移除对象与投射时也会变得缓慢。算法允许快速的插入和移除,此外许多激活状态下的对象投射将变得不可用。 

这儿还有很多这样的例子!实际上游戏引擎在这方面目标上都是一致的,所以一个平衡的算法总是倾向于某些方面快速某些方面缓慢或者通过牺牲易用性来提升速度。

Godot也不例外,它设计了在后台可以切换不同的算法,默认优先考虑平衡性与灵活性,而不是表现方面。

有了这一点,本教程的目标就是如何使Godot释放最大能量。

渲染 Rendering

3D渲染在表现性能中将是一个十分困难的领域 ,因此本节将有一个提示列表。

在探着色器和材质 Reuse shaders and materials

Godot渲染器还是有一些不同的。它设计方面是尽可能多的减少GPU状态变化。 空间材质( SpatialMaterial) 在相似的着色器中对材质的重用方面很出色, 在使用自定义着色器时,要尽可能多的考虑到重用性。Godot的优势如下:

  • 材质重用 Reusing Materials: 场景中不同材质的数量越少,渲染的速度就越快。 如果现场有大量的对象(在数百或数千)可以尝试重用材质或者使用地图集(不推荐)。
  • 着色器重用 Reusing Shaders:如果材质无法重用,至少尝试重复使用着色器(或者相同设置不同参数的空间材质( SpatialMaterials))。

如果有一个场景,有2000个对象和对应的2000个不同的材质,渲染将十分缓慢。如果还是这个场景2000个对象,但是仅仅使用了100个材质,渲染速度将迅猛的提升。

像素耗费 对 顶点耗费 Pixels cost vs vertex cost

一般情况下多边形的面越少渲染的越快。相对的这同时也取决于很多其他因素。

在现代PC和控制台上,顶点耗费很低。非常低。GPUs原本仅仅只需要渲染三角形,所以所有的顶点:

  1. 必须使用CPU进行变换(包括裁剪)。
  2. 必须从主寄存器中发送给GPU内存。

现在,所有这些都是在GPU内部处理的,因此性能非常高。因为一些三维软件(3D DCCs如blender,3dmax等等)需要把几何形状保留在CPU内存进行编辑,所以三维建模人员通常对表现力在多边形数量有所误解,从而降低了实际的性能。事实上,在3D引擎中对物体渲染比在三维软件中显示更有效率。

在移动设备上,情况就不同了。 PC和工作站的GPUs是一个吃电怪兽它能源源不断的从供电中获取电能。移动GPUs受限于电池容量,所以更多的是需要较高的效能比。 

为了提高效率,避免透支使用移动GPUs。 意味着,不止一次的在屏幕中渲染相同的像素(如光照计算等等)。 想象一个有几栋建筑的小镇,GPUs在绘制之前并不知道什么是可见的,什么是隐藏的。 一个房子已经被绘制了然而另一个房子在这个房子前面(同一像素被进行了两次渲染!)。PC GPU通常不太关心这一点,只需将更多像素处理器投入到硬件中即可提高性能(但这也会增加功耗)。

在移动平台中,使用更多的电力是不明智的,所以可以使用一种叫做“基于前片的渲染(Tile Based Rendering)”的技术(几乎每个移动硬件都使用它的变体), 它将屏幕划分为网格。每个单元格保留绘制到它的三角形列表,并按深度对它们进行排序,以最大限度地减少透支。这种技术提高了性能并降低了功耗,但会影响顶点性能。因此,可以处理较少的顶点和三角形进行绘制。

一般来说,这还不算太坏,但是这里还有一个小问题应该避免出现在移动平台上,那就是在出现一个较小的物体但是它有大量的几何形状并且在屏幕中较小。这迫使移动GPU在单个屏幕单元上施加很大的压力,大大降低了性能(因为所有其他单元都必须等待它完成才能显示帧)。

简而言之,不要担心移动上的顶点数太多,而是要避免顶点集中在屏幕的小部分。例如字符、NPC、车辆等。很远(所以看起来很小),使用更小的细节层次( LOD )模型。

必须考虑顶点额外的消耗情况像每个顶点具有额外处理的对象,例如:

  • 蒙皮 (骨骼动画)
  • 形变 (形状键)
  • 顶点光照对象 (移动设备上常见)

纹理压缩 Texture compression

Godot在导入三维模型时提供了纹理压缩(显存压缩)。显存压缩在存储时效率不如PNG或者JPG,但是大大的提高了绘图性能。

这是因为纹理压缩的主要目标是减少内存和GPU之间的带宽。

在三维中,物体的形状更多地依赖于几何形状而不是纹理,所以压缩通常效果不明显。在二维,压缩更多的取决于形状内部纹理的,所以人为操作比压缩更有效。

请注意,许多安卓设备不支持拥有透明度的纹理进行纹理压缩(只能用不透明图片),所请记住这一点。

透明物体 Transparent objects

如前所述,Godot按材质和着色器对对象进行排序以提高性能。 然而在透明的物体上没有效果。透明对象从后到前进行渲染以与后面的工作进行混合。 因此,尽可能少的使用透明物体! 如果对象有一个具有透明度的小截面,请尝试使为该截面添加单独的材质。 

层次细节 Level of detail (LOD)

正如前面提到的, 在某些情况下使用顶点数量较少的对象可以提高性能。Godot对应层次细节提供了一套十分简单的系统,几何形状实例( GeometryInstance)是基于一个定义了可视范围的对象。可以在不同的工作范围内定义一系列的几何形状实例(GeometryInstance)作为 层次细节( LOD)。

使用实例(多网格模型)Use instancing (MultiMesh)

如果相同的物体被放置在同一地点或者互相临近,请使用(MultiMesh)替代。多网格模型(MultiMesh)在绘制成千上万的对象时可以尽可能多的减少消耗,理想的物体就像羊群,草地,粒子等等。

烘焙光照 Bake lighting

小灯光通对性能的影响可以忽略。阴影可能会影响一些。如果多个灯光同时影响着一个场景,使用烘焙(Baked Lightmaps)是个好主意。烘焙还可以通过增加间接光线反射来改善场景质量。

如果是移动设备推进使用烘焙,因为这种方法更快。 

转载于:https://www.cnblogs.com/joojhoo/p/8599165.html

相关文章:

  • markdown编写技巧
  • vuex 存值 及 取值 的操作
  • java的IO流的一些测试
  • 扒一扒,你有多少校友在阿里?实习就来阿里云。
  • LVS+keepalived+nginx
  • 0/1背包经典例题 入门动态规划
  • HDU 2242 考研路茫茫——空调教室(边双连通)
  • Inno 安装前检测.net framework 4.0
  • MySQL5.7 添加用户、删除用户与授权
  • Puppeteer:浏览器控制器
  • Centos 如何双击执行可执行程序
  • 大幕已拉开,人工智能离我们还有多远?
  • SpringBoot2系列教程(二)maven项目包 (特别完整!)
  • 如何用 SpringBoot 优雅的写代码
  • postgres 错误
  • Consul Config 使用Git做版本控制的实现
  • CSS盒模型深入
  • ES6系统学习----从Apollo Client看解构赋值
  • iOS编译提示和导航提示
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java深入 - 深入理解Java集合
  • maven工程打包jar以及java jar命令的classpath使用
  • sublime配置文件
  • vuex 学习笔记 01
  • 回顾 Swift 多平台移植进度 #2
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 判断客户端类型,Android,iOS,PC
  • 让你的分享飞起来——极光推出社会化分享组件
  • 详解NodeJs流之一
  • 一个完整Java Web项目背后的密码
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • mysql面试题分组并合并列
  • Prometheus VS InfluxDB
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (转)Linq学习笔记
  • .apk 成为历史!
  • .md即markdown文件的基本常用编写语法
  • .NET 8.0 发布到 IIS
  • .Net 8.0 新的变化
  • .Net CF下精确的计时器
  • .NET 反射 Reflect
  • .Net 路由处理厉害了
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @Autowired自动装配
  • @staticmethod和@classmethod的作用与区别
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [C++]Leetcode17电话号码的字母组合