2017-06-17 2 views
0

J'utilise le moteur de jeu java de thebennybox pour créer mon propre moteur. Auparavant, je travaillais avec UE4 où vous pourriez avoir des acteurs statique Mesh, dans son moteur ce serait probablement un gameobject avec un composant MeshRenderer attaché à lui:TheBennyBox Engine - Mailles statiques instanciées performantes comme dans 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"))))); 

Maintenant, je suis en train de créer un grand champ de ces herbes mais puisque ce sont tous leurs GameObjects individuels (ou Acteurs en termes UE4) après 16x16 tuiles, ça commence à paralyser le frame rate! Je crois que je peux résoudre ce problème si je fais des instances de plusieurs maillages statiques à l'intérieur d'un GameObject afin de le rendre convivial. Dans l'UE4, cette fonctionnalité est appelée 'Instanced Static Mesh Component' qui permet cela et je voudrais avoir quelque chose de similaire.

est ici la classe gameobject faite par 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); 
     } 
    } 
} 

La méthode AddObject() montré dans la première partie provient d'une classe abstraite et appelle ensuite la méthode addChild (enfant gameobject) dans la classe gameobject. Comme vous pouvez le voir, nous avons une ArrayList de GameObjects et GameComponents. Maintenant, je devrais implémenter une méthode afin de supporter la création de plusieurs instances de maillage dans un GameObject.

J'ai déjà essayé d'ajouter plusieurs composants MeshRenderer à un objet GameObject mais cela n'a pas fonctionné. Peut-être que quelqu'un a une suggestion sur la façon dont je pourrais m'y prendre?

si vous êtes vraiment intéressé et que vous voulez me aider, vous pouvez télécharger le moteur ici: https://github.com/BennyQBD/3DGameEngine

utilisez simplement « Projets Open A partir du système de fichiers .. » dans Eclipse, choisissez le répertoire de ce dossier et une fois que vous avez fait cela, vous devriez être capable de lancer le programme.

Merci beaucoup pour votre aide!

Répondre