我是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函数中绘制所有图纸?
答案 0 :(得分:1)
是的,可以使用Draw()调用将更新与绘制分开,因为它们的发生频率较低,并且需要最大的优化。
例如,当游戏在后台运行时(即,单击窗口上的“ _”按钮),您可能希望游戏保持刷新率的一半运行(因此将跳过每个奇数帧)或只是使其不渲染任何东西,并通过最少的物理计算等使游戏在后台运行。
因此,在您的Game类的draw()
调用过程中,您可能会检查窗口是否在后台运行,并决定跳过每个奇数帧上的绘图,就像这样:
if (!Game.IsActive && (someBoolean = !someBoolean))
{
return;
}
someBoolean
是一个布尔值,它将每帧从true
切换到false
,反之亦然,以确保在游戏窗口不活动时以半帧的速度运行
或者您可以直接使其处于不活动状态且没有多余的布尔值时不渲染/运行。
这是制作游戏的最佳实践之一,也是分离关注点的好方法,如果您使用普通Game.Components
系统,则希望将draw()调用与update()分离呼叫以防止任何副作用。