我正在使用GameMaker Studio,您可以将其视为一个巨大的循环。
我使用计数器变量step
来跟踪它是什么帧。
为了提高效率,我只想在每个第X步中运行一些代码。
if step mod 60 {
}
将每60步运行一次该块(或以60 fps的速度运行1秒钟)。
我的理解是模数是一项繁重的操作,但我想通过数千个步骤可以使计算失控。有没有更有效的方法可以做到这一点?
也许涉及按位运算符?
我知道这可以适用于所有其他框架:
// Declare
counter = 0
// Step
counter = (counter + 1) & 1
if counter {
}
还是即使在数量众多时,模量对60FPS的性能影响也可以忽略不计?
在本质上:
i := 0
WHILE i < n/4
do rest of stuff × 4
do stuff that you want to do one time in four
Increment i
Do rest of stuff i%4 times
这种取模数并根据其进行切换的变量称为Duff's Device。哪个更快取决于您的体系结构:在许多RISC芯片上,mod在单个时钟周期内执行,但是在其他CPU上,整数除法甚至可能不是本机指令。
如果您本身没有循环计数器,例如由于它是一个事件循环,则可以始终在执行代码的if块中制作一个并每四次重置一次:
i := 1
WHILE you loop
do other stuff
if i == 4
do stuff
i := 1
else
i := i + 1
这是一个示例,其中一件事要做两次,三件事要做一次:
WHILE looping
do stuff
do stuff a second time
do stuff B
do stuff a third time
do stuff C
do stuff a fourth time
do stuff B
do stuff a fifth time
do stuff a sixth time
do stuff B
do stiff C
请注意,您所做的工作可以包括一次调用事件循环。
由于这样做可能很麻烦,因此您可以使用模板元编程以C ++的形式为您编写这些循环,如下所示:
constexpr unsigned a = 5, b = 7, LCM_A_B = 35;
template<unsigned N>
inline void do_stuff(void)
{
do_stuff_always();
if (N%a)
do_stuff_a(); // Since N is a compile-time constant, the compiler does not have to check this at runtime!
if (N%b)
do_stuff_b();
do_stuff<N-1>();
}
template<>
inline void do_stuff<1U>(void)
{
do_stuff_always();
}
while (sentinel)
do_stuff<LCM_A_B>();
但是,通常来说,如果您想知道您的优化是否有帮助,请介绍一下。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句