【发布时间】:2010-12-31 22:14:23
【问题描述】:
我为我的二维应用程序编写了一个小粒子系统。这是下雨的代码:
// 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 但我认为没关系。
【问题讨论】:
-
可能超时没那么高效,但是不知道“update()”函数是怎么调用的
-
@Cristy 我不知道如何让水滴随不同时间移动。
-
@Cristy,更新函数调用每帧更新(例如~17 ms)
-
也许为每一滴做不同的速度:),brb午餐时间:D
-
您没有说要模拟多少雨滴,但假设这是合理的,那么唯一会超过 17 毫秒窗口的代码就是您省略的绘图代码。另外,也许代码运行正常,但雨滴的速度很慢?最好剖析一下,看看瓶颈在哪里。
标签: c++ optimization