介绍 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. ArcMap中使用ArcPy实现Geometry与WKT的相互转换

    在Web GIS迅猛发展的今天,使用浏览器来进行交互以其方便性.快捷性被广大用户所推崇,那么在传输格式方面,都已比較简单的JSON或者WKT来解决网络带宽带来的数据压力. 在ArcGIS10.2版本号 ...

  2. Swiftl优秀的特性

    Swift语言在吸收诸多优秀语言如java.c++,Python之后.提供给开发人员大量优秀的特性. 以下我列举一下,swift一些优秀的特性: 1.函数使用经典的圆括号和点调用语法 2.函数标签特性 ...

  3. JavaMelody tomcat应用监控

    1 下载相关jar包,maven地址 测试发现 1.57.0版本tomcat6工程登陆报错,改用版本 1.50.0是正常的 <dependency> <groupId>net. ...

  4. python 基础 7.2 时间格式的相互转换

    #/usr/bin/python #coding=utf-8 #@Time   :2017/11/9 8:55 #@Auther :liuzhenchuan #@File   :时间格式的相互转换.p ...

  5. EasyNVR RTSP摄像机HLS直播服务器中使用Onvif协议获取设备快照

    我们知道EasyNVR中可以获取快照信息,之前的文章也说明了EasyNVR是如何进行快照抓取的 这里我们使用另一种方法进行快照的抓取 流程 获取设备能力Capabilities 获取设备的能力,并且可 ...

  6. SQLServer中游标实例介绍(转)

    引言 我们先不讲游标的什么概念,步骤及语法,先来看一个例子: 表一 OriginSalary                      表二 AddSalary 现在有2张表,一张是OriginSal ...

  7. struct对齐

    1 基本数据类型的自然对齐 就是说,基本数据类型的变量不能随便放在内存的任意位置,它们的起始地址必须被它们的大小整除. double是8个字节,float,int,enum是4字节,bool.char ...

  8. wx.onNetworkStatusChange(function (res) 监听网络状态变化 实践方案

    网络状态 · 小程序 https://developers.weixin.qq.com/miniprogram/dev/api/device.html#wxonnetworkstatuschangec ...

  9. ideal 快捷键

    1.输入sout --> System.out.println(); 2.输入psvm --> main函数; IntelliJ Idea 2017 免费激活方法 1. 到网站 http: ...

  10. Flask的Debug功能非常酷

    Flask是一个Python开发框架.在试用的过程中发现它的debug功能非常cool.如下图所示,在出错的页面每条栈新的右边都有一个按钮,点击之后我们可以执行Python代码,而且非常重要的一点是通 ...