常州建设企业网站,企业网站的建设与应用开题报告,wp怎样做可以下载的网站,答建设网站目录
策略导致的内存问题
GFX内存
纹理资源
压缩格式
Mipmap
网格资源
Read/Write
顶点数据
骨骼
静态合批
Shader资源
Reserved Memory
RenderTexture
动画资源
音频资源
字体资源
粒子系统资源
Mono堆内存 策略导致的内存问题
1. Assetbundle 打包的时候…目录
策略导致的内存问题
GFX内存
纹理资源
压缩格式
Mipmap
网格资源
Read/Write
顶点数据
骨骼
静态合批
Shader资源
Reserved Memory
RenderTexture
动画资源
音频资源
字体资源
粒子系统资源
Mono堆内存 策略导致的内存问题
1. Assetbundle 打包的时候单个资源被重复打包可以把依赖的资源单个打包通过AssetBundleBrowser 可以查看Assetbundle里面的资源情况地址Unity Technologies · GitHub 2. 代码使用不当资源加载后没有及时销毁比如 var gos Resources.LoadGameObject(Sphere);GameObject go Instantiate(gos);Material ma go.GetComponentRenderer().material;ma.color new Color(1, 0.5f, 0.5f);//Destroy(ma);Destroy(go); 在内存里面还是会存在一份material因为每次设置color的时候都是创建了一个新的material 3. Assetbundle 的卸载不当导致资源冗余Unload(false)会把加载的assetbundle 卸载但从里面加载的资源还在Unload(true)都会卸载 GFX内存
GFX内存(Graphics)是指图形处理器GPU的专用内存用于存储图形数据和计算所需的临时数据。
纹理资源
压缩格式
1. 图片在导入unity的时候会转换成unity识别的的格式比如jpgpng这些是在硬盘上存储的格式但不能不GPU直接读取所以导入的时候会转换成ETC、ASTC 格式
2. 图片压缩的好处
减少占用内存、减少带宽、减少加载时间
3. 如果图片的压缩格式在该平台上不支持会转换成RGBA格式即不压缩
4. Android支持ETC/ASTC; IOS 支持 ASTC/PVRTC; PC 支持DTX
5. ASTC 可以调节压缩块的大小来调节压缩比例因为ASTC 是以固定128bit 来存储一个块的块里面的像素越多压缩比例就越大因为平摊到每个像素的存储空间越少比如4x4,6x6,8x8
Mipmap
1. mipmap 的好处及坏处
好处减少带宽 坏处增加内存
2. 原理
存储的图片内存是等比数列1、1/4、1/16......内存和是原来的4/3倍也就是内存增加了1/3
3. 对于2D 界面因为摄像机距离不会发生变化所以要关闭mipmap3D 物体或UI可以根据情况开启Mipmap
4. 通过Texture Quality 改变加到到内存的Mipmap的数量从而实现不同性能的机器配置不一样
通过Edit-Project Settings-Quality--Textures修改只对开启了Mipmap的纹理生效里面的FullRes、HalfRes 等内存依次降低为原来的1/4
5. Texture Streamming 动态改变加载到内存的Mipmap的数量
只对动态加载的Mipmap纹理有效比如assetbundle加载如果场景已经存在该纹理且通过加载场景的方式加载Texture Streamming则不会生效因为纹理已经存在了无法动态改变
纹理加载会根据物体和摄像机的位置动态实时的去ab包内加载Mipmap
生效条件纹理开启texture streaming 和 generate Mipmap MaxLevelReduction(最多裁剪的层级) 的优先级Memroy Budget (mipmap 占用的最大内存)
网格资源
Read/Write
CPU和CPU会各占一份内存如果不需要在代码中修改mesh就不要开启该选项
顶点数据
一份网格的顶点数据有很多比如position、color、tangent等但是切线一般是在计算光照的时候才用可以在导入模型的时候model 栏下设置tangent为none也可以通过projectsetting里面开启optimize mesh data它会裁剪没有用到的顶点属性需要测试
骨骼
如果模型不需要骨骼数据则在模型导入的RIG栏设置animation type为none
静态合批
会增加内存空间换时间
Shader资源
1. shader占用的内存只要是shader变体每一个变体都会产生一个shader加载到内存里面
2. 游戏初始化的时候一般需要提前把渲染要使用的Shader全部都加载进来以降低游戏运行时及时加载和编译带来的卡顿这时候我们可以调用Shader.WarmupAllShaders来把当前已经加载到内存的Shader全部编译一次包含所有的变体。
3. 随着项目渲染效果的丰富Shader变体变得越来越多粗暴的调用全加载接口会导致游戏的启动时间变得更长影响游戏体验。
4. 后来Unity加入了变体集合ShaderVariantCollection来取代上面的粗暴全加载接口达到按需加载提高加载速度
5. 优化方向裁剪shader变体
地址https://answer.uwa4d.com/question/5da86670e84db43d6efbda72
Reserved Memory
RenderTexture
适当关闭抗锯齿或者降低抗锯齿的质量、减少阴影贴图的质量即分辨率、降低RT的存储位数(代码生成的时候设置)HDR如果不使用alpha通道的情况可以修改格式为R11G11B10,即32为存储格式
动画资源
1. 勾选Resample Code在模型导入的animation栏中默认开启它会减少关键帧的数量
2. 压缩animation
3. 骨骼动画不用scale剔除不用的scale曲线通过编辑器代码AnimationUtility
4. 降低动画存储的float精度从而使其存储方式为constant减少内存
5. 选中animation可以在属性面板看到其详细信息
音频资源
1. ForceToMono:把双声道音频合并成单声道
2. LoadType:
Decompress On Load:加载后解压缩以未压缩的方式存储在内存上
Compress in memory以压缩方式存储在内存上播放时解压缩
Stream边解压缩边播放但是每播放一次都会增加一份缓存
对于不经常播放的长而大的背景音乐用stream对于短且频繁用第一种(抢声)、其它中等音乐用第二种
3.压缩格式
压缩率越小压缩后占用的文件内存越小ADPCM压缩格式占用内存最小配合Compress in memory使用PCM不压缩、Mp3次之、Vorbis更次之、ADPCM最小
字体资源
1. 字体瘦身有些字体不使用可以裁剪掉工具推荐FontSubsetGUI、FontPruner
2. 字体压缩TMP 生成的字体问题太大不能改变通过提取其纹理然后压缩再赋值的方式压缩纹理
粒子系统资源
1. 粒子占用的内存和实际播放的粒子数有关和最大粒子数无关
2. 如果粒子没播放也会占用一部分内存比如粒子系统只是被关闭了没删除
Mono堆内存
1. 常驻内存过高比如list、dictionary、数组初始化时的内存不要过高
2. 持续分配内存每一万帧分配不超过50M通过在初始化时缓存变量