相關文章

Bb2de6910514292e06895daea7dabd2d 對應Nintendo GameCube、Nintendo Wii平台的Dolphin模擬器在更新至5.0版之後,對GameCube遊戲的相容性已經來到「百密一疏」,唯一的遺珠之憾就是因為記憶體管理太過複雜而無法執行的星際大戰:複製人戰爭,然而在Dolphin模擬器更新至5.0-540之後,這個問題被成功解決了。

需先瞭解記憶體原理

在瞭解星際大戰:複製人戰爭為什麼無法被模擬之前,我們需要先對GameCube處理器的記憶體管理方式有些瞭解。在處理器中的記憶體管理單元(Memory Management Unit,簡稱MMU)的工作是提供快速資料存取的能力,在遊戲程式存取資料的過程中,程式會透過MMU存取虛擬記憶體,而非直接存取實體記憶體,而在虛實雙邊的對應上,則是透過區塊位置轉譯(Block Address確能 Translation,簡稱BAT)或是分頁表(Page Table)來達成。

由於BAT的效能表現比分頁表好,所以大多數的遊戲都使用預設的BAT,Dolphin的做法就是將BAT寫死在模擬器中,因此當遊戲向主機(也就是Dolphin)要求存取記憶體時,Dolphin就會給它1個轉換過後的實體記憶體區塊。此外Dolphin還能夠使用MMU Off模式,Dolphin將不會模擬MMU,而只是單純給遊戲一些記憶體資源,有趣的是,在大部分的GameCube遊戲以及幾乎全部的Wii遊戲都能在這種模式下運作。

然而不支援MMU Off模式的遊戲,也不一定需要透過模擬MMU來支援,MMU Speedhack就是種可以兼顧相容性與效能的替代方案,它的做法是提供遊戲需求的記憶體空間,並將其標註為可用記憶體。由於實體GameCube主機中除了有容量為24MB的主記憶體外,還有容量為16MB的輔助記憶體,然而處理器的硬體設計卻無法直接存取輔助記憶體,遊戲需要在存取「不可用記憶體」時,觸發系統的例外處理機制,並透過直接記憶體存取(DMA)功能來存取資料、避免遊戲當機。雖然這種方式也能維持良好效能,但無法支援採用非典型記憶體管理的遊戲。

▲MMU Off模式Dolphin將不會模擬MMU,大部分遊戲卻能在此模式下運作。(圖片來源:Dolphin官方網站,下同)

▲MMU Speedhack則是提供額外的記憶體空間來滿足遊戲需求。

那就模擬BAT吧

在星際大戰:複製人戰爭中,遊戲採用自己的方式定義可用的記憶體,讓Dolphin相當頭大。在使用MMU Speedhack/MMU Off的情況下,由於Dolphin並沒有真的模擬MMU,所以在遊戲執行過程中,無論記憶體位置0x00000000中存放的資料是什麼,程式都會將這個區塊映射給處理器使用,所以會產生當機。然而在模擬MMU的情況下,雖然程式能夠正常觸發例外處理機制,但是由於Dolphin的BAT寫死在模擬器中,所以在轉譯的過程中還是會當機。

然而針對這款遊戲改寫BAT也不是可行之道,因為遊戲採用自己的記憶體管理方式,並且會在遊戲中多次改變BAT,因此Dolphin來說適當模擬MMU是必要的。於是開發者們重寫了BAT模擬的部分,並將其命名為Dynamic BATs,它會模擬BAT的真實運作模式,並正確映射遊戲所存取的記憶體。

受益於Dynamic BATs,Dolphin現在終於可以執行星際大戰:複製人戰爭,這也代表著Dolphin能夠執行所有官方授權推出的GameCube遊戲,雖然還是有些遊戲在執行過程中有些狀況,但從此之後在也沒有遊戲會卡在啟動階段而看不到任何畫面,所以說這仍然是Dolphin最重大的里程碑之一。

▲因為星際大戰:複製人戰爭採用自定的記憶體管理方式,所以逼迫Dolphin需要模擬BAT。

▲在Dynamic BATs出現後,Dolphin終於成功模擬星際大戰:複製人戰爭。

使用 Facebook 留言

發表回應

謹慎發言,尊重彼此。按此展開留言規則