Hi,
ich habe vor (nicht ganz freiwillig) eine komplett eigene Render-Engine in java zu bauen.
Diese soll (leider) nur mit Standert JDK Inhalte funktionieren.
Dabei zu sagen ist das ich relativ neu in Java bin, aber einige Jahre C++ Erfahrung habe.
Die Grundlagen stehen schon, aber aktuell bricht mir leider die Performance massiv ein.
Grundlegender Aufbau des Renderns:
- Sortiere eine Liste aller Objekte anhand der z (Entfernung) Koordinaten.
- Nun transformier Objekt-Space in World-Space
- Bilde das Objekt mit Perspektivischer Transformation auf die X-Y (Bildschirm) ebene ab
- Textur (die im RAM liegt) transformieren und auf ein Img "rendern" das hinterher angezeigt wird
Zeichnen von Quadratischen "einfachen" Objekten läuft über Graphics2D.draw,
das Transformierte zeichnen läuft über Pixelarrays (DataBufferInt).
Image Typ ist aktuell BufferedImage, alles läuft in einem Thread.
Der größte Geschwindigkeits verlust entsteht beim Zeichnen von Objekten (unteranderem weil Clipping fehlt)
Falls irgendjemand Tipps kennt wie man alles optiemieren kann würde ich mich freuen davon zu hören.
Einige Source Code beispiele:
Alle Objekte zeichnen und das fertige img zurückgeben, mit Caching wenn nichts geändert wurde.
BitmapBit arbeitet auf Pixelarrays
Falls weitere source Inhalte gebraucht werden bitte melden, ich wollt nicht alles vollposten...
ich habe vor (nicht ganz freiwillig) eine komplett eigene Render-Engine in java zu bauen.
Diese soll (leider) nur mit Standert JDK Inhalte funktionieren.
Dabei zu sagen ist das ich relativ neu in Java bin, aber einige Jahre C++ Erfahrung habe.
Die Grundlagen stehen schon, aber aktuell bricht mir leider die Performance massiv ein.
Grundlegender Aufbau des Renderns:
- Sortiere eine Liste aller Objekte anhand der z (Entfernung) Koordinaten.
- Nun transformier Objekt-Space in World-Space
- Bilde das Objekt mit Perspektivischer Transformation auf die X-Y (Bildschirm) ebene ab
- Textur (die im RAM liegt) transformieren und auf ein Img "rendern" das hinterher angezeigt wird
Zeichnen von Quadratischen "einfachen" Objekten läuft über Graphics2D.draw,
das Transformierte zeichnen läuft über Pixelarrays (DataBufferInt).
Image Typ ist aktuell BufferedImage, alles läuft in einem Thread.
Der größte Geschwindigkeits verlust entsteht beim Zeichnen von Objekten (unteranderem weil Clipping fehlt)
Falls irgendjemand Tipps kennt wie man alles optiemieren kann würde ich mich freuen davon zu hören.
Einige Source Code beispiele:
Alle Objekte zeichnen und das fertige img zurückgeben, mit Caching wenn nichts geändert wurde.
BitmapBit arbeitet auf Pixelarrays
Java:
public BitmapJ2D tick(long frameCount)
{
boolean up = false;
frame.draw(old, 0, 0);
frame.fill(0xff000000);
BitmapBit BBit = null;
java.util.Collections.sort(objects);
for(EntityBase itr : objects)
{
itr.addAng(new Vector3(0,0.01,0));
Vector3[] tmp = itr.toWorld();
if(itr instanceof Plane)
{
//if(itr.getUpdate())
{
if(BBit==null){BBit = new BitmapBit(WIDTH,HEIGHT,((DataBufferInt)((BufferedImage)frame.getImg()).getRaster().getDataBuffer()).getData());}
for(int i=0;i<4;i++) { this.Project(tmp[i]);}
//System.out.println(tmp[0].toString()+ tmp[1].toString() + tmp[2].toString() + tmp[3].toString());
//Transform draw
BBit.drawTransform(((Plane)itr).getTopTexture(),tmp[0], tmp[1], tmp[2], tmp[3]);
itr.cache(tmp);
itr.setUpdate(false);
up=true;
}
}
}
if(up)
{
old.fill(0xff000000);
old.draw(frame,0,0);
up = false;
}
return frame;
}
Falls weitere source Inhalte gebraucht werden bitte melden, ich wollt nicht alles vollposten...