Unity静态资源优化

news/2025/10/24 21:37:34/文章来源:https://www.cnblogs.com/dingzhaoliang/p/19164270

Unity静态资源优化

目录
  • 1.音效资源
    • Force To Mono
      • Normalize
    • Load In Background
    • Ambisonic
    • Load In Background / Preload Audio Data
    • Compression Format
    • Load Type
    • Sample Rate Setting
    • 音频配置
  • 2.Model导入设置检查与优化
    • 定义外部资源导入管线
    • 模型导出尺度检查流程
    • BuildSetting-PlayerSetting-Optimization存在模型优化选项
  • 3.纹理导入设置检查与优化
    • 纹理大小注意事项
    • 纹理图集
    • 纹理过滤
    • 纹理Mipmap
    • 工程纹理优化流程
  • 4.动画导入设置检查与优化
    • Animation Type选择依据
    • Skin Weights
    • Optimize Bones
    • Optimize Game Objects
    • Anim.Compression
    • 动画文件导入设置优化后信息查看原则

1.音效资源

推荐Audio资源原始格式 .wav

Force To Mono

强制音频成为单声道音频。若双声道音频在不同声道播放同样内容,则可开启此项以优化开销。

Normalize

启用此选项后,音频将在“强制转单声道”混合过程中进行 归一化

Load In Background

启用此选项后,片段的加载将在一个单独的线程上延迟一段时间发生,不会阻塞主线程。

Ambisonic

双耳声音频源以一种格式存储音频,该格式表示可以根据监听器方向旋转的声音场。它适用于 360 度视频和 XR应用程序。如果您的音频文件包含双耳声编码音频,请启用此选项。

Load In Background / Preload Audio Data

LoadInBackground可以理解为异步加载,PreloadAudioData可以理解为预加载。如果未启动任意一个选项,则在场景中使用较大音频时,由于音频加载时间较长,还会在调用音频时因运行过程中主线程暂停从而导致严重问题。如果只启动了Load In Background,则音频的加载不会导致主线程的暂停,但由于是现用现加载,所以依然可能会音画不同步。如果只启动了Preload Audio Data,则会在加载场景时进行音频预加载,但较长的音频加载时长会在加载场景时因主线程暂停从而增加加载时长。 二者均启动时,会在加载场景时进行音频预加载,则需要播放音频时不会产生加载延迟,同时音频预加载也不会导致主线程的暂停。

Compression Format

该压缩方式只影响包体大小,与内存无关。

  • PCM:无损格式,在播放音频时不需要额外的CPU资源进行音频的解码。但原始文件较大。
  • Vorbis:可提供压缩比例自定义的有损压缩。但在音频播放时需要更多的CPU进行音频的解码。
  • MP3:提供高效的有损压缩,并且不会降低音频质量。但MP3不能无缝循环,即无法应用在如背景音乐在内的循环播放场合。
  • ADPCM:具有大约3.5的固定压缩比,本质上是PCM和Vorbis/MP3之间的折衷选择。但对于高频的音乐素材,有可能会存在异常的噪声。

Load Type

音频播放需要经历 Asset->Memory->Device 三个阶段,三个阶段间进行过渡的行为称为加载播放。音频本身作为Asset存放时可能是已经通过编解码方式进行过压缩(上述CompressionFormat),而在最终播放出来前,需要进行解码还原成无损格式进行播放。 该LoadType选项配置的是,何时进行解码行为。

Decompress On Load :在加载行为中进行解码。会增加内存的压力,但CPU较小。主要适用于高频使用的小型音频。

Compressed In Memory: 在播放行为中进行解码。会减小内存的压力,但CPU开销较大。主要适用于低频使用的音频。

Streaming:不经历上述三个阶段,即音频不加载入Memory进行过渡,而是由外存中的Asset直接解码存入CPU中。内存压力非常小,整体音频加载播放速度快,相对得CPU开销大。主要适用于大型音频。

Sample Rate Setting

移动平台该音频采样率不应超过22050Hz。若默认采样率超过该数值可通过override进行复写。

音频配置

  • 短音效:使用PCM或ADPCM (可容噪音,如脚步声/爆炸/武器);
  • 长音效/音乐:使用Vorbis,质量无需100%。
  • 不常出现的音乐/音效:使用CompressedInMemory或Streaming(节省内存)

2.Model导入设置检查与优化

定义外部资源导入管线

Mesh、材质、贴图、动画等不应完全混合成FBX直接导出,不利于后期的迭代管理。分别对Mesh、贴图在Unity工程中进行归档,并在Unity中进行材质的配置。同理动画也应单独归档。基于AssetPostProcessor类实现导入Unity的外部资源格式统一。

模型导出尺度检查流程

  • 1.检查下是否存在Transform中Scale不为(1,1,1)的情况。若存在:如果好修改就顺手改掉;不好改则建议让美术同学重新加工下。Transform中Scale为(1,1,1)是后续检查流程的前提。
  • 2.确保Transform中Scale为1时,再次查看模型导入配置中的ScaleFactor和ConvertUnits的配置分别为1和enable。
  • 3.若上述均已确认但大小依然不对,则可以认为是【Unity对于该模型格式(Fbx等)的尺度预设】与【美术对于该模型格式的默认尺度设置】不一致。

​ 3.1 处理方案一:由美术重新调整模型尺度,即确保导出fbx中的单位1对应的是厘米。

​ 3.2 处理方案二:调整Unity模型导入配置中的ScaleFactor。

  • 4.不管怎么样,都不应该让Transform的Scale不为(1,1,1)。

BuildSetting-PlayerSetting-Optimization存在模型优化选项

VertexCompression配置项:对顶点使用Half的精度格式存储。 其将减少内存中网格数据的大小,并稍微减少包体文件大小,同时提高 GPU 性能。其将影响项目中每个Mesh的设置。对同一Mesh数据,顶点压缩与网格压缩不会同时存在,若FBX的ImportSetting中启动MeshCompression相关配置,则此处的VertexCompression将失效。该配置中各个选项具体是指,对哪些channel使用顶点压缩,默认为Normal、Tangent、TexCoord0、TexCoord2、TexCoord3。默认开启压缩的通道为Unity推荐配置,若压缩更多通道,需确认是否会产生额外的伪影。

OptimizeMeshData选项: 开启该选项时,则在打包时剔除Mesh顶点未被使用的channel数据。

3.纹理导入设置检查与优化

纹理大小注意事项

不同平台、不同硬件配置选择不同的纹理大小,Unity下可以采用bundle变体设置多套资源、通过Mipmap限制不同平台加载不同level层级的贴图。

根据纹理用途的不同选择不同的纹理加载方式,如流式纹理加载Texture Streaming、稀疏纹理Sparse Texture、虚拟纹理VirtualTexture等方式。

不能让美术人员通过增加纹理大小的方式增加细节,可以选择细节贴图DetailMap或增加高反差保留的方式。

在不降低视觉效果的情况下尽量减小贴图大小,最好的方式是纹理映射的每一个纹素的大小正好符合屏幕上显示像素的大小。如果纹理小了会造成欠采样,纹理显示模糊,如果纹理大了会造成过采样,纹理显示噪点。可以充分利用Unity编辑器中的【BuildIn:SceneView->DrawMode->Mipmap】或【URP:URP Render Debugger】,来查看在游戏摄像机视角下进行overdraw检查,进而确认所需纹理大小。

纹理图集

纹理图集是一系列小纹理图像的集合。

优点:采用共同纹理图集的多个静态网格资源可以进行静态合批处理,减少DrawCall调用次数。纹理图集可以减少碎纹理过多,因为他们打包在一个图集里,通过压缩可以更有效的利用压缩,降低纹理的内存成本和冗余数据。

缺点:纹理尺寸限制。合并到纹理图集中的每个小纹理都必须符合一定的尺寸限制。如果某些小纹理尺寸过大,可能会导致整个图集的尺寸超出硬件或软件的限制,从而限制了使用纹理图集的场景。UV空间限制。在将多个小纹理合并成一个大纹理时,需要为每个小纹理分配一定的UV空间。如果小纹理之间的UV空间重叠或浪费过多,可能会导致图集的利用率下降,从而减少了优化效果。动态更新困难。由于纹理图集是静态的,一旦创建后就不易修改。这意味着如果需要动态加载或更新纹理,可能需要重新生成整个图集,这会带来一定的开销和复杂性。纹理压缩损失。将多个小纹理合并成一个大纹理后,通常需要对图集进行压缩以减少内存占用。然而,压缩会引入一定程度的纹理损失,可能会导致图像质量下降。不适用于所有场景。虽然纹理图集在许多场景下都能够有效提高性能,但并不适用于所有情况。例如,在需要频繁动态加载或更新纹理的场景下,纹理图集可能并不适用,因为它们不太灵活。

纹理过滤

各个纹理过滤类型:

Nearest Point Filtering:临近点采样过滤最简单、计算量最小的纹理过滤形式,但在近距离观察时,纹理会呈现块状。

Bilinear Filtering:双线性采样过滤会对临近纹素采样并插值化处理,对纹理像素进行着色。双线性过滤会让像素看上去平滑渐变,但近距离观察时,纹理会变得模糊。

Trilinear Filtering:三线性过滤除与双线性过滤相同部分外,还增加了Mipmap等级之间的采样差值混合,用来平滑过度消除Mipmap之间的明显变化。

Anisotropic Filtering:各向异性过滤可以改善纹理在倾斜角度下的视觉效果,跟适合用于地表纹理。 在最新的Unity版本中,纹理过滤相关功能被拆成了Texture在ImportSetting中的FilterMode和AnisoLevel两个配置项。

选择合适纹理过滤的最佳经验: 使用双线性过滤平衡性能和视觉质量。有选择地使用三线性过滤,因为与双线性过滤相比,它需要更多的内存带宽。 使用双线性和 2x 各向异性过滤,而不是三线性和 1x 各向异性过滤,因为这样做不仅视觉效果更好,而且性能也更高。保持较低的各向异性级别。仅对关键游戏资源使用高于 2 的级别。

纹理Mipmap

逐级减低分辨率来保存纹理副本,以实现纹理LOD。渲染纹理时,将根据像素在屏幕中占据的纹理空间大小选择合适的Mipmap级别进行采样。

优点:GPU不需要在远距离上对对象进行全分辨率纹理采样,因此可以提高纹理采样性能。同时也解决了远距离下的过采样导致的噪点问题,提高的纹理渲染质量。

缺点:由于Mipmap纹理要生成低分辨率副本,会造成额外的内存开销。

工程纹理优化流程

工程配置Mipmap、流式加载、虚拟纹理、异步加载环境。

对于导入Unity的纹理,手动或自动化选择适当的纹理导入配置,并根据实际应用场景、观察视角等选择合适的纹理尺寸和压缩配置。

如果存在对大纹理的需求,优先考虑细节贴图的实现思路。

OverDraw检查。

配置完成后,在实际工程中检测具体内存开销是否异常。

4.动画导入设置检查与优化

Animation Type选择依据

无动画选择None;非人形动画选择Generic;人形动画需要Kinematices或Animation Retargeting功能,或者没有有自定义骨骼对象时选择Humanoid Rig。其他都选择Generic Rig,骨骼数一致情况下,Generic Rig会比Humanoid Rig省30%以上的CPU开销。

Skin Weights

蒙皮最多受到影响的骨骼数量。默认配置4根骨骼,但对于一些不重要的动画对象可以减少到1根,节省计算量。

Optimize Bones

建议开启,在导入时自动剔除没有蒙皮顶点的骨骼

Optimize Game Objects

在Avatar和Animatior组件中删除导入游戏角色对象的变换层级结构,而使用Unity动画内部结构骨骼,消减骨骼transform带来的性能开销。 可以提高角色动画性能,但有些情况下会造成角色动画错误,这个选项可以尝试开启但要看表现效果而定。 除了在ImportSetting中进行配置,在运行时通过代码调用AnimatorUtility.OptimizeTransformHierarchy接口仍然可以达到此选项效果。

Anim.Compression

Off:不压缩,质量最高,内存消耗最大;

Keyframe Reduction:减少冗余关键帧,减小动画文件大小和内存大小;

Keyframe Reduction and Compression:减小冗余关键帧的同时,对关键帧存储数据进行压缩,动画文件更小,内存不受影响,且CPU开销相对仅减少冗余关键帧变大;

Optimal:仅适用于Generic与Humanoide动画类型,由Unity决定如何进行压缩(紧缩式数据压缩/流式数据压缩)。

动画文件导入设置优化后信息查看原则

一看效果差异(与原始制作动画差异是否明显);

二看曲线数量(总曲线数量与各种曲线数显,常量曲线比重大更好);

三看动画文件大小(以移动平台为例,动画文件在小几百k或更少为合理,查过1M以上的动画文件考虑是否进行了合理优化)。

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

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

相关文章

【Java】Spring @Transactional 事务失效:9大经典『陷阱』及终极解决方案

@Transactional 注解是 Spring 框架中声明式事务管理的核心,它极大地简化了开发人员的事务管理工作。然而,在日常开发中,我们常常会遇到一个令人困惑的问题:“明明加了 @Transactional 注解,为什么事务没有生效?…

【模板】动态 dp 学习笔记(树剖版)

动态 dp 学习笔记(树剖版) 本文同步发表于 cnblogs。 本文同步发表于 luogu。 前置知识:简单 dp 树链剖分 矩阵乘法和广义矩阵乘法P4719 【模板】动态 DP 本文着重讲下修改的具体过程以及代码实现,蒟蒻花了好长时间…

ABP - JWT 鉴权(JWT Authentication)[AbpJwtBearerModule、JwtBearerOptions]

JWT 鉴权(JWT Authentication) 核心辅助类:AbpJwtBearerModule:JWT集成模块。 JwtBearerOptions:JWT配置选项。JWT(JSON Web Token)是ABP框架中常用的无状态鉴权方案,核心作用是“让客户端携带Token访问接口,…

软考四

软考四Posted on 2025-10-24 21:33 心默默言 阅读(0) 评论(0) 收藏 举报1. 操作系统的概念2. 进程管理3. 存储管理4. 文件管理

CSP-S2022

T1 首先可以花 \(O(n(n + m))\) 的时间求出任意两个点是否可以通过至多转车 \(k\) 次到达。若 \(f_{u, v} = 1\) 表示可以,否则不可以。 先暂时忽略景点不能相同的限制。因为有 \(4\) 个景点,不能 \(O(n^4)\) 全部枚…

Hugo主题定制速查手册

以下是为你整理的《Hugo主题定制速查手册》,涵盖核心配置、模板修改、样式调整、功能扩展等关键场景,方便快速查阅: 一、核心配置速查表(config.toml)配置类别 关键参数示例(TOML格式) 说明网站基础信息 baseUR…

10/24

今天没课

Hugo主题的修改和配置

Hugo主题的修改和配置核心围绕配置文件(控制全局参数)和主题目录结构(修改页面布局、样式与功能)展开,本质是通过调整参数和自定义模板来实现个性化需求。 一、主题配置:通过配置文件控制全局参数 Hugo的配置文件…

多元生成函数+多项式方程组——[AGC058D] Yet Another ABC String

多元生成函数+多项式方程组——[AGC058D] Yet Another ABC String 计算小练习 7(AGC085D) - 洛谷专栏

最小生成树 kruskal算法

一个贪心算法,先排序,然后从小到大开始选边; 同时用并查集来维护两个点是否连通,如果当前边连接的两个点已经连通,那么说明选这条边没有任何意义,一定是劣的(因为前面已经排了序) #include<bits/stdc++.h&g…

Tarjan练习

见pdf https://wwak.lanzouo.com/ipQq6398irbc

Python开发之设置Hugging Face的模型缓存目录(HF_HOME )及模型下载超时问题(HF_ENDPOINT)

当我们本地Python开发下载Hugging Face模型的时候 下载的模型默认缓存是在用户盘底下的 一般是C盘,但是模型一般都比较大,这就导致C盘系统盘爆满,所以要修改默认缓存路径点击WIN+R 输入control 如下图所示 打开 控…

Java中的字符串及相关类的介绍

🔺jdk1.8 String底层是char[],字符数组。 1.String不是Java基本数据类型,不可以被继承,因为final关键字修饰. 2.String和StringBuilder、StringBuffer的区别 2.1 String的值创建后不能修改,修改String操作会创建新的…

10.24上课笔记

CF1276B 给你一张n个点m条边的无向图,给定两个点a和b,问有多少点对(x,y)之间的路径必须经过a和b两个点 x,y \(\neq\) a,b \[1 \le n \le 2 *10^5, 1 \le m \le 5*10^5 \]hint1 判断a,b都是割点 CF999E 给你一个n个点…

洛谷 P7011 Escape

房间情况记为 \(a_u\)。 首先,判定能否逃走,可以在 \(t\) 点下面挂一个编号为 \(n+1\) 的点,权值为 \(+\infty\)。判定就转化为,能否在题设限制中,最终的体力达到 \(+\infty\)。 然后考虑这个英雄会怎么走。 他可…

你可以把它喂给AI让AI猜猜我在干什么

// code by 樓影沫瞬_Hz17 #include <bits/stdc++.h> using namespace std;#define getc() getchar_unlocked() #define putc(a) putchar_unlocked(a) #define en_ putc(\n) #define e_ putc( )// #define int l…

nginx反向代理和负载均衡 - 实践

nginx反向代理和负载均衡 - 实践2025-10-24 21:10 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !import…

ABP - 审计日志 [AuditedAttribute、IAuditingManager、EntityAuditingHelper]

审计日志核心辅助类:AuditedAttribute:标记类/方法记录审计日志。 IAuditingManager:手动管理审计日志。 EntityAuditingHelper:实体审计辅助(自动填充创建/修改时间)。审计日志(Auditing)核心类示例与讲解 AB…

【深入浅出Nodejs】异步非阻塞IO

概览:本文介绍了阻塞I/O、非阻塞I/O、多路复用I/O和异步I/O 四种模型,在实际的操作系统和计算机中I/O本质总是阻塞的,通过返回fd状态和轮询的方式来使I/O在应用层不阻塞,然后通过多路复用的方式更高效实现这种不阻…