2017-06-17 24 views
0

我使用的是由bennybox製作的java遊戲引擎來創建我自己的引擎。以前我用UE4工作,在那裏你可以有靜態網格物體,在他的引擎,這將有可能與連接到它MeshRenderer分量的遊戲對象:TheBennyBox引擎 - 性能友好的實例靜態網格像在UE4中

GameObject staticMeshActor_Grass = new GameObject(); 

AddObject(staticMeshActor_Grass.addComponent(new MeshRenderer(
    new Mesh("plane.obj"), new Material(
    new Texture("T_Grass_BC.png"), 1, 8, 
    new Texture("T_Grass_N.png"))))); 

現在我試圖創建這些草的大視場但由於這些都是他們單獨的GameObjects(或UE4術語中的參與者),所以它們在16x16瓦片後開始削弱幀頻!

我相信我可以解決這個問題,如果我在一個GameObject中創建多個靜態網格物體的實例,以使其性能友好。在UE4中,這個特性被稱爲'Instanced Static Mesh Component',它允許這樣做,我想要類似的東西。

這是一個被thebennybox做出的遊戲對象類:

public class GameObject 
{ 
    private ArrayList<GameObject> m_children; 
    private ArrayList<GameComponent> m_components; 
    private Transform m_transform; 
    private CoreEngine m_engine; 

    public GameObject() 
    { 
     m_children = new ArrayList<GameObject>(); 
     m_components = new ArrayList<GameComponent>(); 
     m_transform = new Transform(); 
     m_engine = null; 
    } 

    public GameObject AddChild(GameObject child) 
    { 
     m_children.add(child); 
     child.SetEngine(m_engine); 
     child.GetTransform().SetParent(m_transform); 

     return this; 
    } 

    public GameObject AddComponent(GameComponent component) 
    { 
     m_components.add(component); 
     component.SetParent(this); 

     return this; 
    } 

    public void InputAll(float delta) 
    { 
     Input(delta); 

     for(GameObject child : m_children) 
      child.InputAll(delta); 
    } 

    public void UpdateAll(float delta) 
    { 
     Update(delta); 

     for(GameObject child : m_children) 
      child.UpdateAll(delta); 
    } 

    public void RenderAll(Shader shader, RenderingEngine renderingEngine) 
    { 
     Render(shader, renderingEngine); 

     for(GameObject child : m_children) 
      child.RenderAll(shader, renderingEngine); 
    } 

    public void Input(float delta) 
    { 
     m_transform.Update(); 

     for(GameComponent component : m_components) 
      component.Input(delta); 
    } 

    public void Update(float delta) 
    { 
     for(GameComponent component : m_components) 
      component.Update(delta); 
    } 

    public void Render(Shader shader, RenderingEngine renderingEngine) 
    { 
     for(GameComponent component : m_components) 
      component.Render(shader, renderingEngine); 
    } 

    public ArrayList<GameObject> GetAllAttached() 
    { 
     ArrayList<GameObject> result = new ArrayList<GameObject>(); 

     for(GameObject child : m_children) 
      result.addAll(child.GetAllAttached()); 

     result.add(this); 
     return result; 
    } 

    public Transform GetTransform() 
    { 
     return m_transform; 
    } 

    public void SetEngine(CoreEngine engine) 
    { 
     if(this.m_engine != engine) 
     { 
      this.m_engine = engine; 

      for(GameComponent component : m_components) 
       component.AddToEngine(engine); 

      for(GameObject child : m_children) 
       child.SetEngine(engine); 
     } 
    } 
} 

的ADDOBJECT()在第一部分中所示的方法來自於一個抽象類,最終調用遊戲對象類內的方法AddChild(遊戲對象的孩子)。正如你所看到的,我們有一個GameObjects和GameComponents的ArrayList。現在我必須實現一些方法來支持在一個GameObject中創建多個網格實例。

我已經嘗試添加多個MeshRenderer組件到一個遊戲對象,但是這並沒有解決。也許有人有一個建議,我可以怎麼做呢?在Eclipse https://github.com/BennyQBD/3DGameEngine

只要使用「打開項目從文件系統..」,選擇該文件夾,一旦你的目錄:

如果你真的有興趣並想幫我,你可以在這裏下載引擎已經完成了你應該能夠運行該程序。

非常感謝您的幫助!

回答