DirectX9与Windows UAC问题:如何修复游戏地面失真?
问题:UAC触发后游戏背景画面失真
我正在基于现成资源开发游戏提升技术,现在碰到个棘手问题:游戏刚启动时一切正常,但只要有程序触发Windows用户账户控制(UAC)界面,游戏背景就会失真。我是新手,求易懂的解决办法。
初始状态:
触发UAC后:
相关代码片段
第一部分代码
if (FAILED(hr = ms_lpd3dDevice->TestCooperativeLevel())) { if (D3DERR_DEVICELOST == hr) return DEVICESTATE_BROKEN; if (D3DERR_DEVICENOTRESET == hr) return DEVICESTATE_NEEDS_RESET; return DEVICESTATE_BROKEN; }
触发的代码分支
case CGraphicDevice::DEVICESTATE_NEEDS_RESET: m_pyBackground.ReleaseCharacterShadowTexture(); CRenderTargetManager::Instance().ReleaseRenderTargetTextures(); Trace("DEVICESTATE_NEEDS_RESET - attempting"); if (!m_grpDevice.Reset()) { return DEVICE_STATE_SKIP; } CRenderTargetManager::Instance().CreateRenderTargetTextures(); m_pyBackground.CreateCharacterShadowTexture(); break;
解决方案
这个问题本质是UAC弹窗导致Direct3D设备失去焦点,触发了设备重置流程,但你的重置代码只处理了阴影纹理和渲染目标纹理,漏掉了背景的主纹理,所以背景画面才会失真。按下面步骤修改即可:
- 在
DEVICESTATE_NEEDS_RESET分支的重置设备前,先释放背景的主纹理(函数名根据你的资源管理代码调整,比如m_pyBackground.ReleaseMainTexture()) - 设备重置成功后,重新创建或加载背景的主纹理(比如
m_pyBackground.CreateMainTexture()) - 额外检查:确保所有自定义纹理、着色器等资源,在设备重置时都做了「释放-重置后重建」的操作,不能只处理部分资源
修改后的代码示例:
case CGraphicDevice::DEVICESTATE_NEEDS_RESET: // 新增:释放背景主纹理 m_pyBackground.ReleaseMainTexture(); // 原有代码 m_pyBackground.ReleaseCharacterShadowTexture(); CRenderTargetManager::Instance().ReleaseRenderTargetTextures(); Trace("DEVICESTATE_NEEDS_RESET - attempting"); if (!m_grpDevice.Reset()) { return DEVICE_STATE_SKIP; } // 原有代码 CRenderTargetManager::Instance().CreateRenderTargetTextures(); m_pyBackground.CreateCharacterShadowTexture(); // 新增:重建背景主纹理 m_pyBackground.CreateMainTexture(); break;
新手额外注意点:
- 确认你的纹理管理类中,
ReleaseXXX和CreateXXX是成对的,释放时要彻底清理COM对象,创建时要重新从文件/内存加载资源 - 如果后续发现其他UI、场景纹理也出现类似问题,同样要把它们加入重置流程的释放和重建步骤
内容的提问来源于stack exchange,提问作者cvaqabond
相关产品推荐
相关产品推荐

