【问题标题】:Why does my background flicker through my meshes in DirectX 12 Release build?为什么我的背景在 DirectX 12 Release 版本中闪烁通过我的网格?
【发布时间】:2023-03-13 20:45:01
【问题描述】:

我一直在使用 DirectX 12 在 Visual Studio 中用 C++ 开发这款游戏。我在开发过程中使用了 Debug 构建配置,并且图形非常流畅。

当我准备在 Windows Store 上发布游戏以便与作为游戏测试员的朋友分享时,我切换到了发布构建配置。一旦我这样做了,我就开始通过我的墙壁网格看到背景颜色的闪烁。

Here is a short video 显示闪烁。 Here is a longer video 是我在切换到 Release 构建配置之前创建的,显示没有闪烁。

我是 DirectX 12 的新手。这个项目是我的老师。我研究了微软的Direct3D 12 Graphics,我研究了Visual Studio中的DirectX 12模板。 我很高兴能够像我一样掌握 DirectX 12 来制作这款游戏​​。然后是Release的东西,还有flicker的东西,我很茫然。

这可能是着色器问题吗?还是命令队列问题?还是质地问题?还是别的什么?

【问题讨论】:

  • 可能是很多事情。你的通用背景颜色是黄色的吗?否则它可能与法线有关。可能顶点被向后解释。调试版本和发布版本之间有什么变化?
  • @Slipoch,是的,通用背景颜色是黄色。我把视频设为黄色,这样它会脱颖而出。 Debug 版本和 Release 版本之间的唯一显着区别在于 vcxproj 文件,Debug 部分有 <UseDebugLibraries>true</UseDebugLibraries><UseDotNetNativeToolchain>false</UseDotNetNativeToolchain>,Release 部分有 <UseDebugLibraries>false</UseDebugLibraries><UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
  • 只有显着差异?所以如果你把这两行改回来,闪烁就会消失吗?
  • 我只是做了一些测试,结果我弄错了。 <UseDotNetNativeToolchain> 没有任何效果,但 <UseDebugLibraries> 是与众不同的。这只是一行,但那一行告诉编译器使用一组完全不同的库,不是吗?
  • 是的,正如 Chuck 下面所说的,这可能是一个时间问题,调试库可能正在使用低刷新率,发布库可能正在尝试使用更高的刷新率。比特消失的区域是否一致?即:当您从某个角度看它们时,它们不再存在。它总是相同的位置吗?

标签: c++ visual-studio-2015 directx-12


【解决方案1】:

DirectX 12 是为图形专家设计的 API,与 Direct3D 11 相比,它提供了大量的应用程序控制。控制的代价是应用程序开发人员有责任让一切正确 ,确保它在广泛的硬件上工作,并自行可靠地处理压力场景和错误情况。

您可以通过多种方式在 DirectX 12 中获得“闪烁”效果。一种常见的方法是在调用 Draw 和调用实际绘制在 GPU 上完成,这通常会在几帧之后发生。这种同步是正确使用 API 的关键挑战。有关示例解决方案,请参阅 DirectX Tool Kit for DirectX 12 中的 GraphicsMemory

如果您是 DirectX 开发新手,我强烈建议您从 DirectX 11 开始。它的功能基本相同,但需要处理缓冲区重命名、资源障碍、栅栏、VRAM 过度使用等。

【讨论】:

  • 如果这是问题所在,调试库和发布库不会出现这种情况吗?
  • 可能有时间相关问题,也可能没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多