@JCL: Ich habe gestern Abend noch ein wenig mit dem "Ruckler"-Problem experimentiert, und habe dabei ein paar interessante Dinge herausgefunden.


Beschreibung der Testumgebung:
Im Testlevel gab es 3 Entities: den Player (mit Movement-Skript), ein Boden-Model mit einer eher kleinen Skin, und ein Test-Model mit einer sehr großen Skin (4096x4096).

Meine Grafikkarte unterstützt 512 MB, also gab es im Testlevel keinen Grund warum z.B. Grafikspeicher ausgelagert werden sollte (der Speicherbedarf von meinem Level lag bei höchstens 20 MB).

Im Level blickte die Kamera (der Player) zunächst nicht in Richtung des Test-Models. Erst durch Drehen des Players mit der Maus in Richtung des Test-Models wird das Test-Model im Spiel sichtbar. Dadurch konnte ich testen, ob es im laufenden Spiel zu einem "Ruckler" kommt, wenn das Test-Model erstmals sichtbar wird.

Alle Entities wurden direkt im WED plaziert - also nicht per ENT_CREATE erstellt.




1. Testlauf:
Das Test-Model hatte KEINE Mipmaps. Und es war auch keine Action für das Model hinterlegt.

Ergebnis: Sobald das Test-Model sichtbar wurde, kam es zu einem "einfrieren" des Spieles für die Dauer von ca. 4 Sekunden. Also eine extrem lange Ruckel-Zeitdauer.

Schlussfolgerung: Das was im Handbuch steht kann nicht ganz stimmen ("Video memory is automatically preallocated for entities placed in the current level") - also dass für alle Entities im Level auch Videospeicher reserviert wird. Offensichtlich wird der Videospeicher auch bei Entities, die mit dem Level mitgeladen wurden, erst dann reserviert/zugewiesen wenn die Entity zum ersten mal sichtbar wird.




2. Testlauf:
Diesmal wurde beim Model eine Action hinterlegt, welche direkt auf die Textur zugreift.
Code:
font_bmp_src = bmap_for_entity(my,0);
font_format_src = bmap_lock(font_bmp_src,0);
if (font_format_src >= 565) { bmap_unlock(font_bmp_src); }


Ergebnis: Wie ich erwartet hatte, wurde jetzt die Textur in den Videospeicher übertragen. Somit gab es jetzt auch kein Einfrieren mehr.
Allerdings gab es immer noch einen sehr kurzen "Ruckler" (für die Dauer von ca. 1/10 Sekunde). Auch diesen kurzen Ruckler gab es allerdings nur dann, wenn das Model zum ERSTEN MAL sichtbar wurde.




3. Testlauf:
Diesmal wurde in der Model-Action ein ENT_PRELOAD gemacht:
Code:
 ent_preload(my);


Ergebnis: Das Ergebnis sah genauso aus wie bei Test 2. Es gab nur einen ganz kurzer Ruckler für die Dauer von ca. 1/10 Sekunde.




4. Testlauf:
Um herauszufinden, ob diese kurze Verzögerung etwas mit den Mesh-Daten zu tun haben könnte, habe ich nun in der Action zusätzlich noch eine Vertex-Position verändert:
Code:
ent_preload(my);
wait(1); //Nur zur Sicherheit

vec_for_mesh(temp,my,1); //Vertexposition ermitteln
vec_scale(temp,2); //Neue Position berechnen
vec_to_mesh(temp,my,1); //Vertex an neue Position verschieben


Ergebnis: Das Ergebnis sah genauso aus wie bei Test 2 oder 3. Es gab immer noch den kurzen Ruckler für die Dauer von ca. 1/10 Sekunde.




5. Testlauf:
Diesmal habe ich ein Test-Model benutzt welches auch Mipmaps hat. Das Ergebnis war jedoch das gleiche.




6. Testlauf: - jetzt wird es spannend
Diesmal habe ich wieder ein Model ohne Mipmaps benutzt. Aber ich erstelle die MIPMAPS im LAUFENDEN SPIEL.
Und genau das dürfte auch der Grund sein, warum das ENT_PRELOAD bei mir NIE funktioniert.
Damit mein Demospiel nicht so viel Platz auf der Festplatte benötigt, erstelle ich nämlich die Mipmaps erst im laufenden Spiel.

Hier das Coding:
Code:
ent_preload(my);
wait(1); //Nur zur Sicherheit

bmap_to_mipmap(bmap_for_entity(my,0)); //Jetzt wird die Mipmap erstellt


Und siehe da: plötzlich habe ich wieder die lange Wartezeit von 4 Sekunden, sobald das Model zum ersten mal sichtbar wird.
Und egal ob ich das ENT_PRELOAD vor oder nach dem Erstellen der Mipmaps mache ... das Ergebnis ist immer das gleiche.
Sobald im laufenden Spiel eine Mipmap erstellt wird, gibt es danach eine lange Verzögerung, sobald das Model zum ersten mal sichtbar wird.

Das sieht mir irgendwie nach einem Fehler aus, oder?


Und warum ich in ALLEN meinen Testfällen JEDESMAL zumindest eine sehr kurze Verzögerung habe, ist mir auch ein Rätsel. Eventuell liegt es ja auch an der Grafikkarte?!?!

Schön wäre es jedenfalls, wenn man auch die kurzen Ruckler wegbekommen könnte. Solange das nicht geht, muss ich weiterhin meinen Kamera/Panel-Trick anwenden, auch wenn das keine sehr schöne Lösung ist.


Liebe Grüße,
Thomas