一款基于 PyQt6 的可视化桌面工具,提供文件夹比较与补丁管理和 UE MemReport 内存分析两大核心功能。
支持中英文双语切换。
- Python 3.11+
- Windows 10/11
pip install -r requirements.txt仅依赖 PyQt6>=6.6,无其他第三方库。
python main.py切换到 「文件夹比较」 标签页。
- 点击左侧 「浏览...」 选择源文件夹
- 点击右侧 「浏览...」 选择目标文件夹
- 点击 「比较」 按钮开始对比
比较完成后,结果以双栏树形表格展示:
| 标记颜色 | 含义 | 说明 |
|---|---|---|
| 白色 | 相同 | 文件内容一致(MD5 匹配) |
| 粉色 | 修改 | 文件存在但内容不同 |
| 蓝色 | 新增 | 仅在目标(右侧)文件夹存在 |
| 紫色 | 删除 | 仅在源(左侧)文件夹存在 |
工具栏功能:
- 过滤按钮:点击「相同」「修改」「仅右侧」「仅左侧」可单独显示/隐藏对应类别
- 交换按钮:快速交换左右文件夹路径
- 全部展开/全部折叠:控制目录树的展开状态
- 底部统计栏实时显示各类文件数量
双击任意一行文件,打开 Diff 查看器:
- 文本文件:左右分栏对比,绿色标记新增行,红色标记删除行,支持同步滚动
- 二进制文件:显示 MD5 校验值、首个差异位置、十六进制对比视图(Offset / Hex / ASCII 三栏),差异字节高亮标记
- 完成文件夹比较后,点击 「生成补丁」
- 选择保存路径,生成
.patch文件
补丁文件本质是 ZIP 压缩包,内部结构:
patch_file.patch (ZIP)
├── manifest.json # 变更清单(新增/修改/删除列表 + 元信息)
└── files/ # 新增和修改后的完整文件
├── path/to/added_file.txt
└── path/to/modified_file.dat
- 点击 「应用补丁」
- 选择
.patch文件 - 选择要应用补丁的目标文件夹
- 确认弹窗中显示的操作明细(新增/修改/删除文件数量),确认后执行
切换到 「MemReport 分析」 标签页。用于解析 Unreal Engine 的 memreport -full 命令导出的内存报告文件。
- 点击 「导入文件」
- 选择一个或多个
.memreport/.txt/.log文件 - 导入时自动在原文件旁生成同名
.json中间数据文件
多文件导入后可通过顶部下拉框切换查看。
界面左侧为 分区导航树,点击任意分区在右侧查看详情:
- 总览:展示文件路径、分区列表摘要(类型、行数/条目数)
- 表格类型(如 Obj List、RenderTargets、ListTextures):
- 支持 点击表头排序(升序/降序)
- 支持 关键字搜索过滤(输入框位于表格上方)
- 数值列自动右对齐,千分位格式化
- 列宽自适应内容,可手动拖拽调整
- 键值类型(如 Header、Mem FromReport):双列表格展示,键名加粗
- 原始文本类型:等宽字体显示原文
导入 .memreport 时自动生成 .json 文件,也可以点击 「导出 JSON」 手动导出到指定路径。
JSON 结构示例:
{
"filepath": "S:/data/report.memreport",
"filename": "report.memreport",
"sections": [
{
"name": "Header",
"type": "kv",
"data": {
"Platform Memory Stats for Windows": "",
"Process Physical Memory": "2134.45 MB used, 2256.78 MB peak"
}
},
{
"name": "obj list -countsort",
"type": "table",
"headers": ["Class", "Count", "NumKB", "MaxKB", "ResExcKB", "ResExcDedSysKB", "ResExcDedVidKB", "ResExcUnkKB"],
"rows": [
["Texture2D", "1736", "2479.24", "2560.12", "451324.00", "0.00", "451324.00", "0.00"]
]
},
{
"name": "RenderTargets",
"type": "table",
"headers": ["SizeMB", "Dimensions", "ArrayCount", "Mips", "Name", "Format", "UnusedFrames"],
"rows": [
["256.000", "16384x2048", "2", "1", "Shadow.Virtual.PhysicalPagePool", "R32_UINT", "0"]
]
}
]
}三种分区类型:
| type | 说明 | 字段 |
|---|---|---|
table |
表格数据 | headers (列名数组) + rows (二维数组) |
kv |
键值对 | data (对象) |
raw |
原始文本 | lines (字符串数组) |
解析器自动识别以下 UE MemReport 命令/区块:
| 分区 | 解析类型 | 说明 |
|---|---|---|
| Header | 键值 | 平台内存统计、进程物理/虚拟内存 |
| DumpParticleMem | 表格 | 粒子系统内存明细 |
| ConfigMem | 表格 | 配置文件缓存大小 |
| RenderTargets | 表格 | 渲染目标池内存(尺寸、格式、Mip 数) |
| RenderTargets Summary | 键值 | 渲染目标池汇总(总量/已用/未用) |
| ListTextures | 表格 | 全部纹理列表(尺寸、格式、LOD 组、流送状态) |
| ListParticleSystems | 表格 | 粒子系统资源占用 |
| obj list class=XXX | 表格 | 指定类型对象列表(SoundWave / SkeletalMesh / StaticMesh 等) |
| ListAnims | 表格 | 动画序列列表 |
| Mem FromReport | 键值 | STAT 格式内存汇总(544+ 条目) |
| rhi.DumpMemory | 键值 | RHI 显存分配明细 |
| obj list -countsort | 表格 | 全类型对象计数排序(Class / Count / NumKB / ResExcKB 等) |
同时兼容简单格式的 memreport 文件(无 MemReport: Begin/End command 包裹,靠区块标题自动识别)。
python build.py自动安装 PyInstaller(如未安装)并打包为单文件可执行程序,输出到 dist/PatchTool.exe。打包配置在 build.spec 中,默认无控制台窗口。
PatchTool/
├── main.py # 入口
├── requirements.txt # 依赖 (PyQt6)
├── build.py # 打包脚本
├── build.spec # PyInstaller 配置
├── app/
│ ├── main_window.py # 主窗口(菜单栏、标签页、状态栏)
│ ├── i18n.py # 中英文翻译字典
│ ├── styles.py # QSS 样式表
│ ├── compare/
│ │ ├── compare_engine.py # 文件夹比较引擎(递归遍历 + MD5 哈希)
│ │ ├── compare_widget.py # 比较界面(双栏树形视图 + 过滤 + 统计)
│ │ ├── diff_viewer.py # Diff 查看器(文本对比 + Hex 对比)
│ │ └── patch_engine.py # 补丁生成与应用(ZIP 格式 + manifest)
│ ├── memreport/
│ │ ├── memreport_parser.py # MemReport 解析器(CSV / 表格 / KV / STAT 自动识别)
│ │ └── memreport_widget.py # MemReport 查看界面(搜索 / 排序 / JSON 导出)
│ └── widgets/
│ └── folder_selector.py # 文件夹选择器组件
└── test_data/ # 测试数据