zoukankan      html  css  js  c++  java
  • 美术资源优化/LOD

    在提升画质的时候,“优化”是必须要面对的问题,而且随着画面一步一步的提升,优化需要付出的时间和人力会越来越多。而优化中一个很重要的部分就是美术资源的优化,需要制定合理的制作规范,设计一个好的LOD系统。我们既追求画面表现又希望游戏有流畅的体验,一套好的LOD系统需要美术在资源上做大量的资源分级工作,需要程序搭建完善的LOD框架和辅助工具,每增加一个功能模块都需要把LOD考虑进来。

    目前项目持续维护的LOD框架,定义了四档画质,其中最高画质就是一种技术前瞻,可能不适合于现在的主流移动平台硬件设备,但是能正常表现出画面噱头和竞争力,比如手游项目不敢尝试的全局实时光照、真实的PBR、HDR。关注性能的重心还是放在中配画质和低配画质上,优化的分界线出现在中和低之间,美术资源主导高、低两套资源(模型、贴图、特效、UI)。目前UI方面的全局考虑不足,没有一套完善的LOD。

    一、如何确定项目的LOD分档和性能标准

    LOD(Level of Detail),这里的D代表Detail而不是Distance,也就是说,所有游戏画面和游戏功能的细节都可以进行分级,不必受限于距离。

    1、如何制定性能标准?

    在分级之前,需要确定目标(省电、正常的游戏体验、噱头),我们要在哪一种机型上面运行哪些表现效果和功能,达到怎样的性能目标(帧数FPS、内存占用、Drawcall、同屏三角面数等)。

    • 经验总结:

    1)画质的表现力与性能开销是相互矛盾的

    2)需要持续维护,相关功能系统的设计都需要考虑到不同画质

    3)极简画质牺牲了可玩性,同时会增加LOD框架的复杂性,使用最简单暴力的方式去处理

    • 兼容性问题:

    1)低配画质需要考虑的适配问题

    • 可能不支持Shader定义8张以上的贴图纹理

    • 可能不支持ETC2格式的贴图纹理

    • 可能不支持OpenGL ES3.0

    2)高配画质需要考虑的问题

    • 支持PBR、线性空间

    • 奇怪的Bugs

    3)需要解决各个画质下的兼容性问题,建立黑名单和白名单。

    2、如何找出可以进行分级的细节?

    • 优先找出开销大的点

    • 后处理效果Bloom、HDR、ToneMapping、MotionBlur、DOF等

    • 实时光照和阴影、水面实时反射

    • PBR物理光照

    • Ragdoll、DydamicBones等物理系统

    • 日夜循环、特效天气系统

    • 细节模块的LOD功能考虑

    • 场景 / 角色 / 特效 / 摄像机相关 / 其他系统模块

    二、LOD模块细分

    1、场景相关

    • Shader LOD

    • shader.globalMaximumLOD来指定不同画质的LOD值

    • Shader内部定义多个SubShader,逐个降低计算和纹理采样

    使用Shader LOD存在一个问题,在Properties中定义的贴图,在低级别的SubShader中虽然不被采样和计算,但是仍会有内存占用。建议和角色一样,设计LOD框架时考虑两份prefab,支持场景转一份低配场景文件给低配使用。

    • 制作时合理使用高低模

    • 场景物件分级Level_1、Level_2、Level_3

    • 含场景特效、场景动画物件等,在不同的级别显示/隐藏

    最早期我们采用距离来控制场景特效的显示。缺点:

    1)实时监控距离的开销

    2)每个场景需要单独配置合理的距离值

    使用层级来控制更为直接,在制作LOD时最优先考虑最简单暴力的方式,这样美术规范也不会太复杂,后期也不需要过多的维护。

    • 场景光照切换

    • Light/Light_High 涉及实时灯光对角色、场景阴影绘制的控制

    • 场景光照图切换

    • 物件的Layer层决定阴影

    • 场景文件中配置的Cast Shadows和Receive Shadows设置给烘焙使用,不方便存储下来
    • 设计不同的Layer来决定物件是否产生阴影和接受阴影

    • 角色产生阴影

    • 高配时玩家和Npc角色的Layer修改为Shadow,低配时修改为Player/Npc

    • 中配时玩家自身和Boss角色的Layer修改为Shadow,其他玩家为Player

    • Shadow层绘制实时阴影,Player/Npc会使用圆片来绘制脚底阴影

    • 角色接收阴影

    • 仅在高配画质开启接收阴影

    • 裁剪距离、雾效距离

    • 设计裁剪距离与雾效距离按照百分比减小的算法,防止数值异常

    • 后期处理效果

    • 全局后期处理

    通过全局后期处理管理后期的开启、关闭,控制自定义的选项。

    • 场景后期处理

    场景配置高、低两种后期处理方案,低配时只使用ColorGrading。

    • UI和剧情动画中的后期处理只在高配时开启

    比如:UI中使用的Bloom、剧情中使用的RadialBlur运动模糊等。

    • 日夜循环

    • 单个场景的特效等级

    通过配置表定义场景的类型和同屏可显示的特效数量和等级。

    2、角色相关

    • 角色模型、材质、shader、贴图

    • 通过配置表,在不同画质调用不同的prefab

    • A.prefab和A_Low.prefab使用A.mat和A_Low.mat

    • A_Low.mat使用的Shader降低计算和贴图纹理采样

    • A_Low.mat使用的_MainTex替换低精度贴图纹理

    • A.prefab和A_Low.prefab使用A.fbx和A_Low.fbx

    • LODGroup

    • 角色的模型面数标准提升后,制作高模、低模两档,通过LODGroup功能按距离降档

    • SubShader

    • 高配和中配的光照模型切换,PBR切换Blinn-Phong

    • 角色部件

    • 部件在配置表中可配置为空,在低配时可以不显示背部挂件

    • 角色骨骼Skin Count

    • Skin支持的最大骨骼数降级2-Bones 1-Bones

    • DynamicBone基于物理系统的动态骨骼效果的开关

    • Npc死亡动作基于物理系统的表现的开关

    • 同屏角色数量

    • 不同画质设置不同的同屏显示角色上限

    • 无逻辑任务的客户端NPC开关

    3、特效相关

    • 天气系统

    • 制作不同数量级的粒子系统

    • 脚步特效

    • 开启和关闭脚步特效,可对玩家自身和其他玩家分开控制

    • 掉落特效

    • 复杂特效可以制作简化版本

    以上三种特效都可以通过简单的配置表功能完成。

    • 技能特效

    • 通过配置表,在不同画质调用不同的prefab

    • 技能特效的标准

    • 制作阶段控制特效的性能开销

    • 工具辅助生成*_Low.Prefab

    • 严格控制*_Low.Prefab的性能开销

    4、 其他模块

    • 渲染分辨率

    • 使用不同的渲染分辨率,且限制最高分辨率为1080p

    • 开放视角

    • 视角上下左右旋转和

    • 摄像机最远最近距离

    • 脚本控制

    特殊情况下需要制作可以在四种画质下进行切换的配置,通过脚本控制:

    • Prefab切换

    • Material切换

    5、 不适合LOD的系统模块

    • UI

    • UI上的图素和特效不适合做显隐和优化

    • UI场景不适合做烘焙和实时光的切换

    • UI角色可以根据界面的重要程度选择使用高级或低级

    • 管理好加载和卸载后,可以考虑替换高低配UI资源

      • 剧情
  • 相关阅读:
    Nginx入门
    Spring基础知识汇总 Java开发必看
    java ArrayList倒序
    1
    js event 的target 和currentTarget
    java 文件的写入和读取
    DOMContentLoaded与load的区别
    JS中先有Object还是先有Function?
    JSON.stringify的三个参数
    Java的泛型约束和限制
  • 原文地址:https://www.cnblogs.com/lancidie/p/14212182.html
Copyright © 2011-2022 走看看