2014-08-28 137 views
0

我目前正在实施一个用c 2D粒子系统++和SFMLSFML粒子系统架构

我发现这个漂亮post激励我在构建一个通用的系统。现在来了渲染代码,我要求提供一些关于我有不同选择的建议。

在SFML教程中,particle system显示为SFML实体的一个示例。在这种情况下,粒子系统嵌入顶点数组和其他渲染需求。这也意味着继承和本教程的设计模式是为了避免继承。我需要继承来构建一个SFML实体,但它应该放在哪里?

那么实现渲染解决方案的最佳选择是什么?

  1. 保持直奔SFML例子,只是增加一个RenderPolicy到的政策和纹理信息列表中颗粒:

    template < class Particle , class RenderPolicy, class OtherPolicies > 
    ParticleSystem : public sf::Drawable, sf::Transformable { 
        // implement the virtual function 
        ... 
    void update(){ 
        RenderPolicy(Particles,VertexArray) // here the render policy update render info 
    } 
    // hold the VertexArray for the Particles 
    ... 
    }; // ParticleSystem 
    
  2. 创建粒子系统渲染器作为SFML实体

    template< class ParticleSystem , class RenderPolicy > 
    ParticleSystemRenderer : public sf::Drawable, public sf::Transformable { 
        // will use ParticleSystem array to build VertexArray 
        // will hold texture information and other needs 
    } 
    
  3. 将RenderPolicy添加(或替换颜色策略)到作为SFML实体的ParticleSystem

    template< class Particle > 
    class RenderPolicy : public sf::Transformable , public sf::Drawable { 
        // hold vertex array, texture and drawing routine 
    ... 
    } 
    
  4. 另一个想法,因为所有这些都不好?

我认为,最好的解决办法是第三个,但一些建议或意见,欢迎 感谢所有,望柱理解;)

回答

1

粒子系统渲染器通常是一个非常具体和优化一段代码。通常,它会进行一些大量优化的GPU渲染,这意味着我很可能完全避免预先定义的SFML基元并使用opengl direclty。

也就是说,如果你想使用现有的基元,它们必须是粒子类的基类。至少sf :: Transformable应该是每个粒子的基类,因为每个粒子都应该有自己的位置,旋转等。

通常我认为从粒子类继承粒子系统类也是一个好主意因此即一个粒子系统可以发射其他粒子系统以获得更复杂的效果(即,爆炸粒子系统可以发射烟雾粒子系统)。

此外,基于策略的方法在99%的时间内过度使用,并增加了实现的复杂性。我尝试了很多次,并且从未值得。 根据我的经验,继承是将粒子系统与渲染分离的更好方法,因为它不会使每个粒子系统成为不同的类型。即坚持爆炸的例子:通常你想跟踪所有需要在一个地方渲染的粒子系统,所以他们至少需要共享一个基本类型和虚拟接口,以便它们可以在一个地方存储和处理,所以如果你有不同的烟雾和火焰渲染方案,你仍然会保存所有需要渲染的粒子系统在一个std::vector<std::unique_ptr<MyParticleSystem>>。如果每个粒子系统是一个单独的类型,只是因为它的渲染方式不同,那就不起作用。

+0

thx您的建议和经验分享,我会考虑和审查一下架构。几种多策略粒子系统的管理复杂性明显增加,我也必须考虑这一点 – leJon 2014-08-28 23:47:28