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原本仅仅只需要渲染三角形,所以所有的顶点:
- 必须使用CPU进行变换(包括裁剪)。
- 必须从主寄存器中发送给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性能和局限性的更多相关文章
- 《zw版·Halcon-delphi系列原创教程》 3d汽车模型自动区域分割
<zw版·Halcon-delphi系列原创教程> 3d汽车模型自动区域分割 目前,图像分析,在3D设计,机器视觉方面拥有很广.这个Halcon脚本是3d汽车模型自动区域分割,很简单才20 ...
- Qt 3D教程(三)实现对模型材质參数的控制
Qt 3D教程(三)实现对模型材质參数的控制 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47131841.欢迎同行前来探讨. ...
- 使用webgl(three.js)搭建一个3D智慧园区、3D建筑,3D消防模拟,web版3D,bim管理系统——第四课
序:这段时间忙于奔波,好久没有更新了,今天更新一下,继续上节课的完善讲解,算是对前段时间的一个总结吧.披星戴月的时光也算有点应用效果了. 对于webgl(three.js)性能这一块我在上节课< ...
- 使用webgl(three.js)创建3D机房,3D机房微模块详细介绍(升级版二)
序: 上节课已经详细描述了普通机房的实现过程,文章地址(https://www.cnblogs.com/yeyunfei/p/10473021.html) 紧接着上节课的内容 我们这节可来详细讲解机房 ...
- 如何用webgl(three.js)搭建一个3D库房,3D密集架,3D档案室,-第二课
闲话少叙,我们接着第一课继续讲(http://www.cnblogs.com/yeyunfei/p/7899613.html),很久没有做技术分享了.很多人问第二课有没有,我也是抽空写一下第二课. 第 ...
- (转)stage 3d or unity 3d
这个是这样子的.stage3d如果不使用flascc的话,性能会卡在as上面.你没卡是因为你用的效果还不够高级.往深了走的高端应用就是卡as性能上.这不是你代码能优化了的.我们后来都改用flascc写 ...
- [译]Vulkan教程(02)概况
[译]Vulkan教程(02)概况 这是我翻译(https://vulkan-tutorial.com)上的Vulkan教程的第2篇. This chapter will start off with ...
- 如何用webgl(three.js)搭建一个3D库房,3D密集架,3D档案室(升级版)
很长一段时间没有写3D库房,3D密集架相关的效果文章了,刚好最近有相关项目落地,索性总结一下 与之前我写的3D库房密集架文章<如何用webgl(three.js)搭建一个3D库房,3D密集架,3 ...
- 物联网3D,物业基础设施3D运维,使用webgl(three.js)与物联网设备结合案例。搭建智慧楼宇,智慧园区,3D园区、3D物业设施,3D楼宇管理系统——第八课
写在前面的废话: 很久没有更新文章了,这段时间一直忙于项目落地,虽然很忙,但是感觉没有总结,没有提炼的日子,总是让人感觉飘飘忽忽的. 所幸放下一些事,抽出一些时间,把近期的项目做一些整理与记录.也算是 ...
随机推荐
- SpringBoot启动流程分析(一):SpringApplication类初始化过程
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- eclipse--windowBuilder
https://www.eclipse.org/windowbuilder/ https://www.eclipse.org/windowbuilder/download.php Documentat ...
- 有关SQL注入的知识
SQL注入攻击是非常令人讨厌的安全漏洞,是所有的web开发人员,不管是什么平台,技术,还是数据层,需要确信他们理解和防止的东西.不幸的是,开发人员往往不集中花点时间在这上面,以至他们的应用,更糟糕的是 ...
- 有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。
// ConsoleApplication12.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // ConsoleApplication1 ...
- CentOS系统环境下安装MongoDB
(1)进入MongoDB下载中心:http://www.mongodb.org/downloads We recommend using these binary distributions (官方推 ...
- 【Java并发编程实战】—–“J.U.C”:ReentrantLock之二lock方法分析
前一篇博客简介了ReentrantLock的定义和与synchronized的差别,以下尾随LZ的笔记来扒扒ReentrantLock的lock方法.我们知道ReentrantLock有公平锁.非公平 ...
- TP框架---thinkphp使用ajax
thinkphp使用ajax和之前使用ajax的方法一样,不同点在于之前的ajax中的url指向了一个页面,而thinkphp里面的url需要指向一个操作方法. 一.thinkphp使用ajax返回数 ...
- Python 进程、线程、协程、锁机制,你知多少?
1.python的多线程到底有没有用? 2. 为什么在python里推荐使用多进程而不是多线程 3.进程.线程.协程.各种锁 4.Python多进程编程
- vue 后台交互数据-编辑页面
思路~点击编辑按钮,需要获取当前列的id,然后根据id请求后台当前id的数据 1.~~ 2.接收id,并请求页面 获取数据
- 在JDK 6和JDK 7的substring()方法的区别?
原文链接:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/ 在JDK 6和JDK 7中subs ...