关于例子系统粒子状态更新消耗CPU的问题

funte 2014-05-18 12:18:24
本人小白,最近写了个简单的粒子系统,每秒大概渲染20帧包括32768个三角形,需要时时更新状态的点有16386个。对就是这些点,更新时耗费了大量的CPU,请问大侠怎么提高效率。简单吧更新函数贴上来大家看看吧。


/*
* 更新函数
*/
void CSphere::update()
{
// 更新旋转量
m_rotatedx += 0.05f;
if (m_rotatedx > 360.f)
m_rotatedx = 0.f;

// 降低绘制频率
static int fcount = 0;
if (fcount > 4)
{
fcount = 0;
} else{
++fcount;
return;
}

// 更新势能
for (size_t row = 0; row < m_potentials.size(); ++row)
{
for (size_t col = 0; col < m_potentials[row].size(); ++col)
{
if (m_potentials[row][col].potentiallevel < 0.f || m_potentials[row][col].potentiallevel > 1.f)
{
m_potentials[row][col].isIncrease = m_rmc->nextb();
if (m_potentials[row][col].potentiallevel <= 0.f)
m_potentials[row][col].potentiallevel = 0.f;
else
m_potentials[row][col].potentiallevel = 1.f;
} else{
if (m_potentials[row][col].isIncrease)
m_potentials[row][col].potentiallevel += m_potentials[row][col].increaseVar;
else
m_potentials[row][col].potentiallevel -= m_potentials[row][col].increaseVar;
}

m_potentials[row][col].BrownianPosition = m_potentials[row][col].potentiallevel * BrownianMotionMAX;

}
}

// 获得颜色数据
glBindBuffer(GL_ARRAY_BUFFER, m_colorBufferobj);
float* colordata = (float*)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
// 将m_colors映射到colordata
if (colordata)
{
for (size_t row = 0; row < m_points.size(); ++row)
{
for (size_t col = 0; col < m_points[row].size(); ++col)
{
m_colors[row][col] = colordata + m_vertexoffset[row][col] * 3;
CR(m_colors[row][col]) = CR(COLOR_DARK) + m_potentials[row][col].potentiallevel * CR(COLOR_DELTA);
CG(m_colors[row][col]) = CG(COLOR_DARK) + m_potentials[row][col].potentiallevel * CG(COLOR_DELTA);
CB(m_colors[row][col]) = CB(COLOR_DARK) + m_potentials[row][col].potentiallevel * CB(COLOR_DELTA);
}
}
glUnmapBuffer(GL_ARRAY_BUFFER);
}

// 取得顶点数据
glBindBuffer(GL_ARRAY_BUFFER, m_vertexsBufferobj);
float* vertexdata = (float*)glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);
// 将m_points映射到vertexdata
if (vertexdata)
{
for (size_t row = 0; row < m_points.size(); ++row)
{
for (size_t col = 0; col < m_points[row].size(); ++col)
{
m_points[row][col] = vertexdata + m_vertexoffset[row][col] * 3;
memcpy_s(m_points[row][col], F3SIZE, m_originalPoints[row][col], F3SIZE);
MAKEPOINT_GOOSEPIMPLES(m_points[row][col], m_potentials[row][col], m_vectors[row][col]);
}
}

glUnmapBuffer(GL_ARRAY_BUFFER);
}


}


小弟再次拜谢

先给50分,如果牛人出现105分全部给你(就剩这么多了,别嫌弃)
...全文
110 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级能量泡泡 2014-05-21
  • 打赏
  • 举报
回复
另外,你的程序有一个严重的效率瓶颈,就是你用了a[m][n]这种,可能是两层vector/array的嵌套 请你改成单纯的二维数组类型a(i,j)的方式调用,这样性能会好不少。
超级能量泡泡 2014-05-21
  • 打赏
  • 举报
回复
不要在for循环里写if,利用bool运算的返回值(1和0)和代数计算组合。
qq120848369 2014-05-18
  • 打赏
  • 举报
回复


能省点就省点,想办法优化啊,另外是否可以考虑分而治之,比如把屏幕拆成4块,每一块由一个线程负责渲染,一个粒子一旦离开当前块进去另一块,无非就是加锁丢到另一个线程的数据集里,总之会把计算能力提高把。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧