跳到主要內容

【2026 最新】Claude 遊戲視覺回歸怎麼做?固定鏡頭+Golden Scene+盲評 7 步實戰

最後更新: ·
Claude 遊戲視覺回歸教學:固定鏡頭、Golden Scene、Diff 與人類否決權

你叫 Claude 把港口場景「改得更有電影感」,幾分鐘後燈光、材質與建築都換好了。可是第二次打開遊戲,你真正要回答的不是「它有沒有改」,而是:畫面變好、變壞,還是攝影機剛好偏了一點?這正是 Claude 遊戲視覺回歸要解的問題。

近期兩位開發者分別在 Unity 遊戲開發分享AI 釣魚遊戲工作流裡談到同一個痛點:改程式很快,視覺驗收仍反覆而且高度仰賴人。這些是作者自述,不是獨立稽核結果;但它們把問題問得很準。

這篇專為第一次做遊戲測試的人寫。我們會從零建立一條 Unity 或 Godot 都能套用的流程:固定輸入與鏡頭、保存 Golden Scene、用 diff 分流,再讓 Claude 做去識別的 A/B 第二意見。你不需要先懂測試框架;先讓一個場景能重跑,就已經跨過最重要的一步。

先說結論:AI 改畫面,人類定標準

一套可靠的遊戲視覺驗收,不是叫 Claude 對截圖打分數,而是先把問題拆開:

可驗收遊戲畫面 = 固定輸入 + 固定鏡頭 + 分層 Diff + 盲評 + 人類否決權

  • 機械 diff:回答「哪裡變了」。
  • 感知指標:回答「這個變化是否超過場景平常的渲染噪音」。
  • 盲式 A/B:回答「依預先寫好的 rubric,哪一版更符合目標,理由是什麼」。
  • 人類 reviewer:決定要不要接受新基準,並保留 art-direction veto(美術方向否決權)。
Claude 遊戲視覺回歸的五道關卡:鎖定輸入、固定取景、截圖留證、分層 Diff、盲評與人類否決
把驗收拆成五道關卡,失敗時才知道該回頭修場景、渲染、閾值還是 art direction。

Claude 遊戲視覺回歸的 5 個關鍵詞

視覺回歸測試是把目前畫面與一張已批准的參考畫面比較,找出非預期變化。它像替場景拍證件照:拍攝條件要固定,兩次照片才有比較意義。

  • Golden Scene:本文用來稱呼「團隊自己定義、可重跑的測試場景」。它把場景檔、種子、鏡頭、解析度、品質設定與截圖時機綁成一份測試 fixture。
  • Golden image:由人類批准、與 Golden Scene 綁定的參考 PNG。
  • Perceptual diff:不只逐像素數差異,也用結構或感知指標協助分辨「畫面真的變了」與「邊緣或光照有微小波動」。
  • Rubric:評分前先寫好的驗收準則,例如主角可讀性、視線焦點、空間層次與風格一致。
  • 盲式 A/B:把兩張圖標成 A、B,隱藏新舊、作者與投入成本,避免「新的一定比較好」先污染判斷。

如果你已經做過 Godot Sprite Atlas 與動畫循環,可以把 Golden Scene 想成更外層的驗收殼:Sprite 測單一資產,Golden Scene 測資產放進真實鏡頭後的整體結果。

固定鏡頭為什麼還不夠?你其實要固定一份「拍攝合約」

攝影機只是一個變因。只鎖 Camera,卻讓粒子、日夜時間、動畫幀或品質設定漂動,diff 仍會每天報警。成熟的 Golden Scene 應把以下資訊一併保存:

  • 場景與角色初始狀態,以及所有會影響畫面的 RNG seed。
  • Camera 的位置、旋轉、FOV/投影模式與後製設定。
  • 輸出解析度、長寬比、色彩空間與品質等級。
  • 動畫幀、物理 tick、截圖前要等待的 frame 數。
  • 引擎版本、作業系統、渲染後端、GPU/驅動與 commit SHA。

這些 metadata 不是裝飾。即使網頁測試領域的官方工具也提醒,截圖會受作業系統、版本、硬體與設定影響;遊戲渲染更應把執行環境視為測試輸入。可參考 Playwright 的視覺比較文件所列的環境差異原則。

Claude 遊戲視覺回歸:7 步建立第一條可重跑流程

第 1 步:先寫 rubric,再讓 AI 改圖

痛點:如果「更好看」是唯一標準,任何結果都能事後合理化。解法:先替每個 Golden Scene 寫 4~6 個可觀察準則,每項都要求 reviewer 指出畫面證據,不先要求一個總分。

scene: harbor_day
goal: 玩家進場後 2 秒內看見主角與可互動碼頭
rubric:
  - 主角輪廓能否從背景分離
  - 視線是否先落在主角,再移到碼頭
  - 前景、中景、遠景是否有清楚層次
  - 建築、材質與光色是否一致
hard_fail:
  - 主角、出口或互動物件缺失
  - 解析度、長寬比或 Camera 不符

分數可以留到最後做排序,但不要把「8 分就能 ship」當成普遍真理。它若沒有用你自己的場景與人類判斷校準,就只是一個看起來精確的偏好值。

第 2 步:鎖定 seed、鏡頭、解析度與時間

版本先釘死:本文研究截止日為 2026 年 8 月 21 日,Godot 官方 archive 列出的穩定版是 4.7.2-stable;Unity 範例則對照 Unity 6.5 與當時仍標成預發布的 Graphics Test Framework 9.0.0-pre.25。你的專案應記錄完整 Editor/引擎與套件版本,不要只寫「Unity 6」或「Godot 4」。

Godot:建立一個包含固定 SubViewportGoldenCamera 的測試場景,所有隨機內容都從同一個 RandomNumberGenerator 取得。Godot 官方文件說明,相同 seed 會產生可重現的偽隨機序列;但底層演算法屬實作細節,因此升級引擎後仍要重新驗證基準。

extends Node

const SIZE := Vector2i(1280, 720)
const WARMUP_FRAMES := 8  # 專案固定值,不是失敗後重試
var rng := RandomNumberGenerator.new()

@onready var viewport: SubViewport = $GoldenViewport
@onready var camera: Camera3D = $GoldenViewport/GoldenCamera

func _ready() -> void:
    rng.seed = 20260821
    # 場景內所有隨機生成都要改用這個 rng
    viewport.size = SIZE
    viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS
    camera.make_current()

    for _frame in range(WARMUP_FRAMES):
        await RenderingServer.frame_post_draw

    var image := viewport.get_texture().get_image()
    var err := image.save_png("user://harbor_day.png")
    assert(err == OK)
    get_tree().quit()

執行時再固定解析度與時間步進:

godot --path . --scene res://tests/visual/harbor_day.tscn --windowed --resolution 1280x720 --fixed-fps 60

上面的 API 與參數可對照 Godot 4.7 的 RandomNumberGeneratorSubViewport命令列文件--fixed-fps固定時間步進,但不會自動消除所有 GPU、shader 或粒子差異。截圖階段也不要加 --headless:Godot 的 DisplayServer 文件明確說明 headless 模式會停用渲染與視窗管理功能。

Unity:Unity 的官方 Graphics Test Framework 已經提供 scene test、reference image 與 ImageAssert。不過截至研究日,現行 9.0.0-pre.25 文件仍屬預發布;請把版本寫進 Packages/manifest.json與 lock file,並先在你釘定的 Unity Editor runner 驗證。

using System.Collections;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.TestTools;
using UnityEngine.TestTools.Graphics;

public sealed class GoldenVisualTests
{
    [UnityTest, Category("GoldenVisual"),
     SceneGraphicsTest("Assets/Tests/GoldenScenes")]
    public IEnumerator Golden(SceneGraphicsTestCase testCase)
    {
        Random.InitState(20260821);
        SceneManager.LoadScene(testCase.ScenePath, LoadSceneMode.Single);

        for (var frame = 0; frame < 8; frame++)
            yield return null;

        var cameraObject = GameObject.Find("GoldenCamera");
        Assert.That(cameraObject, Is.Not.Null);

        var settings = new ImageComparisonSettings {
            TargetWidth = 1280,
            TargetHeight = 720,
            TargetMSAASamples = 1,
            UseHDR = false,
            UseBackBuffer = false
        };

        ImageAssert.AreEqual(
            testCase.ReferenceImage.Image,
            cameraObject.GetComponent<Camera>(),
            settings);
    }
}

第一次執行時,reviewer 可依官方的 Accept Result 流程把 actual 複製成 reference;本文把這個動作保留給人工確認,不讓 CI 自動接受 candidate。解析度、MSAA、HDR 與 back buffer 設定則來自 ImageComparisonSettings。若場景含隨機生成,Random.InitState負責 Unity RNG;shader 時間、VFX、其他 PRNG 與 GPU 歷史要在各自的設定與 capture manifest 另外控制。

第 3 步:建立 Golden Scene,而不是一張來路不明的截圖

一個最小資料夾可以長這樣:

tests/visual/
├── scenes/harbor_day
├── golden/harbor_day.png
├── current/
├── diff/
├── rubrics/harbor_day.yml
├── impact-map.yml
└── decisions/

第一次建立 golden 時,請由人類確認場景狀態、鏡頭與 rubric 都正確,再把 PNG 和設定檔一起 commit。Golden 不是「永遠正確」,而是「目前已批准的比較基準」。

第 4 步:先做 exact diff,再做 perceptual diff

先用逐像素差異抓尺寸不符、缺件、透明度與大範圍位移,再用結構型指標協助分流微小渲染差異。ImageMagick 的 compare 官方文件提供 AE、SSIM 等 metric 與 diff 輸出:

# 完全對齊後,先計算不同像素與差異圖
magick compare -metric AE +  golden/harbor_day.png current/harbor_day.png diff/harbor-ae.png

# 再看結構型差異;同一專案要固定 ImageMagick 版本與參數
magick compare -metric SSIM +  golden/harbor_day.png current/harbor_day.png diff/harbor-ssim.png

SSIM 原始論文評估的是對齊影像的亮度、對比與結構資訊;其驗證範圍並非遊戲 art direction 或場景邏輯。本文只把它用來分流變化,不把輸出解讀成「美感分數」。

遊戲視覺差異分成硬錯誤、渲染噪音、構圖與風格變動三類
同一個 diff 數字不能回答所有問題;先分辨硬錯誤、渲染噪音與 art direction。

第 5 步:為每個場景校準閾值,不要找一個全站神奇數字

在沒有任何程式或資產變更時,讓同一個 Golden Scene 重跑多次,記錄 AE、SSIM 輸出與熱圖位置。第一輪可以先收集 10 次,目的是看見自己的噪音帶,不是宣稱 10 次就有統計保證。

  • PASS:差異落在這個場景已知的噪音帶,而且沒有 hard-fail 規則命中。
  • REVIEW:超出噪音帶,或差異集中在主角、UI、出口等高風險區域。
  • FAIL:解析度/鏡頭合約不符,或必要物件缺失;不要靠放寬 fuzz 把它洗掉。

粒子特效很多的戰鬥場景,和靜態角色選單不應共用閾值。若某個區域本來就有時間噪音,優先固定動畫幀、關閉非必要粒子或建立 mask;最後才考慮提高容許值。

第 6 步:用 rubric 做盲式 A/B critic

Anthropic 的 影像輸入文件說明 Claude 可在同一個請求中接收多張圖片,因此可以把 baseline 與 candidate 交給它比較。但請先把檔名、commit、作者與「哪張較新」拿掉,再使用固定 prompt:

你會收到兩張同一鏡頭的遊戲截圖,標記為 A 與 B。
不要猜哪張較新,也不要因畫面更亮或細節更多就偏好它。

依序檢查:
1. 主角可讀性
2. 視線焦點
3. 空間層次
4. 風格一致

每項輸出:winner = A / B / tie、觀察到的具體區域、信心 low / medium / high。
最後只能給 recommendation = A / B / inconclusive。
不要替人類批准 Golden。

接著把順序交換成 B/A 再跑一次。若結論跟著位置翻轉,就標記 inconclusive,不要平均成一個看似穩定的分數。LLM-as-a-judge 研究已觀察到位置偏誤等問題;多模態 judge 研究也記錄了不一致、幻覺等挑戰,所以盲評只能整理第二意見。

盲式 A/B 視覺評測流程:去識別、先寫 rubric、交換順序、人類保留否決權
盲評降低新舊與作者資訊造成的偏見,但不會消除模型本身的審美偏誤。

如果你想把這一步做成可維護的評測系統,可以接著讀 AI Evals 新手指南AI Agent Harness 實作;差別只在這次的輸入是遊戲截圖,最終批准權仍在 reviewer。

第 7 步:把 USER/AI 決策、來源檔與 git diff 綁在一起

每次驗收都保存一張 decision receipt(決策收據),避免三週後只剩一句「Claude 說新版比較好」:

{
  "scene": "harbor_day",
  "base_commit": "<golden-sha>",
  "candidate_commit": "<head-sha>",
  "changed_sources": ["Assets/Harbor/roof.png"],
  "metrics": {"ae": "<ci-output>", "ssim": "<ci-output>"},
  "critic_orders": ["A/B", "B/A"],
  "ai_recommendation": "inconclusive",
  "human_decision": "accept",
  "owner": "USER",
  "reason": "保留夕陽色,但退回會遮住主角的前景霧"
}

CI 先用 git diff --name-only列出變動檔,再查 impact-map.yml決定重跑哪些 Golden Scene。例如角色材質只跑近景與港口;共用 shader、render pipeline 或無法解析的變更則回退成全跑。增量測試的原則不是「永遠少跑」,而是只有依賴關係明確時才少跑

一個失敗案例:畫面變亮,不代表驗收進步

想像 harbor_day 的 candidate 把夕陽加強,第一眼確實更漂亮。這時三層檢查可能得到完全不同的訊號:

  1. Exact diff 顯示全畫面大範圍變動;熱圖同時發現 Camera 向右偏移。先修拍攝合約,不進入審美評分。
  2. 修正 Camera 後,剩餘差異主要在天空與水面。它超過該場景的噪音帶,因此進入 review。
  3. 盲式 A/B 認為新版色彩更一致,但指出主角輪廓與碼頭互動點變得不清楚。人類保留夕陽色,退回遮住前景的霧,再產生下一個 candidate。

這個例子中的數字與場景都是示意;重點是不要讓單一 metric 或單次 AI 偏好跨過所有關卡。視覺一致也不等於遊戲可玩:路徑是否走得通、碰撞是否正確、效能是否穩定,仍要用狀態斷言、效能資料與玩家測試另外驗收。

最常踩的 6 個坑

  1. 把 JPEG 當 golden:壓縮雜訊會放大誤報。基準優先用無損 PNG。
  2. 新功能與 golden 同次自動合併:這會讓測試永遠追著目前結果跑。更新基準必須有獨立的人類批准。
  3. 全專案只設一個閾值:靜態 UI、粒子戰鬥與體積霧場景的噪音特性不同。
  4. 讓 critic 看見「新版」:檔名、commit 與作者資訊都可能變成捷徑。去識別後還要交換 A/B 順序。
  5. 只保存 pass/fail:至少留下 baseline、current、diff、metadata、rubric 與理由,否則無法除錯。
  6. 只重跑直接變更的場景:共用 shader、後製與渲染設定可能影響全站;impact map 不確定時就全跑。

這種「輸入、工具、權限與驗收結果都留下紀錄」的思路,也能和 AI Agent Harness 的治理觀念接起來。差別在於遊戲視覺多了一層難以自動量化的 art direction。

FAQ:Claude 遊戲視覺回歸常見問題

1. 截圖一樣,就代表遊戲功能正常嗎?

不代表。截圖只能證明某個鏡頭在某個時間點看起來相近,不能證明碰撞、路徑、輸入、效能或玩法正確。

2. 所有場景都該要求 pixel diff 等於零嗎?

不一定。靜態 UI 可以非常嚴格;含陰影、粒子或體積效果的場景,先找出同設定重跑的噪音帶,再定場景閾值。

3. 誰可以更新 Golden image?

指定的人類 reviewer。AI 可以提出理由,CI 可以附上證據,但基準更新應留下批准者與變更原因。

4. Claude 可以當最終美術驗收者嗎?

不建議。它適合比較多張圖、整理 rubric 證據與標記可疑區域;審美偏誤、位置偏誤與幻覺仍可能存在,玩家測試也不能省略。

5. Unity 與 Godot 可以共用同一組閾值嗎?

不要直接共用。引擎、渲染後端、品質設定與場景內容都會改變噪音特性;流程可以共用,基準與閾值要各自校準。

6. 光照或粒子一直誤報怎麼辦?

先控制來源,再調閾值。固定截圖幀、seed 與品質設定,關掉非驗收重點的隨機粒子;必要時為已知噪音區建立 mask。

7. 只跑受影響場景會不會漏測?

會,所以要有保守回退。共用資產與渲染設定要映射到所有相關場景;依賴關係未知時,CI 應全跑。

8. 有了視覺回歸,還需要玩家測試嗎?

需要。Golden Scene 擅長攔截非預期畫面變化;玩家測試才會揭露看不懂目標、路走不通、節奏不對與真正的遊玩感受。

給新手的 30 分鐘起手式

  1. 挑一個最常被改壞、但不含大量粒子的場景。
  2. 固定 1280×720、Camera、seed 與截圖幀。
  3. 寫四條 rubric 與兩條 hard-fail 規則。
  4. 保存一張人類批准的 PNG,跑 exact diff 並看熱圖。
  5. 第二次 commit 後再加盲式 A/B;先不要急著把所有場景接進 CI。

等第一個場景穩定,再把流程擴到資產生成與互動網頁。像 Claude Code 動畫網站工作流AI 網頁設計驗收,本質上也都需要「固定輸入 → 可重跑輸出 → 人類批准」這條主線。

接著閱讀

左右滑動查看更多推薦

結語:先讓一個場景可重跑

Claude 能加速改場景,也能當第二雙眼睛;真正讓團隊放心合併的,仍是可重跑的拍攝合約、能定位問題的 diff,以及清楚留下的人類決策。今天先挑一個 Golden Scene,把「同一張圖」穩定做出來,再談全自動。

想把這套方法延伸到完整的 AI 工作流,可以到 AlphaLab AI 課程AI 專區接著學。下一次 Claude 改完畫面,你要拿到的不只是一張新截圖,而是一份可以說明「為什麼能接受」的證據。

ALPHALAB 社群

有問題?來 Telegram 聊

和 Terry、編輯、其他網友一起討論這篇文章。提問、分享觀點,回覆更即時。

加入 Telegram 討論

📩 訂閱 AlphaLab 電子報

每週最多兩封,收到週報精選與關鍵 Alpha Signal。

我們不會 spam,隨時可退訂。