工程(ci远端化·阶段三): golden基线按平台各存——四张现行基线(棋盘三图+menu_boot)迁入windows/子目录, mac/待Mac端重制后入库; golden_compare.py按sys.platform自动拼平台子目录(缺本平台基线=fail-closed显式红并给重制指引, 禁静默绿); render_gate基线断言路径与golden_baseline_refresh写入落点全改平台子目录; gate_platform.sh新增gate_platform_id; 依据=用户裁跨平台逐像素必失配(字形/抗锯齿机制差异), 平台内部严格度不降
This commit is contained in:
1 parent
b3928f8167
commit
c28d01ccb0
9 files changed
+42
-12
No files matched your search
@@ -1,7 +1,12 @@
|
||||
# 视觉 golden 基线(渲染闸的比对基准)
|
||||
|
||||
五张基线:棋盘三图(`board_L1_dungeon` / `board_L2_underdark` / `board_L3_deep_underdark`,
|
||||
裁剪区 900×760)+ 启动态菜单(`menu_boot`,全屏)+ 关卡画面(`level_map`,全屏)。
|
||||
基线**按平台各存**(2026-11-03 用户裁:跨显卡/字形渲染机制差异使跨平台逐像素必失配——
|
||||
`windows/` 与 `mac/` 子目录各持一套,平台内部照常严格比对,跨平台不互比;
|
||||
平台选择实现单点 = `tools/gate_platform.sh` 的 `gate_platform_id`,比较器 `tools/golden_compare.py`
|
||||
自动拼平台子目录)。本目录现持:`windows/`(棋盘三图 `board_L1_dungeon` / `board_L2_underdark` /
|
||||
`board_L3_deep_underdark`,裁剪区 900×760 + 启动态菜单 `menu_boot`,全屏)、
|
||||
`level_map`(关卡画面全屏,历史基线留根——现行闸件未对拍它)、
|
||||
`palette_baseline/`(色板基线,纯文件内容比对与平台无关)。
|
||||
比对判据与工具见 `tools/golden_compare.py`
|
||||
(逐像素灰度差 >16 的像素占比 ≤2%)。
|
||||
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -84,3 +84,13 @@ gate_godot_count_all() {
|
||||
else ps -axo comm= 2>/dev/null | grep -ci 'godot' || true
|
||||
fi
|
||||
}
|
||||
|
||||
# golden 基线平台子目录名——渲染基线按平台各存一份(Windows 显卡字形/抗锯齿与 macOS CoreText
|
||||
# 差异使跨平台逐像素比对必失配,2026-11-03 用户裁:按平台各存基线,平台内部照常严格比对)。
|
||||
gate_platform_id() {
|
||||
case "$(uname -s 2>/dev/null)" in
|
||||
MINGW*|MSYS*|CYGWIN*|Windows_NT) echo "windows" ;;
|
||||
Darwin) echo "mac" ;;
|
||||
*) echo "linux" ;;
|
||||
esac
|
||||
}
|
||||
@@ -26,6 +26,7 @@ for a in "$@"; do
|
||||
done
|
||||
GAME="${GAME:-$REPO/game}"
|
||||
GAME_WIN="$(gate_game_path "$GAME")" # Godot --path 接受形式(Windows 混合斜杠,其他平台原样)
|
||||
PLAT="$(gate_platform_id)" # 基线落点=本平台子目录(game/tests/golden/<windows|mac|linux>/)
|
||||
TMP="$(mktemp -d /tmp/goldenrefresh_XXXXXX)"
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
|
||||
@@ -44,9 +45,9 @@ if [ "$MODE" = "menu" ]; then
|
||||
echo "[golden_refresh] FAIL — shot_probe 退出码=$st(菜单截图缺失/探针自检红,见上)"
|
||||
exit 1
|
||||
fi
|
||||
mkdir -p "$REPO/game/tests/golden"
|
||||
cp "$TMP/shots/shot_menu.png" "$REPO/game/tests/golden/menu_boot.png" || exit 1
|
||||
echo "[golden_refresh] 完成 — 菜单全屏基线已代入 game/tests/golden/menu_boot.png(提交说明须写明触发原因)"
|
||||
mkdir -p "$REPO/game/tests/golden/$PLAT"
|
||||
cp "$TMP/shots/shot_menu.png" "$REPO/game/tests/golden/$PLAT/menu_boot.png" || exit 1
|
||||
echo "[golden_refresh] 完成 — 菜单全屏基线已代入 game/tests/golden/$PLAT/menu_boot.png(提交说明须写明触发原因)"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -70,8 +71,8 @@ if [ "$st" -ne 0 ] || [ ! -s "$TMP/shots/board_meta.json" ]; then
|
||||
exit 1
|
||||
fi
|
||||
python tools/golden_board_crop.py "$TMP/shots/board_meta.json" "$TMP/shots" "$TMP/crop" || exit 1
|
||||
mkdir -p "$REPO/game/tests/golden"
|
||||
mkdir -p "$REPO/game/tests/golden/$PLAT"
|
||||
for b in board_L1_dungeon.png board_L2_underdark.png board_L3_deep_underdark.png; do
|
||||
cp "$TMP/crop/$b" "$REPO/game/tests/golden/$b" || exit 1
|
||||
cp "$TMP/crop/$b" "$REPO/game/tests/golden/$PLAT/$b" || exit 1
|
||||
done
|
||||
echo "[golden_refresh] 完成 — 三张基线已换代入 game/tests/golden/(提交说明须写明触发原因)"
|
||||
echo "[golden_refresh] 完成 — 三张基线已换代入 game/tests/golden/$PLAT/(提交说明须写明触发原因)"
|
||||
@@ -19,6 +19,14 @@ from PIL import Image, ImageChops
|
||||
TOLERANCE = 16 # 灰度差容差(单通道)
|
||||
FAIL_RATIO = 0.02 # changed 占比失败线
|
||||
|
||||
# 基线平台子目录:<黄金图根目录>/<windows|mac|linux>——渲染基线按平台各存(gate_platform_id 同口径),
|
||||
# 平台内部照常逐像素严格比对;跨平台不互比(字形/抗锯齿机制差异,2026-11-03 用户裁)。
|
||||
_PLAT = {"win32": "windows", "darwin": "mac"}.get(sys.platform, "linux")
|
||||
|
||||
|
||||
def plat_missing(base: Path) -> bool:
|
||||
return not (base / _PLAT).is_dir()
|
||||
|
||||
|
||||
def compare(base: Path, curr: Path, name: str, failures: list) -> None:
|
||||
pb, pc = base / name, curr / name
|
||||
@@ -48,6 +56,11 @@ def main() -> int:
|
||||
print("用法: python tools/golden_compare.py <黄金图目录> <新截图目录> [屏清单...]")
|
||||
return 1
|
||||
base, curr = Path(sys.argv[1]), Path(sys.argv[2])
|
||||
base = base / _PLAT
|
||||
if not base.is_dir():
|
||||
print("[golden] FAIL — 本平台(%s)基线目录未建:%s" % (_PLAT, base))
|
||||
print(" 处置:在该平台跑 tools/golden_baseline_refresh.sh 重制基线并提交(基线换代权限 Q6)")
|
||||
return 1
|
||||
shots = sys.argv[3:] or ["shot_menu.png", "shot_camp.png", "shot_level.png", "shot_battle.png"]
|
||||
failures = []
|
||||
for name in shots:
|
||||
|
||||
@@ -34,6 +34,7 @@ REPO="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
. "$REPO/tools/gate_platform.sh" # 跨平台件(平台探测/路径形式/带超时执行/孤儿清杀)
|
||||
GAME="${1:-$REPO/game}"
|
||||
GAME_WIN="$(gate_game_path "$GAME")" # Godot --path 接受形式(Windows 混合斜杠,其他平台原样)
|
||||
GOLDEN="$REPO/game/tests/golden/$(gate_platform_id)" # 本平台基线目录(按平台各存,比较器同口径)
|
||||
TMP="$(mktemp -d /tmp/rendergate_XXXXXX)"
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
_rc=0
|
||||
@@ -122,8 +123,8 @@ for b in board_L1_dungeon.png board_L2_underdark.png board_L3_deep_underdark.png
|
||||
done
|
||||
|
||||
echo "======== 棋盘 golden 逐像素(T2——裁剪→对比,容差 provisional) ========"
|
||||
if [ ! -d "$REPO/game/tests/golden" ]; then
|
||||
echo "[render_gate] FAIL — game/tests/golden/ 基线目录缺失(基线在库=验收断言②)"; _rc=1
|
||||
if [ ! -d "$GOLDEN" ]; then
|
||||
echo "[render_gate] FAIL — 本平台($(gate_platform_id))基线目录缺失:$GOLDEN(基线按平台各存、在库=验收断言②)"; _rc=1
|
||||
elif [ ! -s "$BD/board_meta.json" ]; then
|
||||
echo "[render_gate] SKIP — board_meta.json 缺失(取证段已红),golden 对比不判"
|
||||
else
|
||||
@@ -154,8 +155,8 @@ else
|
||||
fi
|
||||
|
||||
echo "======== 菜单 golden 逐像素(迭代 28 T4——启动态全屏基线)========"
|
||||
if [ ! -s "$REPO/game/tests/golden/menu_boot.png" ]; then
|
||||
echo "[render_gate] FAIL — game/tests/golden/menu_boot.png 基线缺失(菜单 golden 未建——tools/golden_baseline_refresh.sh --menu)"; _rc=1
|
||||
if [ ! -s "$GOLDEN/menu_boot.png" ]; then
|
||||
echo "[render_gate] FAIL — $GOLDEN/menu_boot.png 基线缺失(菜单 golden 未建——本平台跑 tools/golden_baseline_refresh.sh --menu)"; _rc=1
|
||||
elif [ ! -s "$SHOT/shot_menu.png" ]; then
|
||||
echo "[render_gate] SKIP — shot_menu.png 缺失(shot_probe 段已红),菜单 golden 不判"
|
||||
elif [ ! -f "$GAME/assets/fonts/ui_font_fusion_pixel_zh_hans.ttf" ] || [ ! -f "$GAME/assets/art/ui/button_stone.png" ]; then
|
||||
|
||||
Reference in new issue
Block a user