首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助优化代码

帮助优化代码
EN

Stack Overflow用户
提问于 2010-12-31 11:18:47
回答 5查看 235关注 0票数 0

我为我的2d应用程序编写了一个小粒子系统。这是雨点代码:

代码语言:javascript
复制
// HPP -----------------------------------
struct Data
{
    float x, y, x_speed, y_speed;
    int timeout;
    Data();
};        
std::vector<Data> mData;
bool mFirstTime;
void processDrops(float windPower, int i);

// CPP -----------------------------------
Data::Data()
    : x(rand()%ScreenResolutionX), y(0)
    , x_speed(0), y_speed(0), timeout(rand()%130)
{ }

void Rain::processDrops(float windPower, int i)
{
    int posX = rand() % mWindowWidth;

    mData[i].x = posX;

    mData[i].x_speed = WindPower*0.1; // WindPower is float
    mData[i].y_speed = Gravity*0.1;   // Gravity is 9.8 * 19.2

    // If that is first time, process drops randomly with window height
    if (mFirstTime)
    {
        mData[i].timeout = 0;
        mData[i].y = rand() % mWindowHeight;
    }
    else
    {
        mData[i].timeout = rand() % 130;
        mData[i].y = 0;
    }
}

void update(float windPower, float elapsed)
{
    // If this is first time - create array with new Data structure objects
    if (mFirstTime)
    {
        for (int i=0; i < mMaxObjects; ++i)
        {
            mData.push_back(Data());
            processDrops(windPower, i);
        }
        mFirstTime = false;
    }

    for (int i=0; i < mMaxObjects; i++)
    {
        // Sleep until uptime > 0 (To make drops fall with randomly timeout)
        if (mData[i].timeout > 0)
        {
            mData[i].timeout--;
        }
        else
        {
            // Find new x/y positions
            mData[i].x += mData[i].x_speed * elapsed;
            mData[i].y += mData[i].y_speed * elapsed;

            // Find new speeds
            mData[i].x_speed += windPower * elapsed;
            mData[i].y_speed += Gravity * elapsed;

            // Drawing here ...

            // If drop has been falled out of the screen
            if (mData[i].y > mWindowHeight) processDrops(windPower, i);
        }
    }
}

所以主要的想法是:我有一些结构,包括下降的位置,速度。我有一个函数,用于处理向量数组中某个索引处的下降。现在,如果这是第一次运行,我正在制作最大大小的数组,并在循环中处理它。

但这段代码的工作速度比我所有其他代码都慢。请帮我优化一下。

我试图将所有的int替换为uint16_t,但我认为这并不重要。

EN

回答 5

Stack Overflow用户

发布于 2010-12-31 11:58:36

int代替uint16_t不应该有任何不同(它将占用更少的内存,但不应该影响大多数机器上的运行时间)。

显示的代码看起来已经非常快了(它只做它需要做的事情,并且没有特殊的错误),我不知道如何进一步优化它(最多可以删除对mFirstTime的检查,但是这没有什么区别)。

如果是慢的话是因为别的原因。可能您有太多的下降,或者您的其余代码太慢,以至于update每秒被调用几次。

我建议你分析一下你的程序,看看你花的时间在哪里。

编辑

有一件事可以加速这样的算法,特别是如果你的系统没有一个FPU (!这不是个人计算机的情况),而是用整数替换浮点值。

只需将elapsed变量(以及您的常量,如0.1)乘以1000,这样它们将表示毫秒,并且在任何地方都只使用整数。

票数 1
EN

Stack Overflow用户

发布于 2010-12-31 12:17:10

以下几点:

  1. 物理是不正确的:风电应该随着风速变得接近风速而改变,而且为了简单起见,我假设x_speed的初始值是风速。
  2. --你根本不考虑随风的分数--所以下降的速度越来越快。但这取决于你想要建模。

  1. ,我会简单地假设下降在恒定的方向上失败,因为这确实是非常快发生的事情。

而且,您可以非常简单地优化所有这些,因为您不需要使用积分法求解运动方程,因为它可以非常简单地直接求解,如:

代码语言:javascript
复制
x(t):= x_0 + wind_speed * t
y(t):= y_0 - fall_speed * t

当重力等于摩擦力时,这是稳定下落的情况。

代码语言:javascript
复制
x(t):= x_0 + wind_speed * t;
y(t):= y_0 - 0.5 * g * t^2;

如果你想模拟下降的速度越来越快。

票数 1
EN

Stack Overflow用户

发布于 2010-12-31 13:47:05

很少有事情需要考虑:

在您的processDrops函数中,您传入了windPower,但是使用了某种类成员或名为WindPower的全局类成员,这是错误吗?如果Gravity的值没有变化,那么保存计算(即mult乘以0.1)并直接使用它。

update函数中,不要计算每次迭代的windPower * elapsedGravity * elapsed,而是在循环之前计算和保存,然后添加。另外,重新组织循环,没有必要做速度计算和渲染,如果拖放是在屏幕之外,首先进行检查,如果拖放仍然在屏幕上,然后更新速度和渲染!

有趣的是,你从来没有检查过它的x坐标是否脱离屏幕,你检查的高度,但不是宽度,你可以节省一些计算和渲染时间,如果你也这样做的话!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4569756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档