我为我的2d应用程序编写了一个小粒子系统。这是雨点代码:
// 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,但我认为这并不重要。
发布于 2010-12-31 11:58:36
用int代替uint16_t不应该有任何不同(它将占用更少的内存,但不应该影响大多数机器上的运行时间)。
显示的代码看起来已经非常快了(它只做它需要做的事情,并且没有特殊的错误),我不知道如何进一步优化它(最多可以删除对mFirstTime的检查,但是这没有什么区别)。
如果是慢的话是因为别的原因。可能您有太多的下降,或者您的其余代码太慢,以至于update每秒被调用几次。
我建议你分析一下你的程序,看看你花的时间在哪里。
编辑
有一件事可以加速这样的算法,特别是如果你的系统没有一个FPU (!这不是个人计算机的情况),而是用整数替换浮点值。
只需将elapsed变量(以及您的常量,如0.1)乘以1000,这样它们将表示毫秒,并且在任何地方都只使用整数。
发布于 2010-12-31 12:17:10
以下几点:
,
而且,您可以非常简单地优化所有这些,因为您不需要使用积分法求解运动方程,因为它可以非常简单地直接求解,如:
x(t):= x_0 + wind_speed * t
y(t):= y_0 - fall_speed * t当重力等于摩擦力时,这是稳定下落的情况。
x(t):= x_0 + wind_speed * t;
y(t):= y_0 - 0.5 * g * t^2;如果你想模拟下降的速度越来越快。
发布于 2010-12-31 13:47:05
很少有事情需要考虑:
在您的processDrops函数中,您传入了windPower,但是使用了某种类成员或名为WindPower的全局类成员,这是错误吗?如果Gravity的值没有变化,那么保存计算(即mult乘以0.1)并直接使用它。
在update函数中,不要计算每次迭代的windPower * elapsed和Gravity * elapsed,而是在循环之前计算和保存,然后添加。另外,重新组织循环,没有必要做速度计算和渲染,如果拖放是在屏幕之外,首先进行检查,如果拖放仍然在屏幕上,然后更新速度和渲染!
有趣的是,你从来没有检查过它的x坐标是否脱离屏幕,你检查的高度,但不是宽度,你可以节省一些计算和渲染时间,如果你也这样做的话!
https://stackoverflow.com/questions/4569756
复制相似问题