[UE4]性能优化指南(美术向)

参考自官方文档:
Performance Guidelines for Artists and Designers
https://docs.unrealengine.com/en-us/Engine/Performance/Guidelines

但是官方文档写的太粗燥,对UE4没有一定了解,很难理解文档的意图。这里我在官方文档的基础上,结合自己遇到的问题,重新整理了一下,适合对UE4不熟的美术查阅。

以下是针对美术人员和关卡设计师的常规提升性能的指导意见

面向美术

  • 尽量减少每个物体上的元件数量。比如概设美术在设计角色形象时,有没必要为了表现效果为角色加很多装饰性部件,要把握好。如果是做静帧动画没什么问题,但若是实时渲染的游戏角色,要做取舍。
  • 为了让元件的三角面数更合理(比如每个元件的面数为300+),建议相关模型合并起来。比如,如果游戏没有换装需求,那么就将角色的帽子、肩甲等身体部件和身体合并,以减少面数。
  • Opaque贴图(不透明贴图)速度最快,因为它的Z buffer裁切速度最快;Masked贴图(蒙版贴图)稍微慢一点;Translucent贴图(半透明贴图)最慢,因为其性能消耗巨大。
  • 限制UV接缝数量和硬边(Maya中叫软硬边、Max和Blender中叫光滑组)数量,因为这两项会在硬件中生成大量顶点。最坏的情况,带硬边的高模会生成3倍于建模软件统计的顶点数(比如:Maya中显示模型顶点数为1万,显卡中实际计算的顶点数为3万)。
  • Skined Mesh(蒙皮网格物体)的顶点处理性能消耗比Static Mesh(静态网格物体)的高。比如,一个建筑从地面升起的动画,这种只是整个模型坐标的变化,就不要让动作美术去K动画,而应该使用UE4的Timeline去控制StaticMesh的坐标变化,以提升性能;再比如门打开关闭的动画,也不要手K,可以参考官方ContentExamples中的使用Timeline的做法。
  • 当使用了morph targets(比如表情动画)或者WorldPositionOffset(世界坐标偏移),顶点处理的消耗会大大增加。因为要做缓存,贴图的查找过程也会非常慢。
    UE4材质中的Morph Targets:

UE4材质中的WorldPositionOffset:

  • Tessellation(曲面细分)的性能消耗巨大(UE4提供了的运行时曲面细分),尽量避免使用;Pre-tessellation(预处理曲面细分,就是手动在建模软件中做好细分曲面)通常速度更快。(现在的次世代流程大部分都是使用法线贴图+低模,也有部分次世代游戏在使用曲面细分,比如PS4游戏《地平线:黎明时分》) UE4材质中的Tessellation Multiplier(开启方式:修改D3D11Tessellation Mode):

Maya中制作细分曲面流程
https://www.youtube.com/watch?v=L5fOwSmSaW8

  • 非常大的物体建议拆成多块,这样可以更好的做视距裁切和灯光裁切
  • 贴图格式越小则材质性能越好。比如:DXT1格式为4 bpp(每像素的比特位数),DXT5格式为8 bpp,未压缩的ARGB为32 bpp。

对于有Alpha通道的贴图,默认的DXT1格式会压缩过度,不支持Alpha通道,导致效果丢失,此时可以修改为低压缩率的格式,比如:UserInterface2D(RGBA)

  • 贴图尺寸越小性能越好(当贴图近距离显示时)。有时更小的贴图尺寸甚至更加平滑,作为双线性过滤(bilinear filtering )时,比贴图格式能提供更多的着色器(shader)效果。
  • 材质减少着色器指令(shader instruction)和贴图数量,运行时的查找过程更快。为了优化材质,可以使用UE4材质编辑器中的stats统计(材质编辑器顶部菜单)以及材质复杂度(ShaderComplexity,运行模式下F5,场景编辑模式下Alt + 8,绿色表示消耗极低,白色表示消耗极高)。
    点击Stats,查看贴图采样数、贴图查找时长等。

点击Platform Stats,查看各个平台的性能统计(桌面级、安卓、iOS等)

  • 如果贴图在很小的范围内还能看见(比如视线远处的模型LOD),则不要禁用纹理贴图(Mip Maps),否则会由于贴图缓存缺失而导致性能下降。
    Mip Gen Settings 设置为 NoMipmaps表示禁用。

  • 一些材质蓝图的计算表达式比较耗,比如:sin、pow、cos、divide、Noise;消耗较低的计算表达式包括:multiply、add、subtract、clamp。
  • 阴影模型(shading models,最常见的光照模型,游戏工业中用得多)的性能消耗标准:无光的区域消耗最低,有光的区域是消耗较大,这也是最常见的区域。其他光照模型(比如照明模型Illumination models,电影工业的光照模型)的性能消耗更大。
     

面向关卡设计

  • 限制Stationary(固定光源,不是静态光源)和 Dynamic(动态光源) 灯光的数量。
  • 尽量避免使用区域光源(Area light)。4.20提供了区域光源 Rect Light。

  • 对场景中较小的物体,编辑其属性draw distance来获得更佳的LOD裁切效果

确保LOD设置在一个激进变化的范围内(比如摄像机从很近一下拉倒很远,距离变化很小的不用做LOD),且LOD的定点数量变化倍数至少是两倍。优化时,打开wireframe模式,然后查看是否存在大的色块,如果有说明优化有问题。如果使用Simplygon(一款商业付费的UE4插件),几分钟就可以处理掉整个项目的LOD。

  • 尽量将类似信息的光源合并。比如,车的头灯可以用一个光源以及一个光照函数让它看起来是两个灯的效果。
  • 静态光照最快,固定光照稍慢一些,动态光照最慢。
  • 按照需要,尽量限制光照的衰减半径以及光锥的角度。
  • 动态/固定点光源是最费的。方向光源要稍好一些,最好的是聚光灯光源。阴影贴图生成的性能开销和造成物体阴影的光照视锥体(light frustum)有关。
  • 光照函数具有额外的性能开销(实际开销取决于材质),并能防止灯光被渲染成 Tiled Light。
  • IES profiles 具有额外性能开销(比光照函数好一些),并能防止灯光被渲染成 Tiled Light。但不要在可以用聚光灯光锥就能完成效果的情形下,还使用 IES。
  • Billboards,imposter meshes,或 skybox textures 都能用来代替实际的几何体物件并有效的提高性能。
  • 好的关卡设计师能够将遮蔽裁剪纳入考虑优化关卡(添加一些阻挡视线的物件来提高性能)。使用 r.VisualizeOccludedPrimitives 可以直接查看。
    控制台命令开启遮挡物件可视化:
r.VisualizeOccludedPrimitives 1

  • 避免使用 Light Propagation Volumes,如果要使用,使用 GIReplace 材质表达式,或者在大部分物件上禁用它,以提升性能。
  • 在不需要的地方应该关闭阴影生成( shadow cast),一个个物件的关闭,或者一个个灯光来关闭。
  • 在编辑器中使用 ProfileGPU(Ctrl + Shift + ,)快速了解信息以及哪部分比较慢。
  • 贴花的性能开销和它们覆盖的像素数量有关。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4 Fix – “Lighting build failed. Swarm failed to kick off.”

Hello! Have you encountered the “Swarm Failed to Kick Off” error on an Unreal Engine project when trying to build a level? I did, after we switched to a custom engine build. Since most of the resources on the web were not helpful. Here’s a really simpl…

贪吃蛇 WPF

贪吃蛇 WPF using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Wind…

阿旺wifi智能系统源码

系统简介本系统适合DD-WRT固件路由器和OoenWrt固件路由器或者任何带有WIFIDOG插件的路由器。系统基于ThinkPHP框架PHPMySQL的技术开发。系统主要功能: 1.无密码认证:只点击按钮或强制看广告1.验证码认证:招待券认证、一次性账号、指定时间限制3.用户名密…

warning C4828问题的处理

warning C4828: 文件包含在偏移 0x215 处开始的字符,该字符在当前源字符集中无效(代码页 65001)。 (编译源文件 XXXXXXcpp) 这提示是由于字符集的问题导致,解决方案如下 点击VS2017 文件->另存为->编码保存->65001 然后重新编译,警告问题解决…

lecture3-线性神经元和算法

Hinton第三课 这节课主要是介绍NN的输出端常用的神经元,然后重点是说明怎么使用BP来计算偏导数,在Hinton这一课中,他提供了他1986年参与写的《并行分布处理》一书的第8章,49页,这本书的编者是当你的认知神经界的Rumelh…

8个有趣的Linux提示与技巧

我们时不时给你带来关于Linux的提示与技巧。这里我们总结了8个最有趣的提示和技巧。推荐学习Linux视频教程。 以它们的大小列出文件如果你想要一个基于它们大小排序的文件列表,你可以使用下面的命令。它会以递减顺序排列文件。# ls -l | grep ^- | sort -nr -k 5 | …

Ubuntu 14.04 文件服务器--samba的安装和配置

samba是Linux系统上的一种文件共享协议,可以实现Windows系统访问Linux系统上的共享资源,现在介绍一下如何在Ubuntu 14.04上安装和配置samba一、 一、更新源列表 打开"终端窗口",输入"sudo apt-get update"-->回车--…

export LD_LIBRARY_PATH 的使用

对linux不是很熟,之前只是听说过可以设置程序共享库位置也就是 使用 “export LD_LIBRARY_PATH” 今天用了用,感觉还挺不错,也很常用。 比如你编译了一个so 而这个so 同时又依赖其他第三方库。如果你想把你编译的so 提供给别人用的话&#…

创建mip纹理链

(1) 我们要做的是,根据原始纹理T0创建一系列的纹理(通常使用平均滤波):T1、T2…Tn,其中每个纹理的大小都是前一个纹理的1/4,即长度和宽度减半,如图12.40所示。 要根据前一个mip纹理计算当前纹…

Oracle RAC学习笔记:基本概念及入门

oracle 10g real application clusters introduction 1、什么是cluster一个cluster是由两个或是多个独立的、通过网络连接的servers组成的。几个硬件供应商多年以来提供了Cluster性能的各种需求。一些Clusters仅仅为了提供高可用性的,在当前活动的node发生故障时…

Jetty 的工作原理以及与 Tomcat 的比较

http://www.ibm.com/developerworks/cn/java/j-lo-jetty/Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所…

最大子图形问题

CODEVS1159最大全0子矩阵 题目描述 Description 在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多。思路:这个题最朴素的n^6的算法,超时美美的。。。然后想优化,从一个点向上方、左方、右方扩展,首先更…

UE4多线程

UE4中最基础的模型就是FRunnable和FRunnableThread,FRunnable抽象出一个可以执行在线程上的对象,而FRunnableThread是平台无关的线程对象的抽象。后面的篇幅会详细讨论这些基础设施。 1. FRunnable UE4为我们抽象FRunnable的概念,让我们指定…

UE4异步编程专题 - 线程池FQueuedThreadPool

1. FQueuedThreadPool & IQueuedWork FQueuedThreadPool是UE4中抽象出的线程池。线程池由若干个Worker线程,和一个同步队列构成。UE4把同步队列执行的任务抽象为IQueuedWork. 线程池的同步队列,就是一个IQueuedWork的队列了。借用wiki上线程池的图,…

UE4异步编程专题 - 多线程

专题的第二篇,我们聊聊UE4中的多线程的基础设施。UE4中最基础的模型就是FRunnable和FRunnableThread,FRunnable抽象出一个可以执行在线程上的对象,而FRunnableThread是平台无关的线程对象的抽象。后面的篇幅会详细讨论这些基础设施。 1. FRu…

坑爹的UICollectionView

最近用UICoolectionView的时候遇到一个很DT的问题,我往VC里加12个视图,结果显示成这样(右边是期待的样子): 研究了一下午,终于发现了问题: interface FpLabelCell : UICollectionViewCellproper…

UE4异步编程专题 - TFunction

0. 关于这个专题 游戏要给用户良好的体验,都会尽可能的保证60帧或者更高的fps。一帧留给引擎的时间也不过16ms的时长,再除去渲染时间,留给引擎时间连10ms都不到,能做的事情是极其有限的。同步模式执行耗时的任务,时长…

UE4高级功能--初探超大无缝地图的实现LevelStream

LevelStream 实现超大无缝地图--官方文档学习 The Level Streaming feature makes it possible to load and unload map files into memory as well as toggle their visibility all during play. This makes it possible to have worlds broken up into smaller chunks so th…

inside uboot (二) 启动流程

1. S3C6410 启动流程 1). 6410上电后,首先执行片内iROM的程序(BL0),初始化时钟和看门狗等外围器件。 2). 然后把flash中头4K(BL1)的内容加载到片内的SRAM中执行。 3). 在SRAM中执行的BL1,初始…