图形诊断可帮助你在 DirectX 游戏和应用中调试呈现错误。
Visual Studio 2013 要求
若要在 Visual Studio 2013 中使用图形诊断,你必须拥有以下版本之一:
Visual Studio 2013 旗舰版
Visual Studio 2013 高级专业版
Visual Studio 2013 Professional
Visual Studio 2013 Express for Windows
备注
Visual Studio 2013 Express for Windows Desktop 不支持图形诊断功能。
操作系统和 SDK 要求
适用于 Windows 8.1的 Windows 软件开发包 (SDK) 安装图形诊断所需的运行时组件,并支持对 Windows 8.1和 Windows 8 的开发。 若要在 Windows 7 和 Windows Vista 上使用图形诊断,必须安装以下 SDK 之一:
Windows SDK(版本 7.1)
DirectX SDK(2010 年 6 月)
DirectX 版本兼容性
图形诊断支持使用 Direct3D 10、Direct3D 10.1、Direct3D 11、Direct3D 11.1 和 Direct3D 11.2 的应用,并对使用 Direct2D 的应用提供有限支持。 它不支持使用 Direct3D、DirectDraw 或其他图形 API 的更早版本的应用。
Windows 8.1 和 Direct3D 11.2
在 Windows 8.1 中,DirectX 11.2 介绍了一些新功能,包括对在其运行时期间捕获图形信息的支持。 Windows 8.1 以独占方式针对 Windows 8.1 支持的所有版本的 DirectX 使用基于运行时的新捕获(称为可靠捕获)。 可靠捕获还支持 Direct3D 11.2 的新功能。
Windows 8 和 Windows 7 支持
因为早期版本的 Windows 不支持 DirectX 11.2,因此可靠捕获在这些平台上不可用。 相反,在 Windows 8 或 Windows 7 上运行的应用使用以前的、基于迂回的捕获方法(称为旧版捕获)。 因为不必在 Windows 8.1 上支持它,所以已弃用旧版捕获;但是,它仍可用于支持在 Windows 8 或 Windows 7 上运行的应用。
有限的 Direct2D 支持
Direct2D 是以 Direct3D 为基础构建的用户模式 API,因此可以使用图形诊断帮助调试使用 Direct2D 的应用中的呈现问题。 不过,由于只记录基础 Direct3D 事件而非更高级别的 Direct2D 事件,Direct2D 事件不会显示在图形事件列表中。 此外,Direct2D 事件和生成的 Direct3D 事件之间的关系并非始终明确,因此使用图形诊断来调试使用 Direct2D 的应用中的呈现问题并不是直接方式。 但是,你仍可使用图形诊断来获取有关使用 Direct2D 的应用中低级别呈现问题的信息。
Visual Studio 2013 Update 3 中的用户界面更改
从 Visual Studio 2013 Update 3 开始,图形诊断工具窗口承载于 Visual Studio shell 的独立副本中,以减少在主 Visual Studio IDE 中争用有限空间的工具窗口数量。 现在承载于图形诊断程工具中的自定义 shell 被称为 Visual Studio 图形分析,它消除图形诊断不需要的菜单和选项,否则图形诊断工具和工作流将会和 Visual Studio 早期版本中的图形诊断工具类似。
二者存在两个重大差异:
当在图形诊断下运行应用时,Visual Studio 将不再显示图形日志文档的实时版本。 相反,Visual Studio提供了一个新的捕获接口。 以下是新的捕获接口的样子:
你可以将一个或多个帧从这个接口捕获到图形日志,并查看显示应用的帧速率的实时图形以及呈现每个帧所需的以毫秒为单位的时间。
你将无法在图形分析 shell 中编辑代码;如果在图形分析中打开用于编辑的代码,它将会在主 Visual Studio IDE 中打开并获得焦点。
此接口是在 Visual Studio 中看到的内容。 若要启动 Visual Studio 图形分析,请按照图像缩略图上面的帧...链接选择其中一个的帧,或双击该缩略图。
使用图形诊断调试呈现问题
对于图形丰富的应用程序,调试其中的呈现问题并不如启动调试器并逐句通过某些代码的方式直接。 在每个帧中,将生成数十万个唯一像素,每个像素都是根据一组复杂的状态、数据、参数和代码生成的,其中,可能只有少量像素会展示出你尝试诊断的问题。 生成每个像素的代码在并行处理数百个像素的专用硬件上执行,这使问题更加复杂。 传统调试工具和技术难以在包含少量线程的代码中使用,在处理大量数据时较为低效。
Visual Studio 中的图形诊断工具旨在通过启动指示问题的视觉效果,然后仅关注应用程序自有源代码中的相关着色器代码、管道阶段、绘图调用、资源和设备状态来进行反向跟踪,帮助你找到呈现问题。
下面提供了 Visual Studio 可帮助你解决的一些呈现问题。
设备状态
图形设备的正确配置非常重要,因为这可确定图形管道如何解释与每个图形调用关联的数据,以及图形调用输出的合并方式。 例如,如果设备状态指定顺时针顶点卷绕顺序,则指定逆时针顶点顺序的任何模型不会正确呈现。 因为源代码中的根本问题通常远离受影响的对象,所以设备状态问题可能很难诊断。 通过使用图形诊断,可以在呈现期间随时查看当前设备状态。未初始化或不正确的常量缓冲区和参数
图形应用使用常量缓冲区和参数将其他数据传递到一个或一组绘图调用。 例如,数据可以对不同对象指定不同位置或外观。 如果此数据未初始化或包含不正确的值,相应对象将错误呈现或不呈现。 这种问题很难诊断,因为并非总能明确问题发生在数据中还是使用数据的着色器代码中。 此外,还难以确定与错误对应的着色器、常量缓冲区和参数。 可以使用图形诊断确定应用到每个绘图调用的着色器、常量缓冲区和参数,并查看其中内容。着色器 Bug
无论代码是 C++ 还是高级着色器语言 (HLSL),在应用程序代码中出错几乎都是不可避免的。 但在传统上,调试 HLSL 代码更加困难,因为它不像 C++ 和其他语言那样具有丰富的调试支持。 图形诊断为 HLSL 提供了传统代码调试工具,因此你可以逐句通过代码、设置断点以及检查变量、参数和常量缓冲区的内容。
图形诊断的工作方式
要使用图形诊断,需要先记录有关应用程序如何在运行时使用 Direct3D API 的信息,然后检查记录的行为。 对于指定的帧,记录的信息包括 API 调用(例如清屏、绘制几何图形、调度计算着色器或更改图形设备状态的 API 调用)、API 调用的参数以及间接引用的缓冲区与对象的副本。 此外,与设置和初始化相关的 API 调用在任何帧呈现之前记录。 记录的信息将写入到图形日志 (.vsglog) 文件中。
可通过在开发计算机或者远程计算机或设备上播放图形事件来重新创建在图形日志中记录的呈现行为。 播放计算机可以是最初捕获图形日志的同一计算机或设备,也可以是不同计算机或设备。 对于大多数播放功能,播放计算机的图形硬件用于播放图形事件,但在使用 HLSL 调试器时,着色器代码始终通过使用 CPU 上的模拟 GPU 播放。 使用模拟 GPU 可以逐句通过着色器代码、检查变量和使用其他常见调试功能,而无论播放计算机中的图形硬件是否支持硬件调试。
备注
虽然图形日志在内部捕获大部分相关信息,但仍需要更多信息才能完全使用某些图形诊断功能。例如,若要完全利用图形调用堆栈功能,还必须具有程序数据库 (.pdb) 文件以及应用程序的源代码。若要调试 HLSL 着色器源代码,还必须具有着色器源代码。(如果着色器是通过 D3D11.1 着色器编译器来编译,并且调试信息已启用,则着色器源代码将在捕获期间嵌入到图形日志中。)
备注
因为某些 API 可能在早期版本的 Windows 或 DirectX 中不可用,因此对于捕获了这些 API 调用的图形日志,你无法在不支持它们的播放计算机上播放它们。
图形日志
图形日志包含从运行的 DirectX 图形应用程序中捕获的一个或多个帧。 图形日志是自包含日志,因此可在以后重新创建这些帧,并且无需外部信息或引用。 这意味着可以与其他开发人员共享图形日志、检查不同计算机上的问题以及检查旧图形日志(即使模型和纹理在开发过程中已更改)。 还可以同时加载多个图形日志 (.vsglog) 文件以比较数据和呈现结果。
打开图形日志 (vsglog) 文件
在 Visual Studio 中的菜单栏上,依次选择**“文件”、“打开”、“文件”。 此时将显示“打开文件”**对话框。
指定要打开的图形日志 (.vsglog) 文件,然后选择**“打开”**按钮。
备注
可以通过使用 Visual Studio 中的图形工具,从图形日志中提取和修改网格与纹理并保存其副本。不过,图形日志的内容不受这些修改的影响。有关这些图形工具的信息,请参阅为游戏和应用程序使用三维资产。
图形工具栏
通过图形工具栏,可以快速访问图形诊断命令和工具窗口。
选择**“启动诊断”按钮后,将在图形诊断下运行应用程序。 当应用程序在图形诊断下运行时,“捕获下一个呈现的帧”**按钮将启用,你可以使用其他按钮来查看不同的工具窗口。 有关如何在图形诊断下运行应用程序并捕获图形信息的详细信息,请参阅捕获图形信息。
图形诊断工具窗口
下图显示了用于检查和调试捕获的帧的典型工具窗口布局。 每个窗口均显示有关检查的已捕获帧、甚至此帧中单个像素的不同类别的信息。
使用图形日志文档窗口可以确定你感兴趣的呈现问题。
使用图形事件列表可以确定与呈现问题相关的事件。
使用“图形管道阶段”窗口可以确定先出现呈现问题的管道阶段。
使用图形事件调用堆栈可以找到与呈现问题相关的应用程序代码。
使用图形像素历史记录可以检查影响像素最终颜色的事件的详细信息。
使用图形对象表可以查看与呈现问题相关的对象的详细信息。
DirectX 控制面板
DirectX 控制面板是 DirectX 的一个组件,你可以使用此控制面板更改 DirectX 的行为方式,例如,可以启用 DirectX 运行时组件的调试版本、选择报告的调试消息类型,以及不允许使用某些图形硬件功能以模拟功能较少的硬件。 对 DirectX 的这一控制级别可帮助你调试和测试 DirectX 应用程序。 可以从 Visual Studio 访问 DirectX 控制面板。
打开 DirectX 控制面板
- 在菜单栏上,依次选择**“调试”、“图形”、“DirectX 控制面板”**。