SFML粒子系统架构

SFML Particle system architecture

本文关键字:粒子系统 SFML      更新时间:2023-10-16

我目前正在用c++和SFML 实现一个2D粒子系统

我发现这篇很好的帖子激励我建立一个通用系统。现在是渲染代码,我想就我的不同选择征求一些建议。

在SFML教程中,粒子系统显示为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. 向作为SFML实体的ParticleSystem添加(或替换颜色策略)RenderPolicy

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

我认为最好的解决方案是第三种,但也欢迎一些建议或意见谢谢大家,希望帖子能理解;)

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

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

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

此外,基于策略的方法在99%的时间里都是过度的,只会增加实现的复杂性。我试了很多次,但都不值得。根据我的经验,继承是将渲染与粒子系统解耦的更好方法,因为它不会使每个粒子系统都成为不同的类型。也就是说,坚持爆炸的例子:通常你想跟踪所有需要在一个地方渲染的粒子系统,所以它们至少需要共享一个基本类型和虚拟界面,这样它们就可以在一个位置存储和处理,所以如果你对烟雾和火焰有不同的渲染方案,仍然可以将需要渲染的所有粒子系统保存在一个CCD_ 2中。如果每个粒子系统都是单独的类型,只是因为它的渲染方式不同,这是行不通的。