Visual Studio中的使用C++的DirectX游戏开发

[原文发表地址] DirectX game development with C++ in Visual Studio
[原文作者] RongLu
[原文发表时间] 2017/4/11

充分利用C++的功能生成高端强大的DirectX游戏,并运行在不同的Windows家族设备上,包含桌面,平板和手机。在这篇博客中我们将深入到Visual Studio中C++的DirectX游戏开发中。首先我们看一下如何获取DirectX桌面和Universal Windows平台(UWP)开发的工具,然后我们将从一个内置的工程模板开始,包括编写DirectX游戏的C++代码和HLSL(高级渲染语言)渲染。然后我们将使用世界级的Visual Studio调试器和Visual Studio DirectX图形调试器和分析器来在代码中捕捉和修复问题。最后,我们来讨论下如何测试的你DirectX游戏和同你的团队成员一起使用Visual Studio。

安装Visual Studio的DirectX开发组件

首先,下载Visual Studio2017并启动Visual Studio 安装器。

为了创建DirectX桌面游戏,选择“移动和游戏”类别下的“使用C++游戏开发”工作负荷。这个工作负荷将提供生成DirectX桌面游戏的核心工具,包括Visual Studio核心编辑器,Visual C++编译器,Windows 通用 C 运行时和Visual Studio调试器。 1-install-vs2017

预选的组件是非常推荐的。其中有两个特别推荐的组件,其他的是可选组件它们对生成DirectX游戏都非常有用:

  • C++ 分析工具: 包含DirectX的图形诊断(a.k.a. Visual Studio 图形调试器)和一组对于内存,CPU和GPU的分析工具。默认选择的。
  • Windows 10 SDKs: 最新的Windows 10 SDK是默认选择的。
  • Windows 8.1 SDK和UCRT(通用C 运行时)SDK.
  • IncreditBuild: 从incredibuild.com安装IncreditBuild, 一个分布式计算的代码生成,数据生成和开发任务的解决方案。
  • Cocos:从cocos2d-x.org安装Cocos Creator, 生成Cocos2d游戏的编辑器。
  • Unreal Engine 安装器:从unrealengine.com安装Epic 游戏安装器, 你可以下载并安装Unreal引擎。

如果你还对可以运行在不同的Windows家族设备上生成UWP的DirectX游戏感兴趣的话,你可以通过选择“Windows”类别下的“通用 Windows 平台开发”工作负荷并且选择“C++ 通用 Windows平台工具”选项来安装。C++ UWP组件将添加核心的C++ UWP支持和3个分别使用了DirectX11和DirectX12的DirectX工程模板来使你快速开始。“图形调试和GPU分析”组件对于DirectX开发是强烈推荐的,因为它将带来在DirectX游戏中的DirectX图形调试的图形诊断功能和分析GPU和CPU使用率的GPU使用率功能。 2-install-uwp

入门指南

UWP的DirectX游戏

UWP组件带来3个DirectX工程模板。使用菜单项新建->工程打开新项目窗口,然后在右上角的搜索栏中键入“DirectX”找到DirectX的工程模板:DirectX11 应用, DirectX12 应用, DirectX11 和XAML 应用。选择一个模板并且点击OK。 3-templates

工程创建之后,你可以按F5来立马运行DirectX 应用,或者从菜单中点击调试-> 开始调试来运行。你应该会看到一个彩色的3D立方体在你的屏幕上旋转。

桌面的DirectX游戏

你可以通过创建项目对话框从创建Win32 项目来创建一个DirectX桌面应用程序,也可以从DirectX11 samplesDirectX12 samples下载例子作为起点。

使用强大的Visual Studio IDE编写C++代码

现在我们有一个最基本的3D应用程序在运行,是时候用C++添加一些游戏逻辑了。使用强大的Visual Studio生产功能,包含智能感应和代码导航来用C++编写你的游戏代码吧!

如下图所示的成员列表和快速信息,仅仅是Visual Studio提供的使代码编写更快捷的智能感应功能的两个例子。成员列表显示给你了一个类型或者命名空间中有效成员的列表。在C++代码中,在一个对象实例后面键入“->”,他将显示成员列表,你可以通过按TAB键,空格或者点号来插入你选择的成员到你的代码中。快速信息显示了在你的代码中对任何一个标识完整的声明。在下图中,Visual Studio显示了DX::DeviceResource对象的一个实例的成员列表和GetBackBufferRendererTargetView方法的声明,使得编写DirectX代码特别的容易。 4-editing

重构,自动填充,曲线提示,参考高亮,语法颜色化,代码片段是一些其他非常有用的提到生产率的功能,能够很大程度地帮助编写代码。

在庞大的代码集中导航和在不同多个代码文件中跳转是一项令人疲惫的工作。Visual Studio提供了非常多又好用的代码导航功能,包含跳到定义,跳到行/符号/成员/类型,找到所有参考,查看调用层级,对象浏览等等来提高你的生产力。

“速览定义”功能,如下图所示,把定义带到了目前代码文件中,允许查看和编辑代码而不需要从你正在编辑的代码上跳转出去。你可以右击打开快捷菜单找到”速览定义”或者使用快捷键Alt+F12. 在下图的例子中,Visual Studio带来了存在于d3d1.h文件中CreateInputLayout方法的定义作为内置窗口到当前的cpp文件中,使得阅读和编写DirectX代码更加的高效率。 5-navigation

编写和调试着色器

除了C++代码,编写着色器代码是创建DirectX游戏的另外一大块。Visual Studio着色编辑器识别HLSL,FX和其他类型的着色器文件,提供语法高亮和括号自动填充功能, 使得阅读和编写着色器代码更加地容易。从一个捕获的帧上面调试着色器代码是找出渲染问题的另一种有效途径。简单的在你的着色器代码上打一个断点并按F5调试它。你可以在Locals和Auto窗口中监测变量和表达式。学习更多内容请参见HLSL Shader Debugger6-shader

使用世界级的Visual Studio调试器调试C++代码

在代码中排除问题是特别耗时间的。使用Visual Studio调试器更快的找到问题并修复它。在你的C++代码中打一个断点并按F5启动调试器。当断点被击中,你可以在自动和监视窗口中检测变量和复杂表达式的值,同样也可以将鼠标悬停在上面查看数据提示,在堆栈窗口查看堆栈,非常容易的跳入和跳出函数。在如下图的例子中,自动窗口给我们显示出了在constant buffer中的数据和device resource对象实例每个成员的值,使得骤步通过DirectX代码更容易和高效。 7-debugging

但是这并不是Visual Studio调试器能做的所有工作。例如,编辑和继续功能允许你在调试会话中编辑你的代码并立马可以看到产生的效果而无需重新生成应用程序,节省了特别多的开发时间。

你可以在这篇博客C++ Debugging and Diagnostics中找到更多详情。

Visual Studio图形诊断

调试渲染问题

调试渲染问题非常棘手使人心烦意乱。包括是否是位置的偏移,颜色不正确,或者闪烁问题,Visual Studio 图形诊断,又叫Visual Studio图形调试器,提供了一个简单的方法可以从你的DirectX10,11或者12游戏中的本地或者远程捕获和分析帧。你可以检测每一个DirectX事件,图形对象,像素历史和图形管道来准确地理解在帧期间到底发生了什么。这个工具同时也捕获每个图形事件的堆栈,使得在Visual Studio中可以更容易地导航到你的C++代码中。学习更多请看Visual Studio Graphics Diagnostics

8-graphics-debugging

分析帧性能

如果你在为你的DirectX游戏寻找帧速率的方法,Visual Studio帧分析则是非常有用的。它通过分析捕获的帧来查看绘制调用消耗和实验探索,为优化性能提供了可行性。结果被显示在一份有用的报告中,你可以先保存然后后面再查看,或者分享给你团队的其他成员。更多如何使用这个工具的信息,请查看博客Visual Studio Graphics Frame Analysis in action!.

9-frame-analysis

分析GPU使用量

帧分析工具可以帮助我们指出高消耗的绘制调用,理解你的游戏如何在CPU和GPU上面实时工作也是非常重要的。Visual Studio GPU 使用量工具能够收集CPU和GPU的实时执行数据,它与帧分析执行在捕获帧在线下提供给你游戏性能的完整概括形成了互补。通过阅读GPU 使用量详细报告,你可以很容易地指出哪里出现了性能瓶颈,无论它是在CPU还是在GPU上面,帮助你定位到应用程序出问题的潜在的代码上。这GPU Usage tool in Visual Studio博客中包含了介绍这个共工具更详细的信息。 10-gpu-usage

单元测试

发布高质量的游戏需要好的测试。一个本地的C++单元测试框架随着Visual Studio一起发布了。你可以使用它来编写你的单元测试。在你的解决方案中点击新建-> 项目按钮并选择本地单元测试模板来添加一个新的单元测试工程。在创建的单元测试项目的unittest1.cpp文件中,找到TEST_METHOD(Test-Method1)开始添加你的测试逻辑代码。然后你可以通过点击菜单测试-> 窗口-> 测试管理器打开测试管理器窗口来运行你的测试。同样地,利用build-in代码覆盖工具(菜单测试-> 分析代码覆盖)来查看你的单元测试覆盖了你的多少代码。这给予了你发布高质量游戏的信心。 11-unit-testing

与你的团队成员合作

创建一个大型的游戏通常会有不止一个开发人员参与。当涉及到代码存储,分享和云生成这些问题时,Visual Studio Team Service可以提供你需要的这些。

简单的申请一个 Visual Studio Team Services 免费账号,然后你就可以把你的DirectX游戏源代码提交到Visual Studio Team Services中。随着你的代码成功的同步,你的团队成员里面的每一个人都可签出,修改或签入源代码,使得与其他团队成员合作更加高效。

Visual Studio Team Services也为你的游戏简化连续集成。创建和管理生成过程在云上自动的编译和测试你的游戏。想要在这个build上修一个缺陷?通过关联工作项到代码,工作项会随着代码更改和测试结果被列到build的概要中。 12-vsts

你可以在这篇博客中找到更多详细信息Visual Studio for Teams of C++ Developers.

尝试Visual Studio 2017 C++ 游戏开发

下载Visual Studio2017, 尝试它并分享你的反馈。如果有问题,请通过Visual Studio右上角的Report a Problem选项让我们知道。你可以在developer community portal.跟踪你的反馈。如果有建议,请通过UserVoice.让我们知道。