You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

directxtk_desktop_win10的CommonStates构造函数崩溃问题求助

DirectXTK Win10版CommonStates构造函数在双GPU笔记本崩溃(空指针访问违例)

问题概述

使用directxtk_desktop_win10 2026.5.8.1版本时,CommonStates(device)构造函数触发0xC0000005访问违例(读取地址0x0000000000000000),仅在配备集成+独立GPU的笔记本(2025款Falcon Northwest,搭载Nvidia 4090)上出现——即使手动禁用集成GPU,崩溃仍会发生。

相同代码使用已弃用的directxtk_desktop_2019 2025.10.28.2版本可正常运行,且同一可执行文件在仅集成显卡的低端笔记本、仅Nvidia 2080的台式机上无问题。更换包前已卸载旧包并全量重编译,无版本冲突。

复现步骤

  • 安装Direct3DUWPGame.vsix模板,在VS2019中创建“Direct3D Win32 Game DR”项目(基于DirectX 11,非UWP)。
  • 通过NuGet添加directxtk_desktop_win10包。
  • 在Game.h中添加#include "CommonStates.h"。
  • 在Game.cpp构造函数前声明变量:std::unique_ptr<DirectX::CommonStates> g_renderStates_p = nullptr;。
  • 在CreateDeviceDependentResources()初始化device后添加:g_renderStates_p = std::make_unique<CommonStates>(device);,运行程序即崩溃。

排查与解决方案

1. 验证Device指针有效性

崩溃源于空指针访问,首先确认传入CommonStates的device指针是否真的有效。在构造函数调用前添加断言:

assert(device != nullptr);

若触发断言,说明CreateDeviceDependentResources()中device初始化存在隐性失败——双GPU环境下,设备创建可能因适配逻辑未完全生效而返回空指针。

2. 强制绑定高性能GPU

部分笔记本的GPU切换逻辑即使手动禁用集显仍可能残留影响,需显式指定程序使用独立GPU:

  • 创建项目同名的.manifest文件(如Test.exe.manifest),添加以下内容:
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
      <windowsSettings>
        <graphicsPreference xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">HighPerformance</graphicsPreference>
      </windowsSettings>
    </application>
    
  • 或在程序启动时调用API强制设置GPU偏好(需Windows 10 1903及以上版本):
    #include <windows.h>
    
    int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow) {
        // 设置DPI感知
        SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
        // 强制使用高性能GPU
        HMODULE hKernel32 = LoadLibrary(L"kernel32.dll");
        if (hKernel32) {
            typedef BOOL(WINAPI *PFN_SETPROCESSGPUPREFERENCE)(DWORD);
            PFN_SETPROCESSGPUPREFERENCE pfnSetGpuPref = (PFN_SETPROCESSGPUPREFERENCE)GetProcAddress(hKernel32, "SetProcessGpuPreference");
            if (pfnSetGpuPref) {
                pfnSetGpuPref(GRAPHICS_PREFERENCE_HIGH_PERFORMANCE);
            }
            FreeLibrary(hKernel32);
        }
        // 后续初始化逻辑
    }
    

3. 匹配Windows SDK与编译工具集

directxtk_desktop_win10针对Win10+优化,需确保项目配置:

  • Windows SDK版本为10.0.19041.0或更高;
  • 编译工具集使用VS2019的v142工具集(与包的编译环境匹配)。

4. 调试DirectXTK源码定位问题

若以上方法无效,可直接调试DirectXTK源码:

  • 克隆DirectXTK仓库,替换NuGet包为本地源码引用;
  • 在CommonStates.cpp构造函数中逐行排查,定位具体哪个渲染状态创建时触发空指针访问(如深度模板状态、光栅化状态等)。

内容的提问来源于stack exchange,提问作者P Dempsey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 04:54:52