本帖最后由 kingeric 于 2014-4-4 15:20 编辑
聲明:本帖只能排查內存引擎相關問題,增進效能。MOD衝突或壞檔所造成的跳出與此無關。
關於以下資訊的來源,主要是來自mod原作者的說明。
開始前先說一下自己的配置:
L5639@ 4.0g
gtx680 4g
24g ram
曾經,我也為CTD ILS等問題所苦
現在,我的40g天際可以ENB全開 + SMAA + uGridsToLoad=9 + dat grass + SMC,野外最低也有20+ fps
曾經,我不需要"退出遊戲" 它就會自己退出
現在,我可以不關遊戲數日,單靠Alt + Tab切出切入
而這一切只有靠這四項優化才能達到。
1. SSME ~有病治病,沒病強身
基於Sheson的發現,由Queue製作。
相關症狀'
讀檔無限讀取
無法離開室內
當一個程序執行時,必須要呼叫一塊記憶體作為存放資料用,但若叫來的記憶體空間用完了該怎麼辦呢? 這裡B社使用的做法是,先將不要的垃圾清掉、再呼叫更多區塊。 這做法卻是導致高清材質CTD及無限讀取的重要元兇!
原來B社認為只有一種情況會使得初始記憶區塊不足,也就是遺留的先前場景資料加上新場景資料時,而這時可以PCB 釋放用不到的材質空間,也就是清垃圾,若清垃圾後空間仍然不足,就會呼叫新區塊。 要是沒有舊場景呢.....? 在各種mod載入之下,光新場景載入就會滿載初始區塊,使清理程序作用,然後, 然後就沒有了。 因為清理程序沒有完成,不會呼叫新區塊,也不會繼續載入,也就是無限讀取bug。這也是先讀舊檔再讀新檔可以破無限讀取的原因,讀新檔時清舊檔資料,清完不夠叫新的區塊就可以順利載入。
因此,Sheson增加區塊的大小,使初次載入不會超過初始區塊,可以避開此bug。
N網SSME
2. ENBoost
~打通任督二脈,釋放潛能
由ENB作者,戰鬥民族的代表,Boris製作。
相關症狀
3.1G跳出
無限讀取
爆內存
於SSME時有提到,當引擎使用記憶體區塊用完時,會再呼叫新的一塊,但由於32bit先天的限制,單一程序最多只能使用 3.1g內存,超過即死,因此在當年不少英雄好漢皆死於此障壁。
但障壁的存在就是為了被突破。
為解決此問題,boris採用兩種方式並行。1. 減少內存用量 2. 提高內存上限
為了說明第一點,先解釋一下當遊戲載入時發生了什麼。
首先,遊戲會將場景中需要的東西從硬盤複製到內存,再將與顯示有關的材質、模型等從內存映射至顯存處理。 也就是說,同樣的資源在電腦共有三份,分別在硬盤、內存、顯存。
因此,只要材質一送到顯存,就將內存中的備份去掉,就可大幅度減少內存使用。 不只如此,當顯存滿載時,額外的材質會載入至內存,使得最終載入資源的上限由原本的 3.1G 增加為 顯存+3.1G。
對6G titan 而言,上限為 9G,對 4G 770 則是 7G。用來應付高清材質包可說是游刃有餘了。 但此舉仍有缺點,由於顯存與GPU速度需求大,使得當GPU呼叫位於內存的額外資源時,來不及轉移,而可能造成撕裂感及停頓感。
什麼! 還不夠用!
先前提到32bit的限制3.1G,也就是 "單一" 32位程序的上限,因此ENBoost引入程序enbhost.exe,當快到內存上限時,會自動執行用來存放額外的資源,增加內存上限到128G。<----(這是服務器吧...)
enb官網
3. Stable uGridsToLoad
~追求極限,超越巔峰
由AltimorFP製作
相關症狀
uGridsToLoad=
uGrid 一直是畫面黨的聖杯,玩家們冒著燒雞的風險設定ugrid= 9, 11 甚至13,只為了能有張清楚的截圖。
然而增加ugrid所帶來的視覺衝擊,與它所帶來的效能衝擊,都是指數級的成長。
雖然眾人皆以為這是載入更多區域必然的結果,AltmorFP仍然找到了優化辦法。
原來載入區域Cell的指令存在遞迴bug (重複建立Call stack 造成 CPU stack overflow .....不懂~) 造成資源浪費,同時該bug也是不能直接調低 uGrid 的原因。
因此修復此bug可提升載入區域的效能和穩定。
雖然對於uGrid為預設值的人影響不大 (就算是預設值,bug還是在,只是不大影響遊戲),但對於有修改uGrid的玩家均表示可以無壓力提升一級,更出現了uGrid = 21的神圖。
重要:
由於遊戲中,許多script腳本是以載入cell來觸發, uGrids 超過 9 將造成script錯誤載入而無法正常遊戲 ( 例如森林中刷出河蟹、怪物沒有動作、友善的強盜等等腳本問題),因此更高的設定值只適合截圖使用。
N網Stable uGridsToLoad
4. Safety Load
~處方用藥,小心服用
由kapaer製作
相關症狀
無限載入
物品欄CTD
介紹SSME時曾提到,引擎內建清理內存的程序存在bug,造成無限讀取或跳出的問題。
SSME的做法是加大預讀區塊,避免觸發清理內存bug。
kapaer則是以另一種方式修復,也就是跳過清理程序,直接呼叫新記憶區塊。
也因為跳過清理程序,會讓內存用量稍微增加。
問題是,清理內存並不是壞事,反而是維護內存的重要手段,於遊戲中也常常會執行自動清理。
既然bug也只會在載入時才有可能發生,作者便提供了設置檔 SafetyLoad.ini,可設定只在載入畫面時跳過清理程序。
重要:
SafetyLoad.ini 內需改 EnableOnlyLoading = true 否則物品欄CTD
N網Safety Load
結語
這些MOD該如何設定才能達到最佳效果,論壇上已有許多教程,我就不在這多做篇幅了。
解決CTD並不是一朝一夕的問題,而是一種態度。
隨意安裝MOD、胡亂調整ini、排序錯誤等才是造成CTD的主因。
最後再次感謝大神們解放了B社為主機優化的天際,開啟在PC上的無限可能。
|