目前在我的游戏中,每隔5帧就会添加一个半透明的纹理复制品到拖尾的List<>中,作为拖尾效果。
这些拖尾的alpha值每帧都会减少,绘制函数会遍历列表并绘制每个纹理。一旦它们的alpha值达到0,它们就会从List<>中移除。
结果是在移动实体后面产生了一个不错的拖尾效果。问题是对于100多个实体,帧率开始急剧下降。
所有的拖尾纹理都来自同一张精灵表,所以我认为这不是批处理问题。我对代码进行了分析,并且发现在FPS下降峰值时,CPU强度比正常FPS时低,因此我认为这是GPU限制的问题?
有没有更有效地实现这个效果的方法?
以下是我使用的通用代码:
// fade alpha
m_alpha -= (int)(gameTime.ElapsedGameTime.TotalMilliseconds / 10.0f);
// draw
if (m_alpha > 0) {
// p is used to alter RGB of the trails color (m_tint) depending on alpha value
float p = (float)m_alpha/255.0f;
Color blend = new Color((int)(m_tint.R*p), (int)(m_tint.G*p), (int)(m_tint.B*p), m_alpha);
// draw texture to sprite batch
Globals.spriteBatch.Draw(m_texture, getOrigin(), m_rectangle, blend, getAngle(), new Vector2(m_rectangle.Width/2, m_rectangle.Height/2), m_scale, SpriteEffects.None, 0.0f);
} else {
// flag to remove from List<>
m_isDone = true;
}
我想我应该指出,给Trail类的m_texture是对所有Trail共享的全局纹理的引用。我不会为每个Trail创建一份硬拷贝。
编辑:如果我仅仅注释掉SpriteBatch.Draw调用,即使我为数百个对象每一帧都分配一个新的trail,在帧率上也没有下降……一定有更好的方法来做这件事。