Grafik-Engine? MemoryImageSource?

Status
Nicht offen für weitere Antworten.

RedNifre

Mitglied
Hallo!

Ich möchte gerne eine kleine Grafik-Engine schreiben. Nur irgendwie verstehe ich nicht so ganz, wie man das am effektivsten macht (soll ja flüssig laufen).

Ich habe aus der Java API verstanden, dass man irgendwie mit MemoryImageSource arbeiten kann. Nur irgendwie kriege ich das überhaupt nicht zum Laufen. Und ich finde auch keine Tutorials dazu im WWW.

Es wäre echt super, wenn mir jemand ein kleines Beispiel schreiben könnte, dass das hier macht:
Minimale Implementierung für einen JFrame der bloß "rauschen" enthält, also jeder Pixel wird auf eine zufällige Farbe gesetzt und das ganze als Wiederholung (Also animiert).

Vielen Dank!
 

muddin

Mitglied
Hi!

Also über die Performaz von MemoryImageSource kann ich nicht allzuviel sagen. Ich habe es mal für eine Partikel-Engine benutzt, da es recht praktisch ist, wenn man einfach ein paar Pixel setzen will. Hier mal ein Beispiel auf die Schnelle:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;

public class MemImgExample extends JFrame
{
	static final int imgWidth = 640;
	static final int imgHeight = 480;
	
	int[] pixelArray = new int[imgWidth*imgHeight];
	//32-Bittiges ColorModel wenn der Alpha-Kanal auch benutzt werden soll
	//ColorModel targetCM = new DirectColorModel(32,0x00FF0000,0x000FF00,0x000000FF,0xFF000000);
	ColorModel targetCM = new DirectColorModel(24,0x00FF0000,0x000FF00,0x000000FF);
	MemoryImageSource targetMIS;
	Image targetImage;
	
	public static void main(String args[])
	{
		new MemImgExample();
	}
	
	public MemImgExample()
	{

		
		targetMIS = new MemoryImageSource(imgWidth,imgHeight,targetCM,pixelArray,0,imgWidth);
		targetMIS.setAnimated(true);
		targetMIS.setFullBufferUpdates(true);
		targetImage = createImage(targetMIS);		

		
		setSize(imgWidth,imgHeight);
		setVisible(true);
		for(int i=0;i<50;i++)
		{
			drawNoise();
			targetMIS.newPixels();
		}		
	}
	public void putPixel(int x,int y, int c)
	{
		int pos = x + (y*imgWidth);
		pixelArray[pos%(imgWidth*imgHeight)] = c;
	}
		
	private void drawNoise()
	{
		for(int y=0;y<imgHeight;y++)
			for(int x=0;x<imgWidth;x++)
			{
				putPixel(x,y,(int)(Math.random()*255*255*255));
			}
	}
	
	public void paint(Graphics g)
	{
		g.drawImage(targetImage,0,0,this);
	}
		
}

mfg,
Muddin
 

EgonOlsen

Bekanntes Mitglied
Einzelne Pixel setzen kann man aber mit einem BufferedImage, von dem man ebenfalls das Pixelarray erhalten kann. Das hat den Vorteil, dass es etwas schneller ist und man kann zusätzlich die normalen Grafikmethoden benutzen, um in das BufferedImage zu zeichnen.
 

RedNifre

Mitglied
BufferedImage hört sich auch interessant an.

Was genau sind denn die feinen Unterschiede zwischen MemoryImageSource und BufferedImage?
Was ist denn der beste Weg, eine flotte Grafik-Engine zu schreiben?
 

Marco13

Top Contributor
Hm. MemoryImageSource habe ich bisher fast nie verwendet - eigentlich kann man alles, was man damit machen kann, auch mit einem BufferedImage machen - und bei letzterem kann man (i.a.) sicher sein, dass es "managed" ist (d.h. optimiert für schnelles Zeichnen und kopieren). Ggf. solltest du mal einen direkten Vergleich zwischen beidem machen (und ggf. noch ein VolatileImage dazu, wenn's auf den letzten Funken Performance ankommt).
Wobei mir aber auch nicht nicht klar ist, was diese "Grafikengine" können soll..........
 

RedNifre

Mitglied
Hier mal eine kurze Erklärung was ich vorhabe:

Abstrakt:
Eine Wolfenstein-artige Engine mit Mode7-artigem Floor/Ceiling-Texturing und Sprites. Außerdem soll die Kamera 4 echte und 1 gefakten Freiheitsgrad haben (Echt: die drei Raumbewegungen sowie Rotation um die Senkrechte Achse. Gefaked: nach oben/unten schauen).

Genauer (ohne die Optimierungsdetails):
1. Zeichne Decke und Boden Pixelweise und zwar Zeile für Zeile und jede Zeile für sich von links nach rechts.
2. Zeichne darüber die Wände und zwar Spaltenweise. Eine Texturspalte wird hierfür gestaucht/gestreckt um sie auf eine Bildschirmspalte zu zeichnen. Merke dir dabei den Orthogonalabstand zur Kamera.
3. Sortiere die sichtbaren Sprites nach Orthogonalabstand zur Kamera. Dann beginne mit dem entferntesten Sprite: Das Sprite wird spaltenweise gezeichnet, wobei für jede Spalte erst gecheckt wird, ob die Wandspalte an dieser Stelle das Sprite verdeckt oder nicht.

Es geht also darum, für jeden Frame das komplette Bild neu zu zeichnen und zwar so schnell wie möglich (Vorzugsweise 30 bis 60 FPS oder so).

Irgendwie finde ich keine Übersicht, wann man denn am besten BufferedImage/MemoryImageSource/VolatileImage benutzen sollte.
 

EgonOlsen

Bekanntes Mitglied
Für diese Geschichte musst du direkt im Pixelarray arbeiten. Das geht nur mit MI oder BI. MI ist quasi die 1.1-kompatible Variante von BI. Funktional ähnlich, aber von einem MI bekommst du keine gültige Graphics-Instanz, d.h. wenn du nicht im Array malst, sondern z.B. mit Java2D eine Linie malen willst, dann geht das mit MI nicht.
Ich würde, wenn 1.1-Unterstützung nicht erforderlich ist, immer mit BIs arbeiten. Sie sind etwas schneller, wenn auch nicht viel. In der kommenden D3D-Pipeline von Java6u10 sind beide gleich schlecht dran, also auch hier ist es egal. Du kannst auch, wenn 1.1. ein Thema sein sollte, einfach beide unterstützen. Mache ich bei jPCT im Software-Modus auch so: Wenn es 1.2+ ist, nehme ich BI. Ansonsten MI.
 

RedNifre

Mitglied
Vielen Dank für die Tipps! Ich habe es jetzt schon mit MemoryImageSource geschrieben, aber ich werd auch mal schauen, ob es mit dem BufferedImage besser läuft.

Hier ist ein YouTube-Video der ersten Version:
Mode7 Java Video
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Luk10 Tipps für bessere Animationen / Grafik Engine Spiele- und Multimedia-Programmierung 2
M Feste Blöcke mit Grafik Spiele- und Multimedia-Programmierung 9
Anfänger2011 Wichtig: Grafik und Sprites erstellen Spiele- und Multimedia-Programmierung 1
T grafik in bereiche einteilen (dartboard) Spiele- und Multimedia-Programmierung 14
T LWJGL Grafik meines Projektes läuft nicht korrekt auf meinem iMac Spiele- und Multimedia-Programmierung 19
S Wolken Bild/Grafik vom Programm erstellen lassen Spiele- und Multimedia-Programmierung 11
M Einen Hobby Game - / Grafik Designer zu finden (Screenshot vom Spiel) Spiele- und Multimedia-Programmierung 7
D einfache 2D Grafik in JAVA. absoluter Anfänger Spiele- und Multimedia-Programmierung 5
R 2D Grafik JOGL Spiele- und Multimedia-Programmierung 18
Developer_X 3D Grafik Formeln Spiele- und Multimedia-Programmierung 35
S Grafik erstellen für Java Spiel Spiele- und Multimedia-Programmierung 8
Developer_X Java3D Grafik Boni Spiele- und Multimedia-Programmierung 8
H Grafik verschwindet durch Größenveränderung von GridBag Spiele- und Multimedia-Programmierung 5
N Felder auf Grafik Spiele- und Multimedia-Programmierung 2
E Tester mit Intels Onboard-Grafik (o.ä.) gesucht! Spiele- und Multimedia-Programmierung 28
N Grafik als Hintergrund eines Rechtecks verwenden? Spiele- und Multimedia-Programmierung 4
G Entscheidungshilfe: Grafik-API Spiele- und Multimedia-Programmierung 5
T Spiel mit schöner Grafik, bitte testen Spiele- und Multimedia-Programmierung 10
V Wie bewege ich eine eingefügte Grafik (img) ? Spiele- und Multimedia-Programmierung 2
S Wie kann ich das Zeichnen der Grafik feiner machen? Spiele- und Multimedia-Programmierung 9
C 3d Engine : Fragment Shader , aber wie? Spiele- und Multimedia-Programmierung 17
C 3d Game Engine : PERFORMANTE Räumliche Verdeckung Spiele- und Multimedia-Programmierung 5
C Eine eigene 3d Engine : Shader - aber wie ? Spiele- und Multimedia-Programmierung 2
E 3D Engine Spiele- und Multimedia-Programmierung 5
R Vererbbarer GameLoop für Engine Spiele- und Multimedia-Programmierung 14
V Suche 2D Engine Spiele- und Multimedia-Programmierung 11
S Engine2D - Java 2D Engine Spiele- und Multimedia-Programmierung 20
D Physik Engine und Collision Spiele- und Multimedia-Programmierung 5
R Ratschlag für 2D-3D Engine für die Spieleentwicklung gesucht Spiele- und Multimedia-Programmierung 4
M [JME3] Jmonkey Engine und Wavefront import aus Blender Spiele- und Multimedia-Programmierung 3
K Einfache Engine für einfaches 3D gesucht Spiele- und Multimedia-Programmierung 10
N Eigene Java 3D Engine erstellen. Spiele- und Multimedia-Programmierung 11
K Game Engine für selbstprogrammiertes Spiel Spiele- und Multimedia-Programmierung 27
X Möglichst komplette 2D Game Engine? Spiele- und Multimedia-Programmierung 12
T Ist meine Jump and Run Engine zu genau? Spiele- und Multimedia-Programmierung 4
J 2D-Game-Engine? Spiele- und Multimedia-Programmierung 2
N 1600 Zeilen Engine Spiele- und Multimedia-Programmierung 23
R Physics Engine benutzen Spiele- und Multimedia-Programmierung 11
Steev EGE - Easy Game Engine Spiele- und Multimedia-Programmierung 2
Developer_X Java Mokey Engine Spiele- und Multimedia-Programmierung 7
G kleine "2d" Physik Engine Spiele- und Multimedia-Programmierung 3
M Gibt es ein deutsches Board für die jmonkey engine? Spiele- und Multimedia-Programmierung 7
Landei jMonkeyEngine als 3D Engine Spiele- und Multimedia-Programmierung 12
U 3D Engine und anderes Spiele- und Multimedia-Programmierung 4
sparrow 3D-Game-Engine Spiele- und Multimedia-Programmierung 20
M Welche ist die beste Java3D-Engine Spiele- und Multimedia-Programmierung 15
B Schnelle 3D-Engine gesucht Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben