遊戲年代 GOAL GOAL

 找回密碼
 立即註冊
搜索
查看: 79|回復: 1

這個模擬器的大型電玩要如何跟別人連線對戰?

[複製鏈接]

405

主題

840

帖子

1萬

積分

論壇元老

Rank: 8Rank: 8

積分
10422
發表於 昨天 05:41 | 顯示全部樓層 |閱讀模式
這個模擬器的大型電玩要如何跟別人連線對戰?
https://www.ptt.cc/bbs/Emulator/M.1787162060.A.94F.html
我有設定了 連線等了一個小時還是找不到人
是要設定那裡才能連線
知道的能貼圖一下嗎
試成功能告訴我一下嗎?
謝謝

回復

使用道具 舉報

16

主題

140

帖子

3385

積分

銀牌會員

Rank: 5Rank: 5

積分
3385
發表於 昨天 12:11 | 顯示全部樓層
本帖最後由 good7 於 2026-8-20 12:16 編輯

下面這個我問 ai 的,而且連線成功,用 GGPO 模式,另一個模式沒時間試。

總括幾句話:bios 版本要相同、遊戲版本、區域要相同、emu.cfg 和 dc_nvmem.bin 要相同。還有其它的,不過這幾個是最主要的。

sshot-2026-08-20-[12-12-55].png


sshot-2026-08-20-[12-15-51].png ================================================================================
                Flycast GGPO 連線完整記錄
================================================================================
專案:Flycast(SEGA Dreamcast / Naomi / Naomi2 / Atomiswave 模擬器)
適用版本:flycast26_cht_include_BIOS(含 BIOS 之自訂版)
建立日期:2026-08-20
編碼:UTF-8
================================================================================

【一、GGPO 是什麼】
--------------------------------------------------------------------------------
GGPO(Good Game Peace Out)是 Flycast 內建的網路對戰框架,用於 Dreamcast
家用機格鬥遊戲(如 CVS2、MvC2、SF3:3S 等)的 1v1 連線對戰。
它透過「回滾(rollback)」技術補償網路延遲,讓雙方操作即時反應。

連線本質:UDP 點對點(P2P)直連,無中央伺服器。
  - 玩家 1(開房者)監聽 UDP 19713
  - 玩家 2(加入者)監聽 UDP 19712,並連到玩家 1 的 19713
  - 埠號定義:core/network/ggpo.cpp:99  SERVER_PORT = 19713
  - 角色與埠邏輯:core/network/ggpo.cpp:808-813


【二、連線前必備條件(雙方都必須滿足)】
--------------------------------------------------------------------------------
■ 檔案層級(MD5 必須一致)
  1. 相同版本的 Flycast 執行檔(exe 的 MD5 必須一致)
  2. 相同 BIOS 檔案(GGPO 會驗證 BIOS MD5,nvmem.cpp:287-290)
  3. 相同遊戲(同一款遊戲、同一區域版本,GGPO 會驗證遊戲 MD5)
  4. 相同的 Flash RAM(dc_nvmem.bin)狀態
  5. 相同的 VMU 記憶卡(vmu_save_A1.bin / vmu_save_A2.bin)狀態
  6. 相同的 EEPROM 狀態(Naomi 遊戲用 .eeprom 檔,maple_jvs.cpp:1364-1382)

■ 設定層級(emu.cfg 必須一致,會改寫 nvmem 內容),這個檔案在 → 主程式的同資料夾下面。
  7. Dreamcast.Region(nvmem.cpp:155-158 改寫 0x1a002/0x1a0a2)
  8. Dreamcast.Language(nvmem.cpp:160-163 改寫 0x1a003/0x1a0a3)
  9. Dreamcast.Broadcast(nvmem.cpp:165-168 改寫 0x1a004/0x1a0a4)
  10. ISPUsername(nvmem.cpp:195 add_isp_to_nvmem 寫入 ISP 區塊)
  11. Maple 裝置配置 device1~device4(maple_cfg.cpp:356-374 vmuDigest
      把所有 Maple 裝置資料都算進 vmu MD5,不只 VMU)
  12. PerGameVmu / UsePhysicalVmuMemory(影響 VMU 檔來源)
  13. Dreamcast.Cable(emulator.cpp:200-223 依遊戲 IP 支援 override,
      影響 bsc.cpp:49 的 tfinal,建議一致)

■ 驗證基準(core/network/ggpo.cpp:538-555)
  - 有存檔時:使用存檔(savestate)的 MD5
  - 無存檔時:使用 nvmem + nvmem2 + eeprom + vmu 的 MD5
  任一項不一致 → GGPO 回傳 VERIFICATION_ERROR → 卡在「Starting Network...」

■ 隱藏陷阱(最容易忽略)
  A. console_id 隨機化(nvmem.cpp:197-211)
     若 dc_nvmem.bin 的 console_id(0x1A058 起 6 bytes)全為 0xFF,
     Flycast 會用 srand(now) 隨機產生 → 兩邊一定不同 → 驗證失敗。
     解決:先讓兩邊 dc_nvmem.bin 一致且 console_id 非全 FF
     (本次已同步,目前為 B5 AD 3E CE 42 AE,非全 FF)
  B. 遊戲啟動後 nvmem 可能被改寫
     遊戲寫入 Flash RAM(ISP 設定、遊戲存檔)→ 兩邊 nvmem 再次不一致。
     每次連線前先比對 dc_nvmem.bin 的 MD5,不一致就重新同步。
  C. 存檔(savestate)存在時改用存檔 MD5
     若兩邊各有存檔但內容不同 → 驗證失敗。
     想從特定進度開始:雙方載入同一份 .state 檔。
  D. 相同遊戲但不同區域(日版/美版)→ 遊戲 MD5 不同 → 驗證失敗。


【三、設定檔位置與欄位】
--------------------------------------------------------------------------------
設定檔:<flycast 資料夾>\emu.cfg 的 [network] 區塊

  ActAsServer = yes/no    玩家 1 開房者設 yes;玩家 2 加入者設 no
  server = <IP或域名>     玩家 2 填玩家 1 的位址;玩家 1 留空
  GGPO = yes              啟用 GGPO 連線
  GGPODelay = 0           幀延遲(ping >100ms 時建議 1-2)
  EnableUPnP = yes        自動設定路由器埠轉發(跨網際網路時用)
  Stats = yes             畫面上顯示連線統計

GUI 對應位置:主選單 → Settings → Network
  - Network Type 選 GGPO
  - Play as Player 1(= ActAsServer)
  - Peer(= server)
  - Frame Delay(= GGPODelay)


【四、三種連線環境的設定】
--------------------------------------------------------------------------------
■ 環境 A:同一台電腦雙開(兩份 flycast 同時執行)
--------------------------------------------------------------------------------
  玩家 1(原版資料夾):
    ActAsServer = yes
    server =            (留空)

  玩家 2(複本資料夾):
    ActAsServer = no
    server = 127.0.0.1

  啟動順序:
    1. 先啟動玩家 1,載入遊戲,進入「Starting Network...」等待
    2. 再啟動玩家 2,載入同一款遊戲
    3. 玩家 2 自動連到 127.0.0.1:19713
    4. 兩邊顯示「Synchronized with peer」→「Running」即成功

  埠對接驗證(ggpo.cpp:587-588):
    玩家 2 的 localPort = 19712(SERVER_PORT-1)
    peer 為 127.0.0.1 時 peerPort = localPort ^ 1 = 19713 ✓

■ 環境 B:區域網路兩台電腦
--------------------------------------------------------------------------------
  玩家 1(開房那台):
    ActAsServer = yes
    server =            (留空)

  玩家 2(加入那台):
    ActAsServer = no
    server = <玩家1的內網IP>    例如 192.168.1.100

  查玩家 1 內網 IP:該台開 cmd 輸入 ipconfig,看「IPv4 位址」

  注意事項:
    - 玩家 1 的 Windows 防火牆必須放行 UDP 19713
      (首次連線時 Windows 會跳詢問視窗,勾選「允許」)
    - 兩台需在同一網段(同一路由器下)

■ 環境 C:網際網路兩台電腦(不同地方)
--------------------------------------------------------------------------------
  玩家 1(開房那台):
    ActAsServer = yes
    server =            (留空)

  玩家 2(加入那台):
    ActAsServer = no
    server = <玩家1的公網IP或DDNS域名>    例如 203.0.113.5

  查玩家 1 公網 IP:該台開瀏覽器連 https://api.ipify.org 看回傳值

  玩家 1 那端必須完成(缺一不可):
    1. 路由器埠轉發:UDP 19713 → 玩家 1 電腦的內網 IP
       (或依賴 EnableUPnP = yes 自動轉發,但部分路由器不支援)
    2. Windows 防火牆放行 UDP 19713
    3. 若公網 IP 是浮動的,建議用 DDNS 域名填在玩家 2 的 server

  注意事項:
    - 玩家 1 若在 NAT 後方且無公網 IP,需先做埠轉發
    - 玩家 2 通常不需埠轉發(主動連出)
    - 連線卡住時,多半是玩家 1 的埠轉發/防火牆沒設好


【五、連線流程(程式碼追蹤)】
--------------------------------------------------------------------------------
1. 載入遊戲 → emulator.cpp:621-628
   - config::GGPOEnable 時強制 Sh4Clock = 200
   - 呼叫 dc_loadstate(-1) 計算存檔 MD5(nullDC.cpp:223-228)
   - 無存檔時顯示「Save state not found」(nullDC.cpp:205)→ 正常現象,
     會改用 nvmem/vmu 的 MD5 驗證

2. 進入「Starting Network...」→ gui.cpp:1157
   - NetworkHandshake::start() → ggpo::startNetwork()(net_handshake.cpp:32-34)

3. startNetwork()(ggpo.cpp:792-836)
   - 玩家 1:startSession(19713, 0)(玩家編號 0)
   - 玩家 2:startSession(19712, 1)(玩家編號 1)
   - 迴圈呼叫 ggpo_idle() 等待同步
   - 驗證失敗 → GGPO_ERRORCODE_VERIFICATION_ERROR → throw
     「Peer verification failed」(ggpo.cpp:827-828)

4. 同步事件(ggpo.cpp:214-253)
   - CONNECTED_TO_PEER → 已連到對方
   - SYNCHRONIZING_WITH_PEER → 同步中
   - SYNCHRONIZED_WITH_PEER → 同步完成
   - RUNNING → 開始對戰(synchronized = true)


【六、常見問題與排除】
--------------------------------------------------------------------------------
■ 問題 1:卡在「Starting Network...」且下方先顯示「Save state not found」
  原因:無存檔時改用 nvmem/vmu MD5 驗證,兩邊不一致
  排除:
    1. 比對兩邊 dc_nvmem.bin 的 MD5:
       Get-FileHash "Z:\flycast26_cht_include_BIOS\data\dc_nvmem.bin" -Algorithm MD5
       Get-FileHash "Z:\複本 - flycast26_cht_include_BIOS\data\dc_nvmem.bin" -Algorithm MD5
    2. 不一致時,把玩家 1 的 dc_nvmem.bin 複製到玩家 2(覆蓋)
    3. 注意:遊戲啟動後可能改寫 Flash RAM,導致再次不一致
       → 每次連線前先比對,或連線期間不要讓遊戲寫入 Flash

■ 問題 2:卡在「Starting Network...」但 nvmem 一致
  原因:網路設定錯誤(Peer 空白 / 角色設定錯誤 / 埠不通)
  排除:
    1. 確認玩家 1 ActAsServer = yes、玩家 2 server 有填
    2. 同機雙開:玩家 2 server = 127.0.0.1
    3. 跨機:確認防火牆放行 UDP 19713、埠轉發正確
    4. 開啟 Network Statistics 觀察連線狀態

■ 問題 3:顯示「Peer verification failed」
  原因:BIOS / 遊戲 / nvmem / vmu 任一 MD5 不一致
  排除:確認雙方使用相同 BIOS、相同遊戲、相同 Flash RAM、相同 VMU

■ 問題 4:連線後不同步(畫面不同步 / 卡頓)
  原因:網路延遲高
  排除:雙方都設 GGPODelay = 1-2(ping >100ms 時)

■ 問題 5:想從特定進度開始對戰
  做法:雙方各自載入同一存檔(同一份 .state 檔),
        GGPO 會改用存檔 MD5 驗證


唯一正規做法是雙方共用同一份 dc_nvmem.bin(連線期間不讓遊戲寫入),或改用存檔(savestate)
驗證——雙方載入同一份 .state 檔,GGPO 就改用存檔 MD5,不再受 nvmem 影響。


================================================================================
                                記錄結束
================================================================================

評分

參與人數 1金錢 +20 收起 理由
ili789 + 20 熱心助人

查看全部評分

回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|小黑屋|遊戲年代 GOAL GOAL

GMT+8, 2026-8-21 05:27 , Processed in 0.022038 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回復 返回頂部 返回列表