Files
netease-modsdk-wiki/docs/mcguide/20-玩法开发/18-性能优化/内存优化.md
2025-03-18 14:46:12 +08:00

92 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
front: https://nie.res.netease.com/r/pic/20210727/82dd4b1e-04e1-4a90-a4c5-1a4d5cec462a.png
hard: 进阶
time: 20分钟
---
# 内存优化
## 前言
内存的优化对中低端机型极其敏感与有意义随着MC内容的增长和开发者上架MOD的越来越多。玩家在游戏中可能装载的MOD能体验的内容也越来越多。中低端设备内存的瓶颈变得越来越明显。所以很有必要做内存上面的优化。
## 资源大小优化
### 贴图分辨率
#### 意义
贴图的分辨率控制非常重要。首先会直接决定贴图加载的速度和占用的内存。其次因为内部实现会把方块,物品的多张贴图打成一张图集,单张贴图分辨率大也会造成整体这个图集分辨率太大,在使用图集的时候性能也会有所下降,所以不要觉得我有一个物品,用了非常高清分辨率很高的贴图,但只要我不使用这个物品,对游戏性能就没有影响。
#### 两个原则
1. 贴图清晰的基础上尽量小:
比如500 * 500的贴图如果缩小为100 * 100之后效果相差不大则建议直接缩小到100 * 100
2. 贴图尽量为2次幂尺寸为2次幂的贴图在加载和渲染时比较友好
例如1200 * 1200的贴图建议缩小到1024 * 1024
20 * 20的贴图建议缩小到16 * 16。
#### PNG贴图压缩
使用到PNG贴图的时候可以用pngquant工具先进行压缩接近于无损压缩
### 音频
音效的资源格式尽可能使用ogg格式的文件wav格式文件压缩率较低
### 贴图预加载
贴图资源的加载并不是都在加载存档的时候加载的,很多时候是在需要显示这张贴图的时候才会进行异步加载,而异步加载是需要一定时间的,那就会导致这张图片一段时间内无法显示出来,当执行比较快的图片切换的时候,首次显示图片可能就会出现闪烁问题,比较典型的情况可以参考<a href="../../18-界面与交互/30-UI说明文档.html#SelectionWheel" rel="noopenner"> UI控件SelectionWheel的闪烁问题注2中</a>
因此,我们需要在加载存档的时候一开始就指定加载这些贴图,保证后续使用的时候它们已经加载进内存,不用再进行异步加载。可以通过文件 "your_resourcepack/textures/preload_textures_list.json" 进行指定,文件若不存在可以手动创建,以上面的问题为例子写一个文件,当前需要预先加载的是如下图的这些图片
![闪烁问题素材](./images/textureFlickering.png)
则 preload_textures_list.json 为
```json
[
"textures/ui/SelectionWheel/1/custom_wheel_selection_0",
"textures/ui/SelectionWheel/1/custom_wheel_selection_1",
"textures/ui/SelectionWheel/1/custom_wheel_selection_2",
"textures/ui/SelectionWheel/1/custom_wheel_selection_3",
"textures/ui/SelectionWheel/1/custom_wheel_selection_4",
"textures/ui/SelectionWheel/1/custom_wheel_selection_5",
"textures/ui/SelectionWheel/1/custom_wheel_selection_default"
]
```
## 动态加载
资源如果不是频繁使用的,尽量不要预加载,应该在使用到的时候再进行加载
骨骼模型系统(不常用的骨骼模型应该声明dy_load字段为true)
netease_models.json:
```json
{
"datiangou" : {
"skeleton" : "skeleton/datiangou_skeleton.json",
"mesh" : "mesh/datiangou_mesh.json",
"animation":{
"fengxi":"animation/datiangou_animation_fengxi.json",
"run": "animation/datiangou_animation_run.json"
},
"dy_load": true
}
}
```
音频系统(不常用的音频应该声明在dy_load_list中)
sound_definitions.json:
```json
{
"dy_load_list":[
"sounds/testaudio/test",
"sounds/music/game/test/test1",
]
}
```