我注意到有不少关于《英雄萨姆4》无法识别新型号显卡的讨论帖子。我也遇到了同样的问题:游戏就是无法识别我的3080 TI,即使安装了最新的驱动程序。 虽然你可以轻松跳过警告并启动游戏,但似乎游戏每次都会重置你的图形设置。每次想玩游戏时都要手动重新设置这些选项,很快就会变得非常烦人。 所以我做了一些调查,找出了问题所在,并且也有了解决方案! 到底出了什么问题? 如果你也有同样的问题,你可能也访问过Steam上的讨论论坛,并且可能看到开发者要求发布日志文件。首先,浏览至游戏的安装目录,日志文件(我们将仔细查看的脚本文件也位于此处)可在此找到。最简单的方法是在Steam库页面右键点击游戏,然后选择“管理>>浏览本地文件”。 接下来,找到名为“Logs/Sam4.log”的日志文件,并用你选择的文本编辑器打开它。 查看此日志文件,你很可能会看到你的GPU已被正确识别。我们要查找的行类似于以下示例: ... 10:57:26 LOG: [D3D11] 使用DXGIFactory1接口。 10:57:26 LOG: GPU #1: NVIDIA GeForce RTX 3080 Ti 来自nVidia 10:57:26 INF: [D3D11] 检测到的设备: 10:57:26 INF: #1: (10DE; 2208:38971462.00A1) NVIDIA GeForce RTX 3080 Ti (12108, 0/16296 MB)我们要查找的ID可在日志文件的以下行中找到: ... 10:57:26 INF: [D3D11] 检测到的设备: 10:57:26 INF: #1: (10DE; 2208:38971462.00A1) NVIDIA GeForce RTX 3080 Ti (12108, 0/16296 MB) ... 我们需要的标识符位于检测到的设备信息的分号(“;”)和冒号(“:”)之间,如下行中所示: #1: (10DE; 2208:38971462.00A1) NVIDIA GeForce RTX 3080 Ti (12108, 0/16296 MB) 因此,以3080 Ti为例,该标识符为“2208”。 接下来,打开“PerfIndexGPU.lua”脚本,找到包含您自己显卡厂商的GPU列表变量(以我为例,是nVidia)。在该列表中,找到性能与您自己显卡最接近的GPU: ...-- 按厂商划分的设备ID表 local perVendorGpuIDs = { -- 英伟达 nVidia = { -- 桌面端(驱动版本461.72) [0x06C0] = { performance=440, name="GeForce GTX 480" }, [0x06C4] = { performance=345, name="GeForce GTX 465" }, ...此处省略大量其他GPU信息... [0x21C4] = { performance=1600, name="GeForce RTX 1660 SUPER" }, [0x21D1] = { performance=835, name="GeForce GTX 1650 Ti" }, [0x2204] = { performance=4820, name="GeForce RTX 3090" }, [0x2206] = { performance=4050, name="GeForce RTX 3080" }, [0x2207] = { performance=4050, name="GeForce RTX 3080" }, ...此处省略更多GPU信息... }, -- ATI ATi = { ...现在只需复制性能最接近你自己显卡的那一行GPU信息(以我为例,是3090),将标识符更改为我们上面找到的那个(以我为例是“2208”),并(可选地)将描述更改为你的显卡名称。 如果你确实想调整,也可以更新性能值,不过这完全是可选的,不会有太大影响。 现在代码应该看起来像这样: ... ...这里有很多其他GPU的信息... [0x2204] = { performance=4820, name="GeForce RTX 3090" }, [0x2208] = { performance=4800, name="GeForce RTX 3080 TI" }, ...这里还有更多GPU的信息... }, -- ATi ATi = { ... 最后,只需保存对文件的更改,我们就完成了。游戏现在将识别我们的GPU。最后的话 我们已修复了GPU检测问题! 现在游戏启动时不会再出现烦人的提示消息,也不会每次都重置你的图形设置。 此外,作为额外福利,你还可以使用【自动检测】功能来自动确定适合你系统的最佳设置。 终于到了大杀四方的时候了!这意味着游戏确实能识别到显卡,但出于某种原因,它仍然会显示无法识别已安装的显卡。 让我们继续查看。在日志文件的更下方,还会显示类似以下内容: 10:57:26 LOG: 正在处理文件 Content/SeriousSam4/Config/CheckDriver.lua 10:57:26 INF: 驱动版本:47196(要求:45600) 10:57:26 LOG: 正在处理文件 Content/SeriousSam4/Config/SystemCompatibility.lua 10:57:26 LOG: 兼容性检查失败:GPUDetect 因此,尽管显卡已被识别,但游戏似乎在使用一个名为“SystemCompatibility.lua”的脚本文件。不知为何,这个脚本文件无法检测到显卡。 由于这是一个LUA脚本文件,我们应该能轻松查看其中的问题所在。使用任意文本编辑器(记事本即可)打开文件“Content/SeriousSam4/Config/SystemCompatibility.lua”,在脚本末尾附近可以找到检查GPU的代码: ... -- 显存检查 if gfx_ulVideoMemoryMB < 2500 then CollectCompatibilityFailMessage("显存低于最低要求(" .. gfx_ulVideoMemoryMB .. " MB)", "VidRAM") end -- 获取GPU规格 dofile("Content/Shared/Config/PerfIndexGPU.lua") local gpuSpecs = globals.gpuSpecs globals.gpuSpecs = nil -- 如果我们已获取GPU规格 ... 由此看来,该脚本能够检测GPU的显存容量,但无法检测GPU规格。代码行dofile("Content/Shared/Config/PerfIndexGPU.这里值得注意的是lua文件,它似乎是另一个用于确定实际GPU规格的脚本文件。 由于它是另一个LUA脚本文件,我们只需用文本编辑器打开它就能了解其作用。 在这个文件中,我们会看到首先声明了一些变量,其中包含数百种不同GPU的信息,每种GPU都有一个性能指数。快速搜索这些变量后发现,我的显卡(3080 TI)不在列表中,所以这很可能就是实际问题所在。游戏似乎使用硬编码的GPU标识符列表,如果你的显卡不在列表中,那就没办法了。 如果我们查看文件末尾,情况确实如此:local function GetGpuSpecs() local retVal = nil -- 从ID获取GPU厂商 local gpuVendor = gpuVendorIDs[sys_iGPUVendorID] if gpuVendor == nil then return retVal end -- 无论如何,既然找到了厂商信息,我们就可以提供厂商信息 retVal = {vendor = gpuVendor} -- 从厂商获取GPU local vendorGpuIDs = perVendorGpuIDs[gpuVendor] -- 如果该厂商没有GPU信息,则无需进一步操作 if vendorGpuIDs == nil then return retVal end -- 从厂商GPU和当前设备ID获取GPU规格 local uwCurrentDevID = (sys_iGPUDeviceID % 0x10000); -- 将计算出的设备ID作为显卡ID存储在返回值中(因为有时会用到) retVal.cardId = uwCurrentDevID local card = vendorGpuIDs[uwCurrentDevID] -- 若无法获取显卡信息,则无需进一步操作 if card == nil then return retVal end ...如果我们仔细查看“GetGpuSpecs()”函数,可以发现: 该函数首先根据“sys_iGPUVendorID”变量确定供应商:local gpuVendor = gpuVendorIDs[sys_iGPUVendorID] 接着,它使用此信息选择与该供应商对应的GPU列表变量:local vendorGpuIDs = perVendorGpuIDs[gpuVendor] 然后使用该列表查找实际的GPU:local card = vendorGpuIDs[uwCurrentDevID] 如果最后一步失败,例如由于硬编码列表中没有你的GPU,脚本将停止并向“SystemCompatibility.lua”脚本返回值“nil”(即无任何内容),进而引发“GPUDetect”错误。 既然我们已经知道问题所在,就可以轻松修复它。有两种不同的方法可以做到这一点。 修复方法一 - 暴力破解检测 第一种方法最简单:我们只需让脚本认为我们拥有不同的显卡。 打开“Content/Shared/Config/PerfIndexGPU.lua”脚本。 在包含不同厂商和显卡的变量中,找到一款性能与你自己显卡相近的显卡。以我为例,我使用了3090的信息,因为3080 TI和3090在游戏性能方面基本相同。 记下这款显卡的标识符。这是显卡信息行中方括号之间的值,例如我的例子中的“0x2204”: [0x2204] = { performance=4820, name="GeForce RTX 3090" } 接下来,滚动到脚本的最底部,找到以下几行: ...本地函数GetGpuSpecs() 本地变量retVal = nil ... 我们只需在这两行之间添加新的一行,手动将"sys_iGPUVendorID"变量设置为我们之前选择的GPU标识符。代码应如下所示: ... 本地函数GetGpuSpecs() sys_iGPUVendorID = 0x2204 本地变量retVal = nil ... 最后,保存对文件的更改即可完成操作。游戏现在会认为我们拥有不同的GPU。 修复方法2 - 扩展已知GPU列表 第二种修复方法稍复杂一些,但更完善:我们只需将自己的GPU添加到现有的已知GPU列表中。 首先,我们需要找出自己GPU的设备标识符。我们可以在之前查看的日志文件中找到它。




换一换 















