Sauberes Rendern ?

Major_Sauce

Bekanntes Mitglied
Guten Abend allerseits,

Nach warscheinlich 100en von Stunden, die ich investiert habe um endlich mal flüssig und sauber zu rendern, habe ich immer noch keinen Erfolg.
Nun habe ich mir mal das kleinste Beispiel zusammengeschrieben, das ich mir vorstellen konnte und habe dies mal getestet.
Ich habe immer wieder das Problem dass ich zeitweise (immer in so 5-10 Sekunden Abständen) kleine Ruckler im Bild habe, die ich ums verrecken nicht rausbekomme.

Ich poste hier mal den Code und hoffe dass mir jemand sagen kann wieso ich diese kleinen Ruckler habe, oder ob es bei euch flüssig läuft, also wirklich flüssig.

Ich werde unten außerdem noch die .jar dazu anhängen, damit ihr es euch anschauen könnt wenn ihr willt.

Java:
package Main;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Main extends JPanel implements Runnable {

	private boolean running;
	private BufferedImage screen = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB);
	private Graphics2D g = (Graphics2D)screen.getGraphics();
	
	public void start(){
		running = true;
		new Thread(this).start();
	}
	
	public void stop(){
		running = false;
	}
	
	@Override
	public void run() {
		
		long lastTime = System.nanoTime();
		double unprocessed = 0.0D;
		double nsPerTick = 1000000000 / 60;
		long lastTimer = System.currentTimeMillis();
		int ticks = 0;
		int frames = 0;
		
		while(running){
			long now = System.nanoTime();
			unprocessed += (now - lastTime) / nsPerTick;
			lastTime = now;
			boolean shouldRender = false;
			while(unprocessed >= 1.0D){
				ticks++;
				tick();
				unprocessed -= 1;
				shouldRender = true;
			}
	
			if(shouldRender){
				frames++;
				render();
			}

			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			if(System.currentTimeMillis() - lastTimer > 1000L){
				lastTimer += 1000;
				System.out.println(frames + " | " + ticks);
				frames = 0;
				ticks = 0;
			}
		}
		
	}
	
	//Rendering stuff
	private int xDir = 1;
	private int yDir = 1;
	private int xDraw = 0;
	private int yDraw = 0;
	
	public void tick(){
		if(xDraw >= 700){
			xDir = -1;
		}
		if(xDraw <= 0){
			xDir = 1;
		}
		if(yDraw >= 500){
			yDir = -1;
		}
		if(yDraw <= 00){
			yDir = 1;
		}
		xDraw += xDir;
		yDraw += yDir;
	}
	
	public void render(){
		g.setColor(Color.BLACK);
		g.fillRect(0, 0, 800, 600);
		g.setColor(Color.ORANGE);
		System.out.println("Drawing at : " + xDraw + " | " + yDraw);
		g.fillRect(xDraw, yDraw, 50, 50);
		getGraphics().drawImage(screen, 0, 0, null);
	}
	
	//MAIN METHODS...
	public static void main(String[] args) {
		new Main();
	}
	
	public Main(){
                setBounds(0, 0, 800, 600);
		JFrame frame = new JFrame("Render Test");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);
		frame.setLayout(null);
		frame.setSize(800, 600);
		frame.add(this);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		start();
	}
	
}

mfg Major_Sa
 

Anhänge

  • Render Test.jar
    2,3 KB · Aufrufe: 14

Tobse

Top Contributor
Bei mir (Intel Core i5-4430) läuft das Teil smooth wie Butter (Respekt dafür nebenbei!). Ich kann den Fehler leider nicht reproduzieren.

Ich fermute aber mal: Auf schwächeren CPU kann eine notwendige und aufwendige Berechnung des OS die VM kurz aus der Bahn werfen. Das würde auf jeden Fall die kleinen Ruckler erklären.
 

Gucky

Top Contributor
Bau mal in die Schleife in run das hier ein und ein long letzterRuckler als Klassenvariable. Dann ruckelt es :D :
Java:
if (System.nanoTime() - letzterRuckler > 5000000000L){
	try {
		Thread.sleep(500);
		letzterRuckler = System.nanoTime();
	} catch (InterruptedException e1) {	}
}

Und ich habe sogar noch mal nur halb so viele Kerne und bei mir läuft es ebenfalls so weich, wie es nur sein soll.

Guck dir einmal den Speicher an, den die JVM bekommt. Es kann sein, dass während der Ruckler etwas von der Platte nachgeladen wird. Bei solch einem kleinen Programm glaube ich es zwar nicht aber eine Überprüfung kann nicht schaden.
 
Zuletzt bearbeitet:

Major_Sauce

Bekanntes Mitglied
Hmm, also bei mir sollte es schon auch gehen, habe zwar einen Laptop, aber das ding ist ganz schön flink.
Hab auch nen I7, ich denke am Prozessor liegts nicht.

Naja, ich hätte noch ne Jar, könntet ihr mal testen ob die smooth läuft ?
Ist dann schon nen bisschen mehr Belastung.
Wäre super, wenn die bei euch gut läuft sollte ich das mal an nem anderen Rechner ausprobieren.

mfg Major_Sauce
 

Anhänge

  • Render Test 2.jar
    21,7 KB · Aufrufe: 6

Gucky

Top Contributor
Bei mir passiert nichts. Es wird nur ein Bild angezeigt, dass mich sehr an Minecraft erinnert und das war's. Mehr passiert nicht.
Wie viel Hauptspeicher hast du und wie schnell sind bei dir die Einzelkerne?

PS: Lade lieber den Code hoch. Nicht überprüfbare Jars haben einen eher zweifelhaften Ruf-
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Ja das könnte sein :D
Ich kann mir das aber erst wieder "morgen" angucken.

Es könnte daran liegen, dass du immer erst ein BufferedImage erstellst. Versuch doch mal beides. Der Hintergrund ist das Image und die Figuren und Objekte werden gezeichnet.
 

Tobse

Top Contributor
Auch das zweite läuft bei mir einwandfrei. Wenn du einen i7 hast sollte der sicherlich nicht das problem sein (ausser vllt es ist ein uralter).

Das Problem könnte dein OS sein (wenn es stark überladen ist etc). Falls nein bleibt nur die Hardware.
 

Major_Sauce

Bekanntes Mitglied
Hmm, Hardware kann ich mir nicht vorstellen.
Mein Laptop macht sogar Arma III mit 45 fps mit, wo schon manche guten PCs dran scheitern.
Ich denke mal ich lass meinen alten PC mal rödeln, mal sehen was der so macht.
danke für die Hilfe.

mfg Major
 

Tobse

Top Contributor
Hmm, Hardware kann ich mir nicht vorstellen.
Mein Laptop macht sogar Arma III mit 45 fps mit, wo schon manche guten PCs dran scheitern.
Ich denke mal ich lass meinen alten PC mal rödeln, mal sehen was der so macht.
danke für die Hilfe.

mfg Major

Dann ist es mit ziemlicher sicherheit nicht die Hardware (wobei Arma sicherlich mit der GPU rendert, dein Programm mit der CPU). Ich vermute den Fehler daher zu 99% im OS. Es könnte auch daran liegen, dass der RAM einen hau ab hat aber das würde sich noch an ganz viel mehr Stellen bemerkbar machen, daher also extremst unwahrscheinlich.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
javampir Sauberes Faden mit awt Graphics AWT, Swing, JavaFX & SWT 6
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
P Rendern von Geraden im 3 dimensionalen Raum durch Rotationen AWT, Swing, JavaFX & SWT 0
Luk10 Effizienteres CPU-Rendern AWT, Swing, JavaFX & SWT 33
B JList nach dem Rendern sortieren AWT, Swing, JavaFX & SWT 3
B Label breite ermitteln vor dem rendern? AWT, Swing, JavaFX & SWT 7
K JLabel neu rendern AWT, Swing, JavaFX & SWT 5
M 2D-Grafik Offscreen-Rendern von Bildern AWT, Swing, JavaFX & SWT 2
TiME-SPLiNTER Swing JListModel: String rendern AWT, Swing, JavaFX & SWT 2
E JPanel in BufferdImage rendern problem AWT, Swing, JavaFX & SWT 2
S Wort aus Einzelbuchstaben rendern? AWT, Swing, JavaFX & SWT 3
S Swing JScrollpane Inhalt auswechseln und neu rendern?! AWT, Swing, JavaFX & SWT 5
Kr0e Text rendern AWT, Swing, JavaFX & SWT 11
Kr0e Swing in Bild rendern AWT, Swing, JavaFX & SWT 7
D Area rendern AWT, Swing, JavaFX & SWT 4
D Bild rendern AWT, Swing, JavaFX & SWT 8
S JTree rendern der Knoten [+] und [-], nicht der Node Icons AWT, Swing, JavaFX & SWT 2
R JTable - Rendern der einzelnen Zellen AWT, Swing, JavaFX & SWT 3
P Unsichtbare Komponente in ein Bild rendern? AWT, Swing, JavaFX & SWT 11
I Text innerhalb von Rectangle rendern AWT, Swing, JavaFX & SWT 3
S Automatisches Rendern einen JPanels AWT, Swing, JavaFX & SWT 8
F JTree: Elemente über ganze Zeile rendern AWT, Swing, JavaFX & SWT 6
M rendern von zeichen AWT, Swing, JavaFX & SWT 4
N Textfelder = Inhalt vorhanden && Jtable rendern AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben