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

问题描述 投票:-1回答:2

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

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

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

public void Tick ()

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

xna
2个回答
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或引擎,都应该适用。


0
投票

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

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

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

这篇文章将作为对所有可能在以后偶然发现的人的澄清。

© www.soinside.com 2019 - 2024. All rights reserved.