我最近看了一点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
有一个复选框。是否有可能在另一个线程中设置我的渲染循环,以便游戏在我进行更改时保持渲染?
更新:此答案现在以视频形式提供。
我一直在努力寻找一个方法来做到这一点。我知道这并不能回答你的问题。但你真正想要的是一个工作流,你可以在零(或接近零)延迟的情况下修改代码,我想我已经找到了用Visual Studio最接近的方法。(因此避免了巨大的工程努力和处理"不正常"的项目)。
实现这个工作流的方法实际上是惊人的简单,一旦你想到它:
使用快捷键!
我想到的第一种方法是使用设置断点的普通编辑并继续方法。只有使用键盘,你才能做得快得多。这只适用于在循环中调用的代码(例如:draw/update)。单击要修改的代码,添加一个断点(F9),断点几乎会立即被击中,修改代码,删除断点(F9),然后再次运行代码(F5)。
这很好。您不必使用鼠标点击左侧列中相对较小的"添加断点"目标。但它确实将输入焦点移到了行首,所以在开始编辑之前,通常必须再次使用鼠标来修复这个问题。
我想要更快的。所以我想到了一个更好的解决方案:
再次使用键盘:按Ctrl + Alt + Break"Break All"。这几乎立即进入调试器,而不必担心设置断点,或者您想要修改的代码是否在循环中运行。这将改变编辑器窗口,并将焦点插入到执行中断的文档,但你可以立即通过按Ctrl + -来修复它。
然后您可以进行编辑,只需按F5就可以看到它们的作用。你只需要使用鼠标一次(或者根本不用)来选择你想要开始打字的地方——就像你所期望的那样。
不可否认Ctrl + Alt + Break和Ctrl + -是可怕的键组合,你想要能够做的事情非常快。如果只有一个键可以按就更好了。
如果你有完整的Visual Studio,你可能会把它变成一个宏或外接程序。Express没有这些——所以你能做的最好的就是修改你的键绑定(工具,自定义,键盘…),并将它绑定到两个相邻的键,你可以快速连续按下。或者使用外部宏实用程序。
就我个人而言,我已经设置了两个键组合连续按下(你似乎不需要两者之间的延迟)通过宏设置到我的鼠标上的备用按钮。这工作得相当好-因为我通常在同一时间选择文本。我以后可能也会添加一个键盘宏。
到目前为止,我已经确定了该方法的两个小缺陷:- 当你再次运行应用程序时,Visual Studio会给它焦点。如果能集中注意力就好了。在宏中添加鼠标左键是快速重新编辑代码的部分解决方案。
- "向后导航"不保留文本选择,只保留插入符号位置。
我可以告诉你怎么做,但你不会喜欢的:
1)在visual studio实例中运行你的游戏可执行文件(game.exe -> vsInstanceA)
2)在单独的dll中编写可修改的代码,使用单独的visual studio实例(modifiable.dll -> vsInstanceB)
*注意,这样做可以让你编译你的modifiable.dll,从而进行编译时错误检查等。*
…
3a) game.exe需要引用 modifyable .dll。不是.vcproj,是实际的dll
3b)当你点击一个"魔法键"(有game.exe寻找一个按键),有game.exe卸载modifiable.dll,并重新加载它。您可以通过mscorlib中提供的Assembly和AppDomain类轻松地做到这一点。当然,这意味着您需要卸载game.exe中的任何依赖系统。
注意,在这个部分有很多手工操作,这是相当多的工作,但非常直接(例如Google搜索:https://www.google.com/search?q=dynamic+load+dll+.net)
…然后,你就可以走了。
3-alt)如果3b)不适合您,请选择其他选项:
- 你可以调用msbuild.exe来重建 modimodiable .dll当你按下"magic key"
- 你可以使用CSharp编译器的动态dll重新编译每个类,而不是整个 modifyable .dll
但不幸的是,在我10多年的。net开发中,这是唯一的方法,除非有人创建了第三方产品来做到这一点(即:他们做了我提到的,为你)
这可能不是你想要的,但这是我一直在做的。只要在游戏运行时设置断点即可。一旦停止,你可以编辑东西,删除断点,然后按F5继续。
在大多数情况下,这允许你在游戏运行时编辑内容并在之后继续运行游戏,但它并不适用于所有内容。你不能添加或删除类级别的东西,也不能添加/删除整个函数或参数。大多数情况下,我这样做是为了测试每次更新都会遇到的较小内容的不同数字和方程式。
回答原来的问题"在Visual Studio 2010中不暂停执行?"
。对于Java,有JRebel允许这样做。
我很快就能想象为什么微软没有这样做——如果你有一些委员会或一群人在设计东西——即使是一个人也很容易提出很好的论点,认为这种"动态软件更新"/热交换将会中断。它很容易被击落。或者,如果他们继续使用它,它将通过一些全新的"企业框架",需要大量的步骤,工作和理解才能到达任何地方,因为他们想把它用于复杂的在线场景。
我更希望有一些简单的方法来做到这一点——我会承担风险,并提出很多免责声明,如果你想要与外部系统通信的热插拔服务,那么你需要使用复杂的框架或其他什么。
最典型的情况是,这可以安全地以低风险使用原型和调整某种引擎,无论是高启动成本或更有可能,研究行为,如果在引擎中运行的东西(如规则)是错误的,并展示错误,很多事情必须发生,你可能不会总是遇到错误。在这种情况下,这样做可以节省数周的调试时间,至少在我的情况下是这样。
我习惯使用IntelliJ Idea + DCEVM(动态代码进化VM)在Java中工作。
不幸的是,我在微软c#平台上没有找到任何更接近这个配置的东西。这真的很糟糕,你也无能为力。你可以使用一些用户定义的宏,但是在编辑和继续模式下,如果不重新启动调试会话,你仍然不能做很多事情。
但是,如果可以的话,尝试使用最新的。net Core,它使用Dotnet Watch提供了更好的生产力。仍然没有DCEVM那么快,但比传统的VS + . net热加载体验要好得多。细节。