SFML粒子系统架构
SFML Particle system architecture
我目前正在用c++和SFML 实现一个2D粒子系统
我发现这篇很好的帖子激励我建立一个通用系统。现在是渲染代码,我想就我的不同选择征求一些建议。
在SFML教程中,粒子系统显示为SFML实体的示例。在这种情况下,粒子系统嵌入顶点阵列和其他渲染需求。这也意味着继承,本教程的设计模式是为了避免继承。我需要继承来构建SFML实体,但它应该在哪里?
那么,实现渲染解决方案的最佳选择是什么呢?
-
直接来看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
-
创建粒子系统的渲染器作为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 }
-
向作为SFML实体的ParticleSystem添加(或替换颜色策略)RenderPolicy
template< class Particle > class RenderPolicy : public sf::Transformable , public sf::Drawable { // hold vertex array, texture and drawing routine ... }
-
因为所有这些都不好,又有什么想法?
我认为最好的解决方案是第三种,但也欢迎一些建议或意见谢谢大家,希望帖子能理解;)
粒子系统渲染器通常是一段非常具体和优化的代码。通常,它会进行一些高度优化的GPU渲染,这意味着我很可能会完全避免预先定义的SFML基元,而直接使用opengl。
也就是说,如果你想使用现有的基本体,它们必须是粒子类的基类。至少sf::Transformable应该是每个粒子的基类,因为每个粒子都应该有自己的位置、旋转等。
通常我认为从粒子类继承粒子系统类是个好主意,这样一个粒子系统就可以发射其他粒子系统来获得更复杂的效果(即爆炸粒子系统可以发射烟雾粒子系统)。
此外,基于策略的方法在99%的时间里都是过度的,只会增加实现的复杂性。我试了很多次,但都不值得。根据我的经验,继承是将渲染与粒子系统解耦的更好方法,因为它不会使每个粒子系统都成为不同的类型。也就是说,坚持爆炸的例子:通常你想跟踪所有需要在一个地方渲染的粒子系统,所以它们至少需要共享一个基本类型和虚拟界面,这样它们就可以在一个位置存储和处理,所以如果你对烟雾和火焰有不同的渲染方案,仍然可以将需要渲染的所有粒子系统保存在一个CCD_ 2中。如果每个粒子系统都是单独的类型,只是因为它的渲染方式不同,这是行不通的。
- SFML 碰撞永远不会在我的系统中注册
- 粒子系统:所有粒子都朝同一方向运动
- 减慢伊利希特粒子系统的速度
- 如何使用7.1音频系统sfml播放声音
- 可以将Statechart库与粒子光子嵌入式系统一起使用
- C++粒子系统的边界框不起作用
- 粒子系统物理学表现怪异
- HLSL粒子系统将不显示
- SFML - 超出范围的粒子系统矢量
- 制作一个简单的粒子系统
- 如何旋转粒子系统,使其不绕世界轴旋转
- 是否应在几何体着色器中完全更新粒子系统
- 粒子系统的顶点着色器
- SFML粒子系统架构
- c++粒子系统快板5
- 2D粒子系统-性能
- 对于长时间绘制密集粒子系统来说,什么是好的和安全的语言?
- 混合两个粒子系统的颜色
- Cocos2d粒子系统不跟随移动和旋转的摄像机
- cocos2dx如何创建一个粒子系统的xml-content