我使用的是由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
只要使用「打開項目從文件系統..」,選擇該文件夾,一旦你的目錄:
如果你真的有興趣並想幫我,你可以在這裏下載引擎已經完成了你應該能夠運行該程序。
非常感謝您的幫助!