Files
netease-modsdk-wiki/docs/mcguide/27-网络游戏/课程4:简易网络服模板知识讲解/第6节:优化与维护.md
2025-03-18 14:46:12 +08:00

119 lines
3.8 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:
hard: 进阶
time: 15分钟
---
# 优化和维护
优化部分介绍如何查找脚本层内存泄漏。维护部分介绍如何追查线上问题。
## 内存检查
下面结合简易网络服模板介绍如何检查内存泄漏。
### 制造内存泄漏问题
lobby玩家退出时不清理内存数据。按照下面方式修改代码
```python
def OnDelServerPlayer(self, args):
'''
清除玩家内存数据。
'''
player_id = args.get('id','-1')
uid = self.mPlayerid2uid.get(player_id, None)
if not uid:
return
del self.mPlayerid2uid[player_id]
# if uid in self.mPlayerMap:
# del self.mPlayerMap[uid]
# if uid in self.mUid2dimension:
# del self.mUid2dimension[uid]
```
### 检查内存泄漏
然后给master发送check-memory-run指令生成一个内存快照结果如下图示
<img src="./images/wps15.jpg" alt="img" style="zoom:150%;" />
查看lobby日志
![img](./images/wps16.jpg)
用MCStudio进入游戏然后退出再给master发送check-memory-run指令再生成一次内存快照结果如下图示
<img src="./images/wps17.jpg" alt="img" style="zoom:150%;" />
再次查看lobby日志
![img](./images/wps18.jpg)
分析:
\[Top 10 differences\]记录占用内存最多的10行代码。简单分析下面日志
<img src="./images/wps19.jpg" alt="img" style="zoom:150%;" />
obj_report.py文件43行占用内存最多占用48k内存实例个数为1两次内存快照间增加了一个实例平均每个实例占用48k。、
\[DIFF_MORE\]记录了内存变化最多的类型。简单分析下面日志:
<img src="./images/wps20.jpg" alt="img" style="zoom:150%;" />
两次内存快照间新增了一个PlayerData类型实例。
接着分析AwesomeGame内存泄漏问题。第一次内存快照时没有玩家登录接着玩家登录再登出然后再生成了一次内存快照。第二次内存快照时没有玩家在游戏中因此服务端内存是不会有玩家数据也即不会有PlayerData类型实例的。但是\[DIFF_MORE\]中显示内存中还是多了一个PlayerData类型实例这说明存在内存泄漏。
### 总结
* check-memory-run指令可以检测两次内存快照间内存变化。
* 内存泄漏检查要点:在游戏平稳时生成内存快照(比如没有玩家登录登出),然后分析内存变化。
## Hunter
开发者先阅读“服务器MOD SDK”中“Hunter调试命令”部分。下面结合“AwesomeGame”网络游戏介绍如何在线调试mod。
### 获取lobby服在线玩家信息
用MCStudio进入游戏然后给master发送/hunter-debug指令
<img src="./images/wps21.jpg" alt="img" style="zoom:150%;" />
实质是在lobby中执行下面代码
```python
import server.extraServerApi as serverApi
#获取AwesomeServer实例
mainSys=serverApi.GetSystem("Minecraft", "AwesomeLobby")
#打印玩家信息
print mainSys.mPlayerid2uid
```
执行结果需要查看lobby日志
<img src="./images/wps22.jpg" alt="img" style="zoom:150%;" />
日志说明lobby服只有一个玩家日志打印了该玩家的player id和uid。
### 清空lobby服玩家信息
然后给master发送/hunter-debug指令
<img src="./images/wps23.jpg" alt="img" style="zoom:150%;" />
实质是在lobby中执行下面代码
```python
import server.extraServerApi as serverApi
#获取AwesomeServer实例
mainSys=serverApi.GetSystem("Minecraft", "AwesomeLobby")
#清除玩家信息
mainSys.mplayerid2uid = {}
mainSys.mPlayerMap = {}
mainSys.mUid2dimension = {}
print clear ok
```
执行结果需要查看lobby日志
<img src="./images/wps24.jpg" alt="img" style="zoom:150%;" />
日志打印”clear ok”说明清除成功。
### 总结
hunter-debug指令支持在线执行一段python脚本使用该指令可以方便查看变量信息修改变量内容。