gpt4 book ai didi

performance - 每 X 次迭代跳过代码的有效方法?

转载 作者:行者123 更新时间:2023-12-04 02:56:19 25 4
gpt4 key购买 nike

我正在使用 GameMaker Studio,您可以将其视为一个巨大的循环。

我使用计数器变量step来跟踪它是什么帧。

为了提高效率,我只想每 X 步运行一些代码。

if step mod 60 {

}

每 60 步运行该 block (或以 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

它的变体采用模数并基于模数进行切换,称为达夫装置。哪个更快取决于您的架构:在许多 RISC 芯片上,mod 在单个时钟周期内执行,但在其他 CPU 上,整数除法甚至可能不是 native 指令。

如果您本身没有循环计数器,因为它是一个事件循环,您始终可以创建一个并在执行代码的 if block 中每四次重置它:

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>();

不过,一般来说,如果您想知道您的优化是否有帮助,请进行分析。

关于performance - 每 X 次迭代跳过代码的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32914536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com