14

我最近看了一点 Notch 的 Ludum Dare 直播。他在开发游戏时广泛使用 Eclipse 的热插拔功能。(这是我所指的视频http://www.twitch.tv/notch/b/302823358?t=86m30s

我想对 C# 和 XNA 做同样的事情。幸运的是,Visual Studio 具有“编辑并继续”功能。但是,我想在它运行时编辑我的渲染代码而不是暂停它。

我可以设置 Visual Studio 来做同样的事情吗?我注意到有一个复选框Break all processes when one process breaks。是否可以在另一个线程中设置我的渲染循环,以便在我进行更改时游戏继续渲染?

4

5 回答 5

16

更新:这个答案现在可以作为视频获得。


我一直在努力寻找一种方法来做到这一点。我知道这并不能回答您的确切问题。但实际上,您正在寻找的是一个工作流,您可以在其中以零(或接近零)延迟进行代码更改,我想我已经找到了最接近 Visual Studio 的方法。(因此避免了巨大的工程工作和处理“异常”项目)。

一旦你想到它,实现这个工作流程的方法实际上非常简单:

使用快捷键!

我想出的第一种方法是只使用设置断点的正常编辑和继续方法。只有使用键盘,您才能更快地做到这一点。这仅适用于循环调用的代码(例如:绘制/更新)。单击要修改的代码,添加F9断点F9F5

这很不错。您不必使用鼠标点击左侧栏中相对较小的“添加断点”目标。但它确实将输入焦点移动到了行首,因此您通常必须再次使用鼠标来修复它,然后才能开始编辑。

我想要更快的东西。所以我想出了一个更好的解决方案:

同样,使用键盘:按Ctrl+ Alt+Break到“全部中断”。这几乎立即进入调试器,无需担心设置断点或您要修改的代码是否在循环中运行。这会将编辑器窗口和插入符号焦点更改为执行中断的文档,但您可以通过按“向后导航”的Ctrl+立即修复它。-

然后,您可以进行编辑,只需按下F5即可查看它们的实际效果。您只需使用鼠标一次(或根本不使用鼠标)即可开始选择您想要开始输入的位置 - 正如您所期望的那样。

诚然Ctrl++和Alt+对于您希望能够非常快速地完成的事情来说是可怕的组合键。如果只有一个键可以按下会更好。BreakCtrl-

如果你有完整的 Visual Studio,你可以把它变成一个宏或加载项。Express 没有这些 - 所以你能做的最好的就是修改你的键绑定(工具、自定义、键盘......)并将其绑定到两个相邻的键,你可以快速连续按下。或使用外部宏实用程序。

就我个人而言,我已经通过设置为鼠标上的备用按钮的宏设置了要连续按下的两个组合键(您似乎不需要两者之间的延迟)。效果相当好 - 因为我通常同时选择文本。稍后我可能还会添加一个键盘宏。

到目前为止,我已经确定了这种方法的两个小缺陷:

  • 当您再次运行应用程序时,Visual Studio 会为其提供焦点。如果它保持专注就好了。在我的宏中添加鼠标左键是快速重新编辑代码的部分解决方案。
  • “向后导航”不保留文本选择,只保留插入符号位置。
于 2012-04-17T13:35:20.427 回答
7

我可以告诉你怎么做,但你不会喜欢它:

1)在 Visual Studio 实例中运行您的游戏可执行文件 ( game.exe --> vsInstanceA)

2)使用单独的 Visual Studio 实例 ( modifiable.dll --> vsInstanceB)在单独的 dll 中编码您的可修改代码

*请注意,这样做可以编译您的modifiable.dll,从而进行编译时错误检查等*

...现在是棘手的地方...

3a) game.exe需要引用modifiable.dll不是 .vcproj,实际的 dll

3b)当你按下“魔法键”(让game.exe寻找按键)时,让game.exe卸载modifiable.dll并重新加载它。您可以通过 mscorlib 中提供的 Assembly 和 AppDomain 类轻松完成此操作。当然,这意味着您需要卸载game.exe中的任何依赖系统。

请注意,在这 3b) 部分中有很多挥手的东西,这是相当多的工作,但非常简单(例如谷歌搜索:https://www.google.com/search?q=dynamic+load+dll+.净

......之后,你就可以走了......

3-alt)如果 3b) 不适合您,则有一些其他选择:

  • 当您按下“魔术键”时,您可以调用 msbuild.exe 来重建modifiable.dll
  • 您可以使用 CSharp 编译器 dll 动态重新编译每个类而不是整个modifiable.dll

但不幸的是,在我 10 多年的 .net 开发中,这是唯一的方法,除非有人创建了第三方产品来做到这一点(即:他们为你做了我提到的事情)

于 2011-12-26T07:25:05.610 回答
2

这可能不是您正在寻找的,但这是我一直在做的。只需在游戏运行时设置一个断点即可。停止后,您可以编辑内容,删除断点,然后按 F5 继续。

在大多数情况下,这允许您在游戏运行时编辑内容并在之后继续运行游戏,但这并不适用于所有情况。您不能添加或删除类级别的东西,也不能添加/删除整个函数或参数。大多数情况下,我这样做是为了测试每次更新都会受到影响的较小事物的不同数字和方程式。

于 2012-03-02T04:02:11.360 回答
0

要回答原始问题“在 Visual Studio 2010 中不暂停执行?”

不,对于 Java,有 JRebel 允许这样做。

我可以很快想象为什么微软没有这样做——如果你有某种委员会或一群人在设计东西——即使是一个人也很容易想出很好的论据来证明这种“动态软件更新”/热交换会中断。击落太容易了。或者如果他们继续使用它,它将通过一些全新的“企业框架”,需要大量的步骤、工作和理解才能到达任何地方,因为他们想将它用于复杂的在线场景。

我宁愿有一些简单的方法来做到这一点 - 我会承担风险,并提出很多免责声明,如果你想要与外部系统对话的热插拔服务,那么你需要使用那个复杂的框架或其他什么。

可以安全地以低风险使用它的最典型场景是对某种引擎进行原型设计和调整,有很多事情要发生,而且你可能不会总是遇到这个错误。在这种情况下,这样做可以节省数周的调试时间,至少在我的情况下是这样。

于 2015-05-02T03:44:08.740 回答
0

我习惯于使用 IntelliJ Idea + DCEVM(动态代码演化 VM)在 Java 中工作。

不幸的是,在 Microsoft C# 平台上,我没有发现任何更接近该配置的东西。这真的很糟糕,你无能为力。您可以使用一些用户定义的宏,但在不重新启动调试会话的情况下,您仍然无法在编辑并继续模式下做很多事情)。

但是,如果可以,请尝试使用最新的 .NET Core,它使用 Dotnet Watch 提供了更好的生产力。仍然不如 DCEVM 快,但比传统的 VS + .NET 热重载体验要好得多。详情在这里

于 2017-02-23T15:48:24.847 回答