[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,一经查实,立即删除!

相关文章

HTTP协议中返回代码302的情况

http协议中,返回状态码302表示重定向。 这样的情况下,server返回的头部信息中会包括一个 Location 字段,内容是重定向到的url 转载于:https://www.cnblogs.com/mengfanrong/p/4059628.html

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…

Linux修改开机启动logo

默认开机LOGO会在液晶屏的左上脚显示一只小企鹅,分辨率为80*80,具体在kernel/drivers/video/logo下会有logo_linux_clut224.ppm这幅图像,程序会根据这幅图像生成logo_linux_clut224.c和 logo_linux_clut224.o两个文件,最终将小企…

sqlite3使用简介(内含解决sqlite内存的方法)

一.使用流程 要使用sqlite,需要从sqlite官网下载到三个文件,分别为sqlite3.lib,sqlite3.dll,sqlite3.h,然后再在自己的工程中配置好头文件和库文件,同时将dll文件放到当前目录下,就完…

动态更新纹理

1. 创建C类继承自AStaticMeshActor 2. 定义用于渲染队列的数据结构 struct FUpdateTextureData {FTexture2DResource* Texture2DResource;FUpdateTextureRegion2D* UpdateTextureRegion;uint8* DynamicColors;int32 w; }; 3. 增加成员变量 UMaterialInstanceDynamic* mDynam…

阿旺wifi智能系统源码

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

动态更新纹理闪烁问题

1. 模型旋转角度尽量取整数,保证线条不会出现锯齿 2. 修改反锯齿模型为FXAA方式,默认的TemporalAA方式会闪烁 3. 动态更新的纹理尺寸一般都不会是2的N次方,比如401X518。 解决方案是 动态更新一张1024x1024的贴图的其中401X518,…

warning C4828问题的处理

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

OC中description、 SEL、类本质、self和super用法

一:description方法 description有对象方法和类方法两种,(是NSObject类的方法)1,-description(对象方法) 使用NSLog和%输出某个对象时,会调用对象的description方法,并拿…

修改场景默认pawn的方法

playstart方法 1. 放置playstart到场景中 2. 修改world settings的GameMode 直接放置pawn方法 1. 放置pawn到场景中 2. 修改world settings的GameMode 3. 修改pawn的Auto Possess Player为Player 0

lecture3-线性神经元和算法

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

ubuntu开机出现错误“Error found when loading /root/.profile”解决

在刚修改完root权限自动登录后,发现开机出现以下提示: Error found when loading /root/.profile stdin:is not a tty 解决方法:在终端中用命令gedit /root/.profile,打开文件后找到“mesg n”, 将其更改为“tty -s …

DropBox 超实用的免费文件网络同步、备份、分享工具

http://www.iplaysoft.com/dropbox.html DropBox 就是一款非常好用的免费网络文件同步工具(当然它也算是一个服务)。当你在电脑A使用DropBox时,指定文件夹里所有文件的改动均会自动地“同步”到DropBox的服务器,当下次你在电脑B需要使用这些文件时&#…

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 提供给别人用的话&#…

MongoDB命令及SQL语法对比

mongodb与mysql命令对比 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collectio…

[oracle] 组织架构退格显示 connect by

1. 按组织架构关系退格显示 create or replace view v_vieworg asselect --v.OBJID,v.OBJNAMElevel as levelid, lpad(        ,2*level-2)||v.OBJNAME as OBJNAME,v.OBJID,v.OBJCODE,v.ISDEPT,v.PARENTAREAID,v.PARENTDEPTID,v.ParentID,v.canceledfrom v_organddept …

创建mip纹理链

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