Visual Studio 11开发指南(11)Visual Studio 11调试游戏
最后更新于:2022-04-01 10:27:13
3D游戏的在新设备(智能手机,平板电脑)上呈现一个巨大的机会,为开发人员。用于访问底层的图形硬件,在 Windows 上全部的力量的主 API 是DirectX 11 (包括Direct3D和Direct2D).
Visual Studio 11 最重要创新之一是一系列的工具帮助开发 Direct3D 游戏。
在 Visual Studio 中的新图形调试器是捕获从 Direct3D 应用程序的详细的信息,如执行调试和分析工具。可以使用它:
- 捕获呈现的帧,后来的检验和分析。
- 查看 DirectX 事件和其对应用程序的影响。
- 之前和之后顶点着色器转换,请查看 3D 网格。
- 发现哪个 DirectX 事件作出贡献的一个特定的像素的颜色。
- 直接跳转到特定的 DirectX 调用的源代码中的位置
假设解决一个简单的问题,一步一步使用图形调试器。这是一个旋转的模游戏。这里是它应该是什么样子。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14df031a.png "")
然而,当运行应用程序时找出模具不在游戏中呈现。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14e12ad8.png "")
若要开始调试此游戏,右键单击该项目在解决方案资源管理器中,在"启用图形捕获"中设置为"是"调试节点。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14e283f2.png "")
现在,F5 启动调试您的应用程序,注意到这个游戏现在有一些基本的统计数据,在左上角显示。这表明 VS 是准备捕获从游戏要调查呈现问题的诊断信息.
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14e49c2b.png "")
为了捕获的帧,只需点击"打印屏幕"的关键。可以重复此步骤 ;每个帧将显示在 Visual Studio 中作为"图形 Experiment.vsglog"文件的一部分。日志文件包含为您呈现问题的调试所需的所有信息。默认情况下的该文件位于在一个临时位置,但您可以选择保存该文件,并与其他开发人员共享它。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14e5df51.png "")
进一步挖到什么正在通过分析在 Visual Studio 中的捕获的帧。若要理解这一点更好想知道什么了绘制时,称为"DrawIndexed"的 API的代码。
若要检查"DrawIndexed"调用框架的缩略图上右键单击,然后从上下文菜单中调出事件列表窗口中选择"事件列表"。
图形事件列表窗口列出了所有由运行在 VS 调试器下的程序捕获的 DirectX 事件。它还模拟图形调试器,重新使用相同的输入所使用的正在运行的程序的命令下的事件。在搜索框,可以键入要筛选列表以显示"画"DirectX 绘制调用。通过绘制调用,将能够看到 (右侧) 框架窗口中单击该框架绘制化零为整的方式。
在此窗口类型"画"中的搜索框中,这将筛选以显示游戏所作的画调用列表。选择"DrawIndexed"调用事件列表,检查在框架窗口中呈现的东西。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14e7c3dc.png "")](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fblogs.msdn.com%2Fcfs-file.ashx%2F__key%2Fcommunityserver-blogs-components-weblogfiles%2F00-00-00-65-69-metablogapi%2F6215.image18_5F00_6CB3C2AC.png)
不幸的是在此情况下,正如上面什么被呈现,因此要继续我们的调试过程。 (DrawIndexed) 提交渲染管线的工作。所以来检查看看是否东西被提交的"DrawIndexed"作为渲染管线的调用。为了看看发生了什么事图形管道中绘制调用被执行时,用鼠标右键单击事件列表中的调用和造就管道查看器通过从上下文菜单中选择"查看器管道"。
图形管道查看器显示图形管道和这些阶段如何修改模型中的过程的不同阶段。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14e9b355.png "")](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fblogs.msdn.com%2Fcfs-file.ashx%2F__key%2Fcommunityserver-blogs-components-weblogfiles%2F00-00-00-65-69-metablogapi%2F3678.image21_5F00_3815F722.png)
查看器显示四种不同视图的网格的数据 ;它们对应于在管道中的四个不同阶段
<table style="WIDTH: 100%" border="1" cellspacing="0" cellpadding="2"><tbody><tr><td valign="top" width="30%"><strong lang="zh-CHS">视图</strong></td><td valign="top" width="70%"><strong lang="zh-CHS">说明</strong></td></tr><tr><td lang="zh-CHS" valign="top">Pre-Vertex 着色器</td><td valign="top">查看网格顶点之前顶点着色器。相机被指向该对象的中心。</td></tr><tr><td lang="zh-CHS" valign="top">开机自检顶点着色器</td><td valign="top">顶点着色器后查看网格顶点。相机被指向该对象的中心。</td></tr><tr><td valign="top">几何着色器<br/>(不视为在此示例中不使用)</td><td valign="top">查看网格顶点着色器几何后。相机被指向该对象的中心。如果没有指定的几何着色器,此视图为空 (固体的浅灰色阴影)。</td></tr><tr><td lang="zh-CHS" valign="top">视图端口</td><td valign="top">查看网格顶点的屏幕空间。相机设置了相机在目标程序相同。</td></tr></tbody></table>
注意有图形管道中没有代表在此视图中的其他阶段。更多的新的图形上管道在 DirectX 11 。
可以看到的东西正在绘制的图形管线视图中,看起来像应用程序想要呈现的模具。似乎从上图的"死"(多维数据集) 的结构正在通过图形管道正确指示着色器是否工作正常 。
此时,需要继续调试,其它地方看一看。这可能是像素被覆盖或丢弃。要验证这一假设需要去看看像素 (模具是应该要呈现) 框架的中心。帧缓冲区窗口中单击中心首先选择一个像素然后右击并从上下文菜单中选择"像素历史"。
图形像素史窗口显示当前帧中的选定像素的颜色作出贡献的活动。它包含有关如何修改像素了 DirectX 像素历史记录窗口中的每个事件的信息。这包括初始帧缓冲区状态,其次是中间画事件的呈现和最终的结果。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14ebcef2.png "")](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fblogs.msdn.com%2Fcfs-file.ashx%2F__key%2Fcommunityserver-blogs-components-weblogfiles%2F00-00-00-65-69-metablogapi%2F4263.image24_5F00_0DCBE0A9.png)
帧缓冲区像素颜色是蓝色,,然后像素着色器的像素应用一种不同的颜色 (灰色) 时,可以看到从"像素历史记录"窗口。但是,仍然蓝色最终颜色。不是在所有应用正在呈现所需的像素颜色。这是混合状态设置可能不正确的指示。如何混合了组合时的颜色和 alpha 值的混合状态控件呈现数据与现有呈现目标数据。要检查的混合状态,右键单击像素,并从上下文菜单中选择"对象列表"。这将弹出"图形对象表"窗口。
图形对象表显示 Direct3D 对象创建的目标程序。可以通过单击表中的对象上的双查看任何包含状态信息的对象。
排序对象表 (按"类型"),然后滚动到列表中的"D3D11 混合状态"对象。双击"D3D11 混合状态"对象将最低有效 (不无)"使用时代"。"使用时代"帮助的范围调查于所选对象绘制调用,使用年龄降低很多有关。双击与使用情况的最低年龄的混合状态对象,将打开一个文档内 Visual Studio 的对象的详细信息。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14edee38.png "")](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fblogs.msdn.com%2Fcfs-file.ashx%2F__key%2Fcommunityserver-blogs-components-weblogfiles%2F00-00-00-65-69-metablogapi%2F0363.image27_5F00_45A0B57D.png)
从上面的图片,可以看到:
Blend Source = D3D11_BLEND_ZERO; //Source 表示像素着色器的混合上执行操作的彩色输出
Blend Destination = D3D11_BLEND_ONE; //Destination 代表的混合执行操作的框架的颜色
Blend Op = D3D11_BLEND_ADD; //Blend 操作执行的源和目标。
可以看到从这源的混合状态被遮罩,因为它被设置为零 (D3D11_BLEND_ZERO) 和目标的混合状态设置为 1 (D3D11_BLEND_ONE)。这将导致的背景色来出作为主色后混合,因此我们没有看到正在呈现的模具。这样的像素着色器输出是主输出的混合操作,应切换值。
Blend Source = D3D11_BLEND_ONE;
Blend Destination = D3D11_BLEND_ZERO;
Blend Op = D3D11_BLEND_ADD;
可以返回到事件列表窗口并筛选寻找"blendstate",因为事件列表中列出了所有的 DirectX 事件已捕获帧的时期发生的事件列表中,找出混合状态被设置的位置。一旦您筛选,您可以看到"OMSetBlendState"的呼吁。调用,将混合状态设置为"OMSetBlendState"。获取源代码凡正在作出此调用,右键单击"OMSetBlendState"调用,并从上下文菜单中会出现"图形调用堆栈"窗口中选择"调用堆栈"
图形事件调用堆栈窗口联系正在调试的 c + + 源代码的 DirectX 事件。
双击第一个调用调用堆栈中,它将您带到"OMSetBlendState"在代码中调用。几行上方的"OMBlendState"调用,会注意到设置的源和目标位置混合值的代码行。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14f0be00.png "")](http://www.microsofttranslator.com/bv.aspx?from=&to=zh-CHS&a=http%3A%2F%2Fblogs.msdn.com%2Fcfs-file.ashx%2F__key%2Fcommunityserver-blogs-components-weblogfiles%2F00-00-00-65-69-metablogapi%2F0044.image_5F00_2E753AFF.png)
切换通过更改以反映以下代码:
blenddesc.RenderTarget[0].SrcBlend=D3D11_BLEND_ONE;
blenddesc.RenderTarget[0].DestBlend=D3D11_BLEND_ZERO;
生成并运行。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14df031a.png "")
游戏开发并不容易,工具可帮助您使基础 DirectX 平台的使用。在此版本中,将这种新型的诊断经验带入 Visual Studio11。
赶紧下载VS11体验吧
[http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144](http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144)