• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Ist JS langsamer, wenn es über das Netz aufgerufen wird

Yogilein

Member
Hallo,

heute ist mir folgendes aufgefallen:

rufe ich mit FF (neueste Version) mein neuestes Spiel direkt ohne Netz auf (file:///...) und umrunde einmal das Spielfeld, benöte ich 7s. Mache ich das Gleiche übers Web (www - SpeedParking (internetted by ID.KOM)....) brauche ich 10s, also über 40% länger.

Das verstehe ich überhaupt nicht, denn zu diesem Zeitpunkt ist doch alles komplett geladen.

Bei Chrome z.B. ergibt sich kein Unterschied: jedesmal 7s.

Daher meine Frage: Wieso braucht FF übers Netz soviel länger?

PS: Ich habe dies ins Unterforum Javscript geschrieben, da meine Bewegung über JS relisiert wird.
 
Nein, beide Testversionen sind zu 100% identisch.

Die finale Echtversion ist in PHP, aber das dürfte auch nichts ausmachen, da das PHP auf dem Server ausgeführt wird.

Und jetzt kommt's: Gerade übers Netz mit dem uralten Safari für Windows getestet: 7s.

Ebenfalls 7s: Chrome, Edge und Opera

Nur FF braucht 10s übers Netz.
 
Jetzt wird's komisch.

FF zurückgesetzt und siehe da: Eine Umrundung übers Netz = 7s

aber

die Entwickler-Symbolleiste zeigte mir unendlich viele Fehler an ---> Schreck

aber

alle Fehler waren nur Warungen das CSS betreffend, da FF nicht alle Anweisungen versteht, u.a. best. Pseudoklassen oder Anweisungen wie z.B. "-webkit-user-select:none;"

Daraufhin habe ich FF erneut zurückgesetzt und Gott sei Dank, es kommen keine Fehlermeldungen mehr,

aber

eine Umrundung dauert wieder 10s.
 
aber ohne Internetanbindung
Wirklich gar keine Verbindung oder Seite einfach nur lokal geladen?

Jetzt wird's komisch.
Da hast du Recht.

Aber die Wiederholungsrate von keydown würde ich auch nicht für deine Animation/Bewegung verwenden. Ich würde eher so etwas machen, dann ist das immer gleich schnell - auch wenn der Browser mal kurz hängt:
Code:
<!DOCTYPE html>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Fenstertitel</title>
<script type="text/javascript" src="//kkjs.kkapsner.de/modules/kkjs.load.js"></script>
<style type="text/css">
#kugel {
	border: 1px solid darkred;
	background-color: red;
	border-radius: 100%;
	width: 20px;
	height: 20px;
	position: absolute;
	top: 200px;
	left: 200px;
	transition-property: top left;
	transition-duration: 0.1s;
	transition-timing-function: linear;
}
</style>
</head>
<body>
<div id="kugel"></div>
<script type="text/javascript">
(function(){
	var k = kkjs.$("kugel");
	var keysDown = {
		up: false,
		down: false,
		left: false,
		right: false,
		count: 0
	};
	
	["up", "down", "left", "right"].forEach(function(dir){
		kkjs.event.add.key(document, dir, "down", function(){
			if (!keysDown[dir]){
				var wasFirstKey = keysDown.count === 0
				keysDown[dir] = true;
				keysDown.count += 1;
				if (wasFirstKey){
					startAnimation();
				}
			}
		});
		kkjs.event.add.key(document, dir, "up", function(){
			if (keysDown[dir]){
				keysDown[dir] = false;
				keysDown.count -= 1;
				if (keysDown.count === 0){
					stopAnimation();
				}
			}
		});
	});
	
	var p = new kkjs.Math.Position(200, 200);
	function move(){
		if (keysDown.up) p.top -= 20;
		if (keysDown.down) p.top += 20;
		if (keysDown.left) p.left -= 20;
		if (keysDown.right) p.left += 20;
		kkjs.css.set(k, p);
	}
	
	var frameDuration = 100;
	var lastCall = false;
	function frameScript(){
		if (lastCall){
			var now = Date.now();
			while (now - lastCall >= frameDuration){
				lastCall += frameDuration;
				move();
			}
			window.requestAnimationFrame(frameScript);
		}
	}
	function startAnimation(){
		lastCall = Date.now() - frameDuration;
		frameScript();
	}
	function stopAnimation(){
		lastCall = false;
	}
}());
</script>
</body>
</html>
 
Vielen Dank für die großartige Lösung.

Allerdings schaffe ich es nicht, sie in mein Spiel einzubauen. Liegt wohl an meiner Clousure-Struktur. Daher werde ich eine abgespeckte Version einbauen, die ich bereits ausgetestet hatte, aber nicht das FF-Problem beseitigte.

Bei meiner Funktion muss ich leider mit setTimeout arbeiten, da irgendwie das requestAnimationFrame nicht funktioniert.

Bez. meines FF-Problems bin ich etwas weitergekommen:

Ich habe bei jeder Bewegung, also bei einer Umrundung 134 mal die Anzeige der Minen aktualisiert. Aktualisiere ich nur noch, wenn sich der Wert geändert hatdauert eine Umrundung übers Netz 7s.

Nur, das verstehe ich nicht, denn eine Aktualisierung der Anzeige mit Child.NodeValue dauert in einer 10000er-Schleife nur 1ms (zum Vergleich: innerHTML = 21ms). Warum benötigen dann 134 Aktualisierungen 3s??? Und warum auch nur dann, wenn es über das Netz geht??? Was mach da FF nur???

Und außerdem zeigt FF wieder permanet Fehler an, obwohl es nur Warnungen sind. Hoffentlich kommt bald ein Update.

Und, ich habe dieses Verhalten jetzt auf 3 unterschiedlichen Rechnern getestet, immer mit dem gleichen Ergebnis.
 
Ich habe bei jeder Bewegung, also bei einer Umrundung 134 mal die Anzeige der Minen aktualisiert. Aktualisiere ich nur noch, wenn sich der Wert geändert hatdauert eine Umrundung übers Netz 7s.
Das klingt doch nach einer guten Lösung.

Warum benötigen dann 134 Aktualisierungen 3s??? Und warum auch nur dann, wenn es über das Netz geht??? Was mach da FF nur???
Alles gute Fragen, auf die wahrscheinlich nur jemand, der tief in der FF-Engine (Gecko) drin ist, Antworten hat...
 
Ich bin mir jetzt ziemlich sicher, das FF-Problem erkannt zu haben. Es scheint mal wieder am Rendern zu liegen. Ich kann in die Schleife 100 Befehle packen, und es funktioniert weiterhin. Aber sobald ich einen Befehl mit einer Bildschirmausgabe hineinpacke, fängt FF an zu stottern, selbst wenn der Befehl nur den Bruchteil eine Millisekunde benötigt. Ich habe jetzt schon alles ausprobiert, um das zu verhindern, ich schaffe es nicht.

Was ich gemacht habe:

  • Ausgabe per firstChild.nodeValue ode innerHTML
  • Den Ausgabebefehl in eine eigene Funktion gepackt
  • Den Ausgabebefehl über setTimeout aufgerufen

Alles hat nichts gebracht, wobei sonderbarerweise es ohne Netz immer geht, also wenn ich das Spiel direkt vom Laufwerk aus starte. Ich vermute, dass Firefox in diesem Fall, warum auch immer, anders rendert.

Momentan habe ich meine eigene Variante eingebaut, die nicht mehr von der Tatsturwiederholrate abhängig ist. Diese bleibt nur noch immer dann kurz hängen (fast kaum merkbar), wenn ich meine Anzeige aktualisieren muss. Optimal ist es noch nicht, aber vielleicht komme ich irgendwann auf die ultimative Lösung.
 
Zurück
Oben