代:D2DX寬屏補(bǔ)丁如何讓800×600的老游戲重獲新生)
一塊DLL把《暗黑破壞神2》撈回現(xiàn)代D2DX寬屏補(bǔ)丁如何讓800×600的老游戲重獲新生【免費(fèi)下載鏈接】d2dxD2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions.項(xiàng)目地址: https://gitcode.com/gh_mirrors/d2/d2dx周六晚上的尷尬黑邊、粘鼠標(biāo)、還有卡成PPT的25幀你翻出珍藏多年的《暗黑破壞神2》光盤把游戲裝進(jìn)了剛買的27寸顯示器。雙擊Game.exe游戲倒是啟動了——但接下來兩小時的體驗(yàn)大概會讓你想砸鍵盤屏幕左右兩截巨大的黑色留白游戲本體縮在中間像一張貼在相框里的小照片。鼠標(biāo)移動像陷在泥里畫面一卡一頓。切個窗口再切回來整個界面直接花掉。這不是你顯卡的問題是游戲還活在2000年。當(dāng)年它出生時電腦標(biāo)準(zhǔn)是800×600分辨率、CRT顯示器、每秒25幀的動畫上限。硬編碼在程序深處的這些設(shè)定讓它在2026年的硬件上舉步維艱。D2DX一個開源的Glide轉(zhuǎn)接補(bǔ)丁就是沖著這三件事來的寬屏適配、高幀率解鎖、以及把游戲從古老的圖形接口里翻譯到現(xiàn)代DirectX 11。下文所有細(xì)節(jié)都來自這個項(xiàng)目的真實(shí)源碼和配置你可以對照著驗(yàn)證。一條翻譯的路而不是一條重寫的路你可能要問為什么不干脆重寫這個游戲答案藏在《暗黑破壞神2》的啟動參數(shù)里。它支持一個叫-3dfx的啟動方式會讓游戲走3dfx Voodoo顯卡時代的Glide圖形接口。作者 bolrog 選中的正是這條路不重寫游戲而是寫一個冒名頂替的glide3x.dll。游戲啟動時本來要加載這個dll來調(diào)用Glide API而D2DX讓這個dll叛變了——它接住所有Glide調(diào)用轉(zhuǎn)頭換成DirectX 11指令發(fā)給顯卡。游戲毫不知情還以為自己在跟一塊1997年的Voodoo顯卡說話。這個思路的好處顯而易見游戲邏輯一行不用改原始手感分毫不動而畫面輸出已經(jīng)完全現(xiàn)代化。代價是工程量不小——項(xiàng)目里glide3x.cpp一個文件就實(shí)現(xiàn)了上百個Glide接口。同聲傳譯四個字講透整個原理把D2DX想象成一個坐在游戲和顯卡之間的同聲傳譯員。游戲說Glide語幫我畫一條線D2DX幾乎實(shí)時地翻譯成DirectX 11語DrawLine再轉(zhuǎn)達(dá)給顯卡。顯卡聽不懂游戲說什么游戲也不知道顯卡換了人——傳譯員兩頭瞞著兩邊都以為在跟老朋友聊天。順帶一提這個翻譯過程還順手做了很多增值服務(wù)紋理被緩存復(fù)用、界面元素被單獨(dú)識別避免誤傷、陰影和文字被追蹤位置……這些細(xì)節(jié)構(gòu)成了它順滑感的來源。我們只看其中最小的一段——游戲調(diào)用畫線時發(fā)生了什么FX_ENTRY void FX_CALL grDrawLine(const void* v1, const void* v2) { try { const auto returnAddress (uintptr_t)_ReturnAddress(); D2DXContextFactory::GetInstance()-OnDrawLine(v1, v2, returnAddress); } catch (...) { D2DX_FATAL_EXCEPTION; } }grDrawLine是Glide標(biāo)準(zhǔn)的畫線函數(shù)D2DX把它整個接管轉(zhuǎn)發(fā)給內(nèi)部渲染管線。幾百個這樣的函數(shù)構(gòu)成了整座翻譯橋。五分鐘上手復(fù)制一個dll加上一個參數(shù)別被上面的源碼嚇到用起來真的只要五分鐘。第一步拿到glide3x.dll。你可以克隆源碼自己編譯git clone https://gitcode.com/gh_mirrors/d2/d2dx用Visual Studio打開d2dx.sln生成即可。不想編譯的話發(fā)行版里也直接帶了這個dll。第二步把它丟進(jìn)游戲目錄和Game.exe放在一起。第三步加一個啟動參數(shù)Game.exe -3dfx沒了。進(jìn)游戲你就會發(fā)現(xiàn)分辨率上去了畫面鋪滿了鼠標(biāo)不粘了。游戲里隨時按ALTEnter可以無縫切換窗口/全屏。小提示如果游戲報錯先檢查是否安裝了 Visual C 運(yùn)行庫x86版本。項(xiàng)目明確支持 Windows 7 SP1 及以上系統(tǒng)CPU 需要 SSE2顯卡支持 DirectX 10.1 就行——幾乎任何一臺還在服役的機(jī)器都達(dá)標(biāo)。配置實(shí)驗(yàn)室一檔一檔擰看畫面怎么變開箱即用的D2DX已經(jīng)把默認(rèn)值調(diào)得相當(dāng)平衡但真正好玩的在配置里。在游戲目錄放一個d2dx.cfgTOML格式D2DX就會按你的意思辦事。我們來當(dāng)實(shí)驗(yàn)員一項(xiàng)一項(xiàng)試。實(shí)驗(yàn)一寬屏開關(guān)這是開啟寬屏后的畫面——左右視野完整展開沒有任何拉伸變形。這張是禁用寬屏后的效果游戲回到4:3比例兩側(cè)留出黑邊。兩者的差別在于拉寬和看更多。D2DX的做法是結(jié)合SGD2FreeRes分辨率模組讓游戲渲染出更寬的視野而不是把畫面橫向壓扁。想體驗(yàn)原始比例在配置里寫nowidetrue即可。實(shí)驗(yàn)二縮放濾鏡三檔這是新手最容易忽略、但對觀感影響最大的選項(xiàng)——filtering。同一塊800×600的像素畫面放大到1080p時用什么方式填滿中間缺失的像素直接決定了你看到的是銳利還是糊filtering值效果一句話點(diǎn)評0默認(rèn)高質(zhì)量縮放邊緣銳利、顆粒感明顯像素原教旨主義者的最愛1雙線性過濾整體柔和偏糊看久了眼睛舒服細(xì)節(jié)有損失2Catmull-Rom過濾比雙線性更干凈的平滑畫質(zhì)黨的折中方案建議第一次用默認(rèn)0如果你覺得畫面太顆粒再切到2。實(shí)驗(yàn)三抗鋸齒開關(guān)老游戲的精靈圖和墻壁在放大后鋸齒感明顯D2DX內(nèi)置了對特定邊緣生效的FXAA注意它刻意不作用于文字和UI避免把界面弄糊上面兩張圖對比很明顯——角色輪廓和石墻邊緣開與不開是兩回事。默認(rèn)開著想關(guān)掉就寫noaatrue。完整配置示例[window] scale2 # 窗口放大倍數(shù)1-3 position[-1,-1] # [-1,-1]表示居中 framelessfalse # true則隱藏窗口邊框 [game] size[-1,-1] # [-1,-1]表示自動決定分辨率 filtering0 # 0銳利 / 1雙線性 / 2 Catmull-Rom [optouts] nowidefalse # true禁用寬屏 noaafalse # true禁用抗鋸齒 nomotionpredictionfalse # true禁用高幀率25幀的封印是靠猜下一幀解開的D2DX最硬核的部分是用運(yùn)動預(yù)測突破了游戲內(nèi)置的25幀上限。老游戲?yàn)榱吮WC邏輯穩(wěn)定把幀率鎖死在25fps。簡單粗暴地拔掉鎖幀開關(guān)游戲邏輯會以快進(jìn)的速度亂跑菜單動畫、傳送都會失控。D2DX的思路是游戲邏輯照舊25幀跑但渲染每秒出60幀甚至更多——渲染每一幀時根據(jù)單位當(dāng)前的位置和速度猜出它在邏輯下一幀的位置提前畫出來。這個猜有多講究我們看項(xiàng)目里UnitMotionPredictor.h的真實(shí)數(shù)據(jù)結(jié)構(gòu)struct UnitMotion final { Offset GetOffset() const; uint32_t lastUsedFrame 0; Offset lastPos { 0, 0 }; Offset velocity { 0, 0 }; Offset predictedPos { 0, 0 }; Offset correctedPos { 0, 0 }; int64_t dtLastPosChange 0; };看到predictedPos預(yù)測位置和correctedPos修正位置了嗎猜錯了不要緊下一幀馬上修正于是畫面平滑得像是在跑原生60幀。項(xiàng)目還專門為投射物、天氣、陰影、甚至傳送后的位置漂移做了修補(bǔ)——這些正是猜最容易翻車的場景。順帶一提紋理系統(tǒng)也用FNV1a哈希做緩存避免每一幀重復(fù)計(jì)算紋理指紋。這些優(yōu)化疊加起來就是幀率翻倍但CPU沒被壓垮的底氣。急救手冊三個最常見的翻車現(xiàn)場癥狀一啟動彈窗Diablo II is unable to proceed. Unsupported graphics mode.原因你裝的是暴雪官網(wǎng)的下載版游戲它缺少D2DX需要的某些文件。 藥方換用光盤版/完整零售版的《毀滅之王》這是兼容性最好的版本。癥狀二畫面糊得沒法看。原因filtering被設(shè)成了1雙線性。 藥方改成filtering0或2顆粒感和模糊感立刻區(qū)分開來。癥狀三高幀率下單位漂移傳送后角色跑偏。原因運(yùn)動預(yù)測對某些版本/場景的軌跡推算不夠準(zhǔn)。 藥方在配置里設(shè)nomotionpredictiontrue退回25幀邏輯同步或者確認(rèn)你的游戲版本在完整支持列表里1.09d、1.13c、1.13d、1.14d享有全部特性。還有一個容易被忽視的點(diǎn)如果游戲被手動設(shè)置了Windows XP兼容模式D2DX會檢測到并主動幫你清掉注冊表標(biāo)記——因?yàn)檫@個模式對它完全是副作用只會帶來花屏。不同配置下你能得到什么最后給一張投入產(chǎn)出比參考幫你按機(jī)器檔位做取舍功能性能開銷視覺/體驗(yàn)收益適合誰FXAA抗鋸齒低5%幀率邊緣顯著變平滑所有人高幀率運(yùn)動預(yù)測中等占用部分CPU25幀變60幀手感質(zhì)變有獨(dú)立顯卡的機(jī)器Catmull-Rom縮放低3%幀率放大后畫面更干凈追求畫質(zhì)的玩家紋理緩存負(fù)開銷減少重復(fù)加載幀率更穩(wěn)、加載更快所有人項(xiàng)目還沒收工你可以搭把手D2DX目前還在0.99.x系列作者 bolrog 長期維護(hù)社區(qū)成員 Xenthalon 也有代碼貢獻(xiàn)。方向明確完善1.09d的運(yùn)動預(yù)測支持、優(yōu)化與各種大型模組比如MedianXL、basemod的兼容性。技術(shù)愛好者可以直接讀UnitMotionPredictor、TextureCache、CompatibilityModeDisabler這幾個文件的源碼思路清晰注釋友好普通玩家遇到任何畫面異常去項(xiàng)目里提一個issue就是最實(shí)在的貢獻(xiàn)。最后二十多年前我們第一次踏入崔斯特瑞姆的篝火旁二十多年后D2DX讓同一團(tuán)篝火在4K屏幕上依舊溫暖。技術(shù)工作者沒有忘記這款游戲而它也沒有辜負(fù)任何認(rèn)真對待它的人?,F(xiàn)在就行動吧git clone https://gitcode.com/gh_mirrors/d2/d2dx編譯出你的glide3x.dll然后對Game.exe說出那句已經(jīng)快要失傳的咒語——-3dfx?!久赓M(fèi)下載鏈接】d2dxD2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions.項(xiàng)目地址: https://gitcode.com/gh_mirrors/d2/d2dx創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考