XNA"游戏循环"的实际代码在哪里?

时间:2014-09-19 22:56:01

标签: xna

我是初学者,正在尝试学习C#XNA。我试图更深入地了解XNA游戏循环。

尽管有很多文章解释了游戏循环是什么,但我似乎无法在任何地方找到实际的循环实现。

我认为最接近寻找循环的是MSDN文档中游戏类的成员:

public void Tick ()

如果这是正确的,我在哪里可以找到此方法的内部实现,以查看它如何调用Update和Draw方法,或者这是不可能的?

2 个答案:

答案 0 :(得分:0)

Monogame是基于现代渲染管道的XNA的开源复制品,SharpDX.Toolkit为DX11实现了一个非常类似XNA的界面(Monogame实际上使用SharpDX进行DirectX集成)...你可能会发现来自其中任何一个项目的源代码中的游戏循环,如果与MS XNA实际使用的相同,它可能会接近。

话虽这么说,游戏循环实际上并没有为简单的演示应用程序做很多事情(它们倾向于在一个方法中堆积所有东西来更新/渲染一个简单的场景),尽管在基于组件的场景的完整游戏中图表可能会有点复杂。对于单线程引擎,一般的想法是:


    1. update the state of any inputs, 
    2. process any physics simulation if needed, 
    3. call update on all the updatable objects in 
       your scene graph (the engine I'm working on 
       uses interfaces to avoid making wasteful calls 
       on empty stub methods), 
    4. clear the working viewport/depth buffers, 
    5. call render on each renderable object to actually 
       get the GPU drawing on the back buffer. 
    6. swap the render buffers putting everything just 
       drawn to the back buffer up on screen, and making 
       the old viewport buffer the new back buffer to be 
       cleared and drawn on the next rendering pass.
    7. start over at step 1 :)

这几乎涵盖了基础知识,无论您使用的是什么底层API或引擎,都应该适用。

答案 1 :(得分:0)

由于XNA是封闭源代码,因此无法看到Game类中定义的游戏循环代码。您引用的Tick()在任何XNA文档中都没有公开或引用(尽管我可能不知道它可能在幕后使用)。

正如@Ascendion所指出的,MonoGame有一个等效的类,名为Game,请参见here。虽然这可能无法完全反映XNA代码,但它是我们公众可获得的最佳兼容性源(两者之间执行的所有测试均返回相同的值)。

MonoGame实现的主要副作用是平台无关的代码,由于某些实现代码位于其他文件中,因此可能难以理解。追溯源代码到预期的平台源代码并不难。

这篇文章是为了澄清所有以后可能会偶然发现的人。