Files
metin2-client/docs/XIAOMI8LITE-ADAPTATION-20260930.md
T

5.6 KiB
Raw Blame History

Mi 8 Lite 真机适配(2026-09-30)

已在连接的 Mi 8 Lite 上安装优化版 Android 客户端。相同村庄、24 只测试怪物(总计 28 个 actor)、 60% 场景分辨率、MSAA 1×、30 FPS 上限下,完整场景从约 4.9 FPS 提高到约 30 FPS; 默认 75% 场景分辨率、MSAA 2× 也达到约 30 FPS,UI 保持 2280×1080 屏幕分辨率。

设备与方法

  • Xiaomi Mi 8 Lite(platina),Snapdragon 660 / Adreno 512,4 GB RAM,2280×1080 / 60 Hz。
  • LineageOS 22.2-20260103-UNOFFICIAL-platina,Android 15 / API 35;本轮没有更换系统或 GPU 驱动。
  • APK 内的原生代码以 Release 构建;使用同一份中文资源,版本替换通过 adb install -r 保留资源。
  • 本地测试服 metin2_map_a1,--fake-mobs 24;完整场景包含地形、角色、特效、触控与 UI。
  • 每次排除加载后第一个 2 秒窗口,再取 6 个 2 秒窗口平均;完整场景做重复测试。
  • 手机经 USB 充电,电池温度约 28–32°C;电流/功率读数不可用,本轮不能评价续航或长期热降频。

实现

  1. 每次绘制的固定管线状态由动态 storage buffer 改为 std140 动态 uniform buffer, 使 GPU 使用适合常量广播的访问路径;1264 字节布局保持一致,骨骼调色板仍用 storage buffer。
  2. 片元管线按两个纹理阶段的操作、参数及透明测试开关/函数进行 specialization, 编译时排除不使用的混合与 discard 分支;透明参考值、雾、材质因子仍是动态参数。 管线缓存包含全部 specialization 值,避免不同材质误用同一管线。
  3. Android Adreno 512 在没有保存帧率偏好时默认省电模式(30 FPS);保存设置和显式测试参数优先。 场景分辨率、抗锯齿及其他 GPU 的初始帧率设置保持原有默认值。
  4. 修复 Android 切后台时显示 Surface 丢失导致的退出:获取图像和提交显示均处理 VK_ERROR_SURFACE_LOST_KHR,下一次 SDL 生命周期处理后重建 Surface、交换链与显示信号量。
  5. 性能工具支持选择场景分辨率、MSAA 和帧率上限,并允许新安装设备的性能日志目录为空。

--generic-shaders / MT_GENERIC_SHADERS=1 可关闭片元专用化用于诊断,仍保留 uniform buffer 优化。

测量

构建 / 完整场景 场景比例 / MSAA 平均 FPS GPU ms
优化前 0.60 / 1× 4.88 205.51
优化前重复 0.60 / 1× 4.87 205.54
仅 uniform buffer 0.60 / 1× 11.80 84.91
仅 uniform buffer 重复 0.60 / 1× 11.73 85.16
加片元 specialization 0.60 / 1× 29.97 26.94
加片元 specialization 重复 0.60 / 1× 30.00 26.37
优化后较高画质 0.75 / 2× 30.02 27.33
优化后全分辨率测试 1.00 / 2× 30.03 29.54

仅跳过地形的分段测试:优化前 15.45 FPS / GPU 64.72 ms,uniform buffer 后 29.98 FPS / 26.87 ms, 再专用化后 30.05 FPS / 21.06 ms。正常版本保留地形;分段测试只用于定位开销。

60% 同参数对比约提升 6.1 倍,GPU 时间减少约 87%。FPS 已触及测试上限,不能据此推算 60 FPS 能力。 实时动画导致重复启动时的绘制数略有变化;录制帧的对比另用完全一致的绘制数据。

这些结果说明此前低帧率有很大的客户端渲染优化空间;它们不能单独证明驱动没有其他问题。

画面与功能验证

录制村庄的完整绘制数据,对优化前、uniform buffer 版及专用化版分别回放; 另回放已有的刺客技能和目标透明度混合捕获。屏幕像素比较排除动态 FPS 显示矩形 x=[140,340), y=[0,50) 后,三种场景均为 0 个不同像素;目标透明度捕获连 FPS 区域也完全相同。 这是对选定捕获的回归检查,未覆盖所有地图和技能。

Android Release 和 macOS Release 构建通过;真机默认配置、移动、背包、切前后台与正常登录启动的结果 见下方最终测试结果及截图。测试结束恢复正常服务器选择界面,没有自动登录测试账号。

原始证据

所有文件在 build/qa/xiaomi8lite-adaptation-20260930/(构建产物,不入 Git):

  • baseline/、ubo/、specialized/、quality75/、quality100/:CSV、截图、内存快照、汇总 JSON。
  • default-profile.csv / default-profile.json:最终安装版的默认参数测试。
  • adaptation.mtdr、*-replay.bmp、baseline-assassin-skill.bmp / final-assassin-skill.bmp、 baseline-destalpha.bmp / final-destalpha.bmp、pixel-comparison.json:相同绘制数据回放及像素差异。
  • movement.png、inventory.png、resume.png、normal-login.png:功能截图。
  • final.apk:最终已安装版本;resume-build.log / macos-build.log:最终构建记录。

本轮没有进行真实服务器的账号登录、多人战斗、长时间挂机和副本压力测试;30 FPS 结论适用于上述测试场景。

最终安装版结果

未传分辨率、MSAA、帧率参数时,日志确认 msaa=2 render_scale=0.750000 fps_mode=0 fps_cap=30。 6 个有效窗口平均 29.98 FPS、GPU 27.20 ms,帧时间 p95 平均 33.80 ms,RSS 约 565 MB。 触控移动和背包打开通过截图检查。切后台测试中 Surface 在 present 阶段丢失,恢复前台后重建成功, 进程 PID 10734 保持不变,原游戏场景和背包继续显示;随后在服务器选择界面重复两次切前后台, PID 11014 同样保持不变(resume-cycles.json)。最终恢复服务器选择界面,崩溃缓冲区为空。

最终 APK SHA256:c414589acf29c1fe71dc6efc8ccf6526847a90116bbf4f0b399f4caee4ed15cf。