Das Problem ist, dass du dein Skript mit Absicht langsam machst.
alle 10ms sagst du dem Browser, dass er das Dokument neu nach den Elementen durchsuchen soll, obwohl du die Elemente schon beim erzeugen hast, also nicht mehr mit getElementBy... suchen musst.
Ich hab in der Schleife gar kein getElementBy... drinnen, dort greife ich nur über this.obj... zu. Das getElementBy... hab ich in der Initialschleife, die am Anfang alle Objekte erzeugt. Die läuft nur zu Beginn einmal durch, dann nicht mehr.
Naja, gut auch das ist doppelt gemoppelt, du erzeugst dein Objekt und dann holst du das Objekt.
Ich hab's mal schnell umgesetzt:
http://jstruebig.de/web/javascript/spielereien/schneeflocken/schneeflocken.html
geht bei mir auch mit 250 Flocken.
Wow, das hat ja viermal mehr Variablen als meins und ist viel schwieriger. Ich bin ja auch noch ein relativer Neuling (das "prototype" hab ich beispielsweise noch nie gesehen), aber wenn ich das meiner Schwester zu erklären versuche, haut sie ab *g*. Aber auch das zieht sich bei mir ganz schön, ich glaub mein PC ist einfach zu langsam. Bei meiner Version (unten angehängt) hab ich Schneeflocken verschiedener Größen und die kleinen bewegen sich langsamer. Ausserdem bleiben die Schneeflocken nicht unten liegen, sondern bekommen dann ein neues Objekt zugewiesen und fangen wieder von oben an. Die geplante x-Achsen-Bewegung ist auskommentiert, aber es sieht auch ohne sehr lieb aus. (Leider kann ich hier die Schneeflockengrafik und Hintergrundbilder nicht mitschicken).
Aber natürlich, kannst du eine Animation innerhalb eines Browserfenster nicht mit einer, die du mit, DirectX programmierst vergleichen.
Was zur Hölle ist DirectX??? Ich programmiere in Assembler mit den POSIX-Standard Kernel-Interfaces, ohne irgendwelche Libraries.
Ich dachte du vergleichst ein Programm, dass unter einer Grafischen Oberfläche, direkt auf den Bildschirmspeicher zugreifen kann, mit dem Skript, dass im Browser läuft. Gibt es sowas auch unter Linux? POSIX ist ja nun was komplett anderes, oder?
Ja, wenn man unter Linux was Grafisches programmieren möchte, kann man das natürlich auch unter einer grafischen Oberfläche tun, dazu muss man halt entsprechende Libraries einbinden (manche von denen sind gar nicht aufgebläht, das läuft dann auch schon sehr schnell, aber es kommt drauf an welches man nimmt, man hat viel Auswahl). Oder aber man schenkt sich die Libraries ganz, nimmt nur den Kernel und greift direkt auf die Grafikkarte zu. Saukompliziert, und so viel Erfahrung hab ich damit auch noch nicht, aber schneller als das geht's nun wirklich nicht.
So, und hier mein Schneegestöber (nicht wundern, ich hab 'nen kleinen Zweierpotenzentick):
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Testseite</title>
<script type="text/javascript">
<!--
//<![CDATA[
var flocke = new Array(256);
function Flocke (num) {
this.obj = document.getElementsByTagName("div")[num];
this.obj.style.position = "absolute";
with (this.obj.firstChild)
width = height = Math.round (Math.random() * 16);
this.x = num * 2 + Math.round (Math.random() * 4);
this.y = 0;
this.z = this.obj.firstChild.width;
this.xi = 0;
}
function init () {
for (i = 0; i < 256; i++) {
var image = document.createElement("div");
image.appendChild(document.createElement("img"));
image.firstChild.src = "flocke.png";
document.body.appendChild(image);
flocke[i] = new Flocke(i);
flocke[i].y = Math.round (Math.random() * 256);
flocke[i].obj.style.top = flocke[i].y + "px";
}
mv();
}
function mv () {
for (i=0; i < 256; i++) {
with (flocke[i]) {
// xi += 0.01;
// if (xi > 360) xi = 0;
// obj.style.left = Math.round (x + (Math.sin(xi) * z)) + "px";
obj.style.left = x + "px";
obj.style.top = (y += ((z >> 2) + 1)) + "px";
}
if (flocke[i].y > 256) {
delete flocke[i];
flocke[i] = new Flocke(i);
}
}
window.setTimeout ("mv()", 200);
}
//]]>
//-->
</script>
</head>
<body bgcolor="#000040" onload="init()">
</body>
</html>