3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 22353|回复: 40
打印 上一主题 下一主题

[心得] 對症下藥: 四大引擎優化mod 原理簡介 & 對應症狀

  [复制链接]

23

主题

565

帖子

634

积分

超级玩家

Rank: 5Rank: 5

贡献度
32
金元
5061
积分
634
精华
0
注册时间
2009-9-7
跳转到指定楼层
主题
发表于 2014-4-4 15:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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上的無限可能。

评分

8

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-3-31 11:55 , Processed in 0.033126 second(s), 19 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表