Java Cache und Perfomance

02/13/2015 12:59 xEncounter#1
Hey,

Habe ein Spiel mit Slick2d framework geschrieben, aber es zieht viel Performance, dass schwächere Rechner sich aufhängen.

Gibt es eine Möglichkeit ressourcen zu cachen oder gibt es allg. Perfomance Killer oder Tipps zur Optimierung oder vorladen ?
02/13/2015 14:59 YatoDev#2
Gibt viele Möglichkeiten. Kenne die engine nicht und auch nicht viele java eigene Methoden die dafür geeignet sind.
Sei kreativ beim optimieren.

Bei gdi+ Sachen die ich schon auf guis gezeichnet hab war es sinnvoll ein "fps" limit festzulegen und den cpu zu entlasten.
Was du alles cachen kannst ist vorallem von der engine vorgegeben
02/13/2015 20:37 Warnuk3r#3
Schon FPS Limit eingerichtet? Erinnere mich das man normal so viele FPS hat, dass die CPU stark ausgelastet wird. Dadurch konnte man das ganze gut eindämmen. Da hat irgendjemand Code hierfür veröffentlicht, findest du sicher in Google.
02/13/2015 22:44 xEncounter#4
Ich habe gehört, dass man die Framerate eben nicht limitieren soll(von meinem Lehrer).

Was stimmt den jetzt ? ^^
02/14/2015 01:37 Warnuk3r#5
Meine CPU ist so krass ran genommen worden ist, weil da sicher 6000 FPS am Start waren, wenn ich mich richtig erinnere. Als ich sie zu 60 limitiert habe, war alles wieder ok. Dir müssten doch die FPS angezeigt worden sein, was willst du mit 6000?

[Only registered and activated users can see links. Click Here To Register...]
02/14/2015 22:00 YatoDev#6
Quote:
Originally Posted by xEncounter View Post
Ich habe gehört, dass man die Framerate eben nicht limitieren soll(von meinem Lehrer).

Was stimmt den jetzt ? ^^
mein lehrer erzählt manchmal viel scheiße....

bei triple A spielen werden fps auch limitiert wenn es nötig ist(weil ein vorteil dadurch entsteht oder eben die last zu hoch ist).

wenn ich snake programmiere und da unendlich viele fps habe ist das doch total unnötig und hat nichts mehr mit gutem code zu tun
02/15/2015 00:40 Shadow992#7
Quote:
Originally Posted by xEncounter View Post
Ich habe gehört, dass man die Framerate eben nicht limitieren soll(von meinem Lehrer).

Was stimmt den jetzt ? ^^
Darfst ihm dezent sagen, dass er Schwachsinn labert alleine vom Verständnis her macht es keinen Sinn die FPS nicht zu beschränken.

FPS-Definition:

Quote:
Sie bezeichnet die Anzahl der Einzelbilder bzw. Bewegungsphasen, die pro Zeiteinheit aufgenommen oder wiedergegeben werden. Eine ausreichend hohe Bildfrequenz macht sich die Nachbildwirkung und den Stroboskopeffekt zunutze und ermöglicht dem Betrachter, eine Sequenz von Einzelbildern als fortlaufende Bildfolge wahrzunehmen.

Mit dem englischen Ausdruck frames per second (kurz: fps) bzw. auf Deutsch Bildrahmen/Bilder pro Sekunde (kurz: BpS) wird die Anzahl der Einzelbilder pro Sekunde bezeichnet.

Quelle: Bildfrequenz ? Wikipedia
Was für eine Bildwiederholfrequenz besitzt dein Bildschirm?
Kommst du da auf 200 Bilder die Sekunde?
Wohl kaum...
Also warum sollte ich 200 Bilder die Sekunde berechnen lassen, wenn mein Bildschirm eh nur 60 Bilder die Sekunde anzeigen kann? Totaler Blödsinn.

Nicht umsonst werden die FPS normalerweise auf 60 beschränkt, weil 60Hz auch die weitverbreiteste Bildfrequenz ist.

Daher begrenze die FPS auf 60, wenn du ganz sicher gehen willst mach 100 draus. Das ist dann aber auch schon genug.

Mehr braucht es wohl sicher nicht, zumindest nicht für normale Spiele.
02/15/2015 15:02 xEncounter#8
Das Ding ist dass in dem Framework mit einem Delta Wert von der Update und Render Methode gerechnet wird.

Sprich wenn du die FPS Zahl hoch oder runterschraubst, reagiert das spiel anders.

wenn du bei Bewegungen ohne delta Zeit angaben programmierst, dann siehts immer anders aus, weil es ja dann auf deine CPU Leistung hört(die kann ja schwanken etc.).

Beim entwickeln würde es vll. Sinn machen, die fps rate nicht zu limitieren.

So würde ich das ganze sehen.
02/16/2015 16:06 MrSm!th#9
Quote:
Originally Posted by Shadow992 View Post
Darfst ihm dezent sagen, dass er Schwachsinn labert alleine vom Verständnis her macht es keinen Sinn die FPS nicht zu beschränken.

FPS-Definition:



Was für eine Bildwiederholfrequenz besitzt dein Bildschirm?
Kommst du da auf 200 Bilder die Sekunde?
Wohl kaum...
Also warum sollte ich 200 Bilder die Sekunde berechnen lassen, wenn mein Bildschirm eh nur 60 Bilder die Sekunde anzeigen kann? Totaler Blödsinn.

Nicht umsonst werden die FPS normalerweise auf 60 beschränkt, weil 60Hz auch die weitverbreiteste Bildfrequenz ist.

Daher begrenze die FPS auf 60, wenn du ganz sicher gehen willst mach 100 draus. Das ist dann aber auch schon genug.

Mehr braucht es wohl sicher nicht, zumindest nicht für normale Spiele.
[Only registered and activated users can see links. Click Here To Register...]

Ich sehe keinen wirklichen Grund die FPS zu limitieren, solange die hohe Rate nicht anderen Threads CPU-Zeit nimmt, welche diese brauchen. Sie mag unnötig sein, aber schaden tut es auch nicht.
Dass manche Rechner sich aufhängen, könnte damit zusammenhängen, muss es aber nicht (eigentlich sollte da ja auch der Scheduler eingreifen). Man kann auch einfach mal ein bisschen CPU-Zeit mit einem yield() Aufruf abgeben, ohne dass man damit die FPS auf einen festen Wert limitiert.
02/16/2015 19:54 XxharCs#10
Wie viel zeichnest du, und in welchen Methoden bzw. mit welchen Methoden zeichnest du?
02/16/2015 23:42 xEncounter#11
Meine jetzige Render Methode:

Code:
public void render(GameContainer gc, StateBasedGame game, Graphics gfx)
			throws SlickException {

		// Set Standard Color
		gfx.setColor(Color.white);

		// Draw Background at Position (0/0)

		this.level.draw();

		// Bird draw(height/width)

		this.bird.draw(50, 100);

		// Draw cloud

		this.cloud.draw();

		// Score String
		gfx.drawString("Points: " + highscore.getScore(), 10, 70);

		// Life String
		gfx.drawString("Life: " + car.getLife(), 10, 90);

		// Draw Player
		this.car.draw();

		// check if list schuss_anzahl is not empty and draws the objects
		// then
		if (!(this.shoot_count.isEmpty())) {
			for (Shot shoot_now : shoot_count) {
				shoot_now.draw();
				// gfx.draw(shoot_now.getHitbox());
			}
		}

		// checks if list monster_anzahl is not empty and draws the objects then
		if (!(this.rocket_count.isEmpty())) {
			for (Rocket rocket_now : rocket_count) {
				rocket_now.draw();
				// gfx.draw(rocket_now.getHitbox());
			}
		}
		
		this.hud.draw();
// gfx.draw(car.getHitbox());
	}
02/17/2015 08:40 XxharCs#12
Ich weiß jetzt nicht genau wie deine draw-Methoden aufgebaut sind, aber generell zu sagen ist, man sollte Image's startUse/drawEmbedded/endUser für bessere Perfomance mit sprite sheets verwenden, oder stratUse/renderInUse/endUse falls du Slick's sprite sheet utility verwendest.

Oder falls deine tiles undurchsichtig sind kann man die perfomance ebenfalls erhöhen/verbessern indem man blending aus-und einschaltet.
Also:
Code:
GL11.glDisable(GL11.GL_BLEND);
// -- zeichne deine tiles --
GL11.glEnable(GL11.GL_BLEND);
// -- zeichne anderes --
Eine weitere Möglichkeit wär, gewisse Bilder in ein einzig großes Texture zu laden & speichern(behalte das Texture solange das Programm läuft), und verwende es immer wieder neu beim rendern jedes einzelnen Frames. Die richtigen "Items"(nenne ichs jetzt, will ja jetzt ned Auto, Charackter usw erwähnen) zum rendern können dann so selektiert werden indem man die richtigen Texture koordinaten angibt.