Help with code optimization

Posted by Ockonal on Stack Overflow See other posts from Stack Overflow or by Ockonal
Published on 2010-12-31T11:18:47Z Indexed on 2010/12/31 13:54 UTC
Read the original article Hit count: 192

Filed under:
|
|

Hello, I've written a little particle system for my 2d-application. Here is raining code:

// 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);
        }
    }
}

So the main idea is: I have some structure which consist of drop position, speed. I have a function for processing drops at some index in the vector-array. Now if that's first time of running I'm making array with max size and process it in cycle.

But this code works slower that all another I have. Please, help me to optimize it.

I tried to replace all int with uint16_t but I think it doesn't matter.

© Stack Overflow or respective owner

Related posts about c++

Related posts about optimization