2014-08-28 187 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