介绍 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)是个好主意。烘焙还可以通过增加间接光线反射来改善场景质量。

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

Godot-3D教程-02.3D性能和局限性的更多相关文章

  1. 《zw版·Halcon-delphi系列原创教程》 3d汽车模型自动区域分割

    <zw版·Halcon-delphi系列原创教程> 3d汽车模型自动区域分割 目前,图像分析,在3D设计,机器视觉方面拥有很广.这个Halcon脚本是3d汽车模型自动区域分割,很简单才20 ...

  2. Qt 3D教程(三)实现对模型材质參数的控制

    Qt 3D教程(三)实现对模型材质參数的控制 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47131841.欢迎同行前来探讨. ...

  3. 使用webgl(three.js)搭建一个3D智慧园区、3D建筑,3D消防模拟,web版3D,bim管理系统——第四课

    序:这段时间忙于奔波,好久没有更新了,今天更新一下,继续上节课的完善讲解,算是对前段时间的一个总结吧.披星戴月的时光也算有点应用效果了. 对于webgl(three.js)性能这一块我在上节课< ...

  4. 使用webgl(three.js)创建3D机房,3D机房微模块详细介绍(升级版二)

    序: 上节课已经详细描述了普通机房的实现过程,文章地址(https://www.cnblogs.com/yeyunfei/p/10473021.html) 紧接着上节课的内容 我们这节可来详细讲解机房 ...

  5. 如何用webgl(three.js)搭建一个3D库房,3D密集架,3D档案室,-第二课

    闲话少叙,我们接着第一课继续讲(http://www.cnblogs.com/yeyunfei/p/7899613.html),很久没有做技术分享了.很多人问第二课有没有,我也是抽空写一下第二课. 第 ...

  6. (转)stage 3d or unity 3d

    这个是这样子的.stage3d如果不使用flascc的话,性能会卡在as上面.你没卡是因为你用的效果还不够高级.往深了走的高端应用就是卡as性能上.这不是你代码能优化了的.我们后来都改用flascc写 ...

  7. [译]Vulkan教程(02)概况

    [译]Vulkan教程(02)概况 这是我翻译(https://vulkan-tutorial.com)上的Vulkan教程的第2篇. This chapter will start off with ...

  8. 如何用webgl(three.js)搭建一个3D库房,3D密集架,3D档案室(升级版)

    很长一段时间没有写3D库房,3D密集架相关的效果文章了,刚好最近有相关项目落地,索性总结一下 与之前我写的3D库房密集架文章<如何用webgl(three.js)搭建一个3D库房,3D密集架,3 ...

  9. 物联网3D,物业基础设施3D运维,使用webgl(three.js)与物联网设备结合案例。搭建智慧楼宇,智慧园区,3D园区、3D物业设施,3D楼宇管理系统——第八课

    写在前面的废话: 很久没有更新文章了,这段时间一直忙于项目落地,虽然很忙,但是感觉没有总结,没有提炼的日子,总是让人感觉飘飘忽忽的. 所幸放下一些事,抽出一些时间,把近期的项目做一些整理与记录.也算是 ...

随机推荐

  1. Redis源码试读(一)源码准备

    这里开始查看Redis的源码,之前是在看Unix的环境编程,虽然这本书写的很好,但是只看这个感觉有点隔靴搔痒.你可以知道沙子.水泥.钢筋的特性,但是要想建一栋大楼仍然是另一回事.Unix环境编程要看, ...

  2. Volley框架载入网络图片

    Android开发中,载入网络server的图片是非经常常使用的.当然我们能够自己写server接口去实现,只是要做到server性能 优越的话,开发起来比較麻烦点.所以本博客要介绍Volley框架进 ...

  3. coreos 之flannel

    提要: coreos 中 flannel 工具是coreos 网络划分工具.通过flannel 划分子网并向etcd 注册网络信息.可以做到宿主机集群中容器间网络通信. 1. 启动etcd2 服务: ...

  4. 【demo练习四】:WPF用户控件案例

    首先,新建vs中“用户控件(WPF)”,右键项目名 =>"添加"按钮 => 选择“新建项”. 然后选择“用户控件(WPF)” => 起名字 => 点击“添加 ...

  5. Docker入门系列2 安装

    可以从 Docker 社区直接下载可用的模版或镜像. Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多. 其次,Docker对系统资源的利用率很高,一台主机上可以同时运行数千个Do ...

  6. oracle索引INdex

    索引是与表相关的一种可选择数据库对象.索引是为提高数据检索的性能而建立,利用它可快速地确定指定的信息. 索引可建立在一表的一列或多列上,一旦建立,由ORACLE自动维护和使用,对用户是完全透明的.然而 ...

  7. input file 选择Excel

    说明:开发环境 vs2012 asp.net mvc4 c# ,使用file 选择Excel文件 传到后台 使用Aspose.Cells获取Excel sheet页的名称 1.HTML代码 <% ...

  8. static 不被实例调用

    static - JavaScript | MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/ ...

  9. Docker中部署puppeteer导出pdf

    最近在做puppeteer容器化的过程中发现问题. 在容器中npm install puppeteer仍然会报错,不能launch 随后错误提示中也给出了官方的文档,https://github.co ...

  10. JVM GC调优一则--增大Eden Space提高性能

    版权声明:本文为横云断岭原创文章,未经博主同意不得转载.微信公众号:横云断岭的专栏 https://blog.csdn.net/hengyunabc/article/details/24924843 ...