MonoGame我需要使用Draw()-还是可以只使用Update()

时间:2019-12-07 00:12:58

标签: c# monogame

我是MonoGame的新手,我想知道为什么我需要将Draw和Update作为单独的函数调用。似乎有些效率低下,例如,在这两个函数中,我循环了1000个实体并调用update,为什么我不能只在该update函数中绘制而不是执行2个循环。

例如:

// more efficient - 1 loop
// In Update Function
foreach (var entity in entities) {
  entity.Update();
  entity.Draw();
}

// Less efficient - 2 loops over entities
// In Update Function
foreach (var entity in entities) entity.Update();

// In Draw Function
foreach (var entity in entities) entity.Draw();

我真的需要Draw函数吗?还是可以只在Update函数中绘制所有图纸?

1 个答案:

答案 0 :(得分:1)

是的,可以使用Draw()调用将更新与绘制分开,因为它们的发生频率较低,并且需要最大的优化。

例如,当游戏在后台运行时(即,单击窗口上的“ _”按钮),您可能希望游戏保持刷新率的一半运行(因此将跳过每个奇数帧)或只是使其不渲染任何东西,并通过最少的物理计算等使游戏在后台运行。

因此,在您的Game类的draw()调用过程中,您可能会检查窗口是否在后台运行,并决定跳过每个奇数帧上的绘图,就像这样:

if (!Game.IsActive && (someBoolean = !someBoolean))
{
    return;
}

someBoolean是一个布尔值,它将每帧从true切换到false,反之亦然,以确保在游戏窗口不活动时以半帧的速度运行

或者您可以直接使其处于不活动状态且没有多余的布尔值时不渲染/运行。

这是制作游戏的最佳实践之一,也是分离关注点的好方法,如果您使用普通Game.Components系统,则希望将draw()调用与update()分离呼叫以防止任何副作用。