导语
Unity手游运行中的内存占用是手游的一个性能指标。其中资源内存占用是手游内存占用的一个比较重要的部分。
游戏总体内存
PSS 内存
PSS(Proportional Set Size)是一个用于衡量进程内存使用情况的指标,特别是在 Android 和其他基于 Linux 的系统中。它是内存管理中的一个重要概念,尤其在开发和优化应用程序时。
PSS 的定义
PSS 是指一个进程所使用的内存的比例集大小。它考虑了共享内存的情况,并将共享内存的使用量按比例分配给每个使用该内存的进程。具体来说,PSS 计算如下:
- 私有内存:进程独占的内存。
- 共享内存:多个进程共享的内存。PSS 会将共享内存的大小除以使用该内存的进程数量,然后将结果加到每个进程的 PSS 中。
PSS 的计算示例
假设有两个进程 A 和 B,它们共享 100 KB 的内存:
- 进程 A 的私有内存:200 KB
- 进程 B 的私有内存:300 KB
- 共享内存:100 KB
那么它们的 PSS 计算如下:
- 进程 A 的 PSS = 200 KB + (100 KB / 2) = 200 KB + 50 KB = 250 KB
- 进程 B 的 PSS = 300 KB + (100 KB / 2) = 300 KB + 50 KB = 350 KB
PSS 的重要性
-
内存优化:PSS 提供了一个更准确的内存使用情况视图,帮助开发者识别内存使用的热点和潜在的优化点。
-
性能监控:在性能分析和监控中,PSS 是一个重要的指标,可以帮助开发者了解应用程序的内存占用情况,尤其是在资源受限的设备上。
-
避免内存泄漏:通过监控 PSS,开发者可以更容易地发现内存泄漏或不必要的内存使用,从而进行优化。
PSS 与其他内存指标的比较
-
RSS(Resident Set Size):表示进程当前使用的物理内存总量,包括私有和共享内存。与 PSS 不同,RSS 不考虑共享内存的比例分配。
-
VSS(Virtual Set Size):表示进程使用的虚拟内存总量,包括所有分配的内存(无论是否在物理内存中)。VSS 通常比 RSS 和 PSS 大得多,因为它包括了未使用的内存。
总结
PSS 是一个重要的内存使用指标,特别是在 Android 和 Linux 系统中。它通过考虑共享内存的影响,提供了一个更准确的内存使用情况视图,帮助开发者进行内存优化和性能监控。理解 PSS 及其计算方式对于开发高效、低内存占用的应用程序至关重要。
一个unity 游戏的内存由三部分组成:1.资源内存占用;2.引擎模块自身内存占用;3.托管堆内存占用。MONO堆内存属于PSS内存的一部分
资源内存占用
一个unity 游戏的内存由三部分组成:1.资源内存占用;2.引擎模块自身内存占用;3.托管堆内存占用。MONO堆内存属于PSS内存的一部分。
在一个较为复杂的大中型项目中,资源的内存占用往往占据了总体内存的70%以上。因此,资源使用是否恰当决定了项目的内存占用情况。一般来说,一款游戏项目的资源主要可分为如下几种:纹理(Texture)、网格(Mesh)、动画片段(AnimationClip)、音频片段(AudioClip)、材质(Material)、着色器(Shader)、字体资源(Font)以及文本资源(Text Asset)等等。其中,纹理、网格、动画片段和音频片段则是最容易造成较大内存开销的资源。
游戏运行过程中将这些资源控制在这些数字下:
· 纹理资源: 50 MB
· 网格资源: 30 MB
· 动画片段: 25 MB
· 音频片段: 25 MB
· Mono堆内存: 40 MB
托管堆内存占用
对于目前绝大多数基于Unity引擎开发的项目而言,其托管堆内存是由Mono分配和管理的。“托管” 的本意是Mono可以自动地改变堆的大小来适应你所需要的内存,并且适时地调用垃圾回收(Garbage Collection)操作来释放已经不需要的内存,从而降低开发人员在代码内存管理方面的门槛。但是这并不意味着研发团队可以在代码中肆无忌惮地开辟托管堆内存,因为目前Unity所使用的Mono版本存在一个很严重的问题,即:Mono的堆内存一旦分配,就不会返还给系统。这意味着Mono的堆内存是只升不降的。举个例子,项目运行时,在场景A中开辟了80MB的托管堆内存,而到下一场景B时,只需要使用20MB的托管堆内存,那么Mono中将会存在60MB空闲的堆内存,且不会返还给系统
Alpha通道处理
由于ETC1不支持alpha通道,所有在压缩带有alpha通道的纹理的时候,需要额外处理。.将alpha通道剥离出来,也用ETC1压缩
如果再根据图片的时机Alpha情况进行细分,可以有以下细分 :
l 无Alpha:很多背景图片其实是无Alpha的。
l 单一Alpha:不少图片其实要么就是非透明,要么就是全透明不存在半透明的效果。
l 多Alpha值:图片存在多种Alpha值,存在半透明效果。
同时我们根据图片的实际显示效果,对于Alpha像素变化比较小的图片,可以采用一半图片大小,进一步减小Alpha通道图片大小。所以,根据Alpha图片的尺寸,可以进一步细分为:
在处理带有 alpha 通道的纹理时,尤其是在进行纹理压缩时,确实需要特别注意 alpha 通道的处理。以下是一些关于如何处理带有 alpha 通道的纹理的建议和步骤:
1. 理解 Alpha 通道
Alpha 通道用于表示纹理中每个像素的透明度。它的值通常在 0(完全透明)到 255(完全不透明)之间。处理带有 alpha 通道的纹理时,压缩算法需要能够有效地处理这些透明度信息。
2. 压缩格式的选择
不同的纹理压缩格式对 alpha 通道的支持程度不同。以下是一些常见的纹理压缩格式及其对 alpha 通道的处理方式:
- DXT1:不支持 alpha 通道,适用于不需要透明度的纹理。
- DXT5:支持 alpha 通道,适合需要透明度的纹理。它使用 8 位的 alpha 通道,能够提供较好的透明度效果。
- ETC2/EAC:ETC2 支持带有 alpha 通道的纹理,适合在 OpenGL ES 2.0 及以上版本中使用。
- PVRTC:支持 alpha 通道,适合在 iOS 设备上使用。
3. 剥离 Alpha 通道
在某些情况下,可能需要将 alpha 通道剥离出来,以便单独处理或使用不同的压缩格式。以下是一些处理步骤:
-
分离通道:
- 使用图像处理工具(如 Photoshop、GIMP 或图像处理库)将 alpha 通道从 RGB 通道中分离出来。可以将 RGB 通道保存为一个纹理,将 alpha 通道保存为另一个纹理。
-
压缩 RGB 和 Alpha:
- 对 RGB 通道使用适合的压缩格式(如 DXT1 或 DXT5),而对 alpha 通道使用适合的格式(如 DXT5 或其他支持 alpha 的格式)。
-
合并或使用:
- 在渲染时,可以将 RGB 和 alpha 通道的纹理结合使用,或者根据需要在着色器中进行处理。
4. 在 Unity 中的处理
在 Unity 中,处理带有 alpha 通道的纹理时,可以通过以下步骤进行:
-
导入设置:
- 在 Unity 中导入纹理时,确保在纹理的导入设置中选择正确的压缩格式。例如,选择 DXT5 以支持 alpha 通道。
-
Shader 处理:
- 在自定义 Shader 中,确保正确处理 alpha 通道,以实现透明效果。可以使用
alpha值来控制片段的透明度。
- 在自定义 Shader 中,确保正确处理 alpha 通道,以实现透明效果。可以使用
-
使用图集:
- 如果使用图集,确保图集的生成工具支持 alpha 通道,并正确处理透明度。
5. 注意事项
- 性能考虑:在选择压缩格式时,考虑到性能和内存使用。某些格式可能在特定硬件上表现更好。
- 质量损失:压缩纹理时,可能会导致质量损失,尤其是在处理 alpha 通道时。测试不同的压缩设置以找到最佳平衡。
总结
在压缩带有 alpha 通道的纹理时,确实需要额外处理,尤其是在选择合适的压缩格式和可能的通道分离方面。通过合理的处理和选择,可以确保在保持图像质量的同时,优化内存使用和性能。

267

被折叠的 条评论
为什么被折叠?



