我正在做一个程序。但是,与其使用大量后台工作人员和线程来更新 UI,我可以改用 XNA 吗?它是一个应用程序,因此不会部署到 Xbox。
我了解不使用 WinForms 和 WPF 控件的局限性,但这不会成为问题,因为我可以快速编写我需要的唯一控件,即滑块。
您的问题有点不清楚,但希望这可以回答:
是的,您绝对可以使用 XNA。在没有 Game 类的情况下这样做有点烦人,因为使用 XNA 的内容系统加载图形资产需要了解图形设备(这一切都隐藏在 Game 的实现下)。基本上你必须实现你自己的 IServiceProvider(几乎只是一个类型到对象的字典),XNA 的内容系统将使用它来获取 IGraphicsDeviceService,你还必须在任何管理你的图形的对象上实现它(我们称之为 GrahpicsManager,真正的原始:P)。在 GraphicsManager 上,您只需创建一个 PresentationParameters 对象,填写您要设置的所有参数(包括您的窗口或控件句柄和大小),然后使用它来创建一个 GraphicsDevice。
这是我自己的 IServiceProvider 实现(您基本上只是实例化其中一个并在任何地方共享它):
创建 IGraphicsDeviceService 后,请确保将其添加到该服务提供商。我还削减了图形服务的实现,以便您查看。请注意,您需要添加自己的实际使用 GraphicsDevice 的 Draw 方法,并在最后调用 GraphicsDevice.Present。
请参阅第 36 行了解我将自己添加到服务容器的位置,以及第 73 行了解我设置图形设备的位置(请注意,设置需要一个 IntPtr 作为它将绘制到的窗口句柄)。
您实际上也可以使用 Game 来制作应用程序,但这很烦人,因为 Game 接管了您的主循环(通常这意味着您必须自己负责在 Update 中推送 Windows 消息泵,我已经尝试过了,它很烂)。
无论如何,希望能回答你的问题!
虽然 Xna 主要用于游戏,但我相信您可以将其用于应用程序,如果您真的想要大量图形和其他可以在游戏中找到的东西。我没有对音频进行太多尝试,但我相信有一些方法可以为您的 dj 应用程序“混合”它。尝试一下,看看它是否符合您的期望。如果您需要的不仅仅是滑块,您还可以使用 Neoforce Controls (http://neoforce.codeplex.com/) 轻松创建其他控件。
对于 DJ 应用程序,我不建议使用 XNA。它的音频支持非常有限,并且在尝试向后播放曲目等时会出现问题。此外,如果没有正确预加载,加载资产(音频文件)可能需要一些时间,我认为这对于一个体面的 DJ 库来说会很复杂。
您可能必须使用背景库进行音频管理和播放,但我不确定这有多容易。考虑到 XNA 在访问音频子系统时施加的限制,我还认为加载和播放外部音频文件可能是一个挑战。