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

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.
 
Bau mal in die Schleife in run das hier ein und ein long letzterRuckler als Klassenvariable. Dann ruckelt es 😀 :
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:
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

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:
Ja das könnte sein 😀
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.
 
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.
 
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
 
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.
 

Zurück
Oben