Ruckler bei DDS-Dateien

Posted By: Wicht

Ruckler bei DDS-Dateien - 04/26/07 06:56

Guten Tag ...

Ich verwende DDS-Dateien für meine Modelle. Dabei ist mir aufgefallen, dass, sobald die Modelle das erste mal von der Kamera erfasst werden, es doch merkliche "Ruckler" gibt. Bei bmp- bzw. tga-Dateien tritt der Effekt nicht auf.

Meine einzige Vermutung wäre, dass die DDS-Dateien erst noch, da diese ja komprimiert sind, zur Laufzeit "entpackt" werden müssen. Ist das richtig?

Gibt es eine Möglichkeit, diese anfänglichen "Ruckler" zu umgehen?
Posted By: jcl

Re: Ruckler bei DDS-Dateien - 04/26/07 08:24

Nein, DDS-Dateien werden nicht entpackt - es sei denn, Sie haben eine uralte Grafikkarte, die noch keine DDS Texturen unterstuetzt. Ihr Ruckler hat vermutlich eine andere Ursache. Ruckler, die beim ersten Darstellen eines Modells auftreten, lassen sich per ent_preload vermeiden.
Posted By: Wicht

Re: Ruckler bei DDS-Dateien - 04/26/07 09:01

Ich habe eine ATI Radeon X1900 GT. Die sollte normalerweise DDS-Dateien verwenden können.
Die Anweisung ent_preload hat grösstenteils Abhilfe geschafft. Danke für den Hinweis.
Trotzdem ist es verwunderlich, dass die Ruckler bei BMPs und TGAs, deren Speicherplatzverbrauch ja deutlich grösser ist, nicht auftritt.
Hinweis: Ich habe das bei zwei 100% identischen Szenen ausprobiert. Der einzige Unterschied sind die verwendeten Texturen ( BMPs/TGAs bzw. DDS ).
Posted By: ello

Re: Ruckler bei DDS-Dateien - 04/26/07 10:12

jcl, das errinnert mich an das problem welches ich gestern per email geschickt habe
Posted By: HeelX

Re: Ruckler bei DDS-Dateien - 04/26/07 12:12

Welches?

Ich pumpe im moment ca 40 MB Grafik (DDS) beim level load in den Speicher - was zu unglaublichen Ruckeln führt. Aber ich hab ich lasse alle relevanten Entities per ent_preload(my); kurz preloaden und sofort habe ich alles "flüssig" zur Verfügung.
Posted By: ello

Re: Ruckler bei DDS-Dateien - 04/26/07 12:16

wie willst Du ein ent_preload für eine entity machen die noch gar nicht per my verfügbar ist?

ich benutze z.b. ent_create und wie soll ich sowas mit nem preload versehen? ich glaube aber die ursache muss woanders liegen, in meinem fall ists ne winzige(lowpoly) entity mit ner unwesentlichen skin
Posted By: Damocles

Re: Ruckler bei DDS-Dateien - 04/26/07 12:21

Dann lade Doch am levelanfang alle Modelle, und zerstöre sie sofort wieder.
Dann ist aber die Modeldatei schon im Speicher.
(allerdings weiss ich nicht, ob Modell-Dateien, die keine Referenz haben,
gleich wieder aus dem Speicher gelöscht werden)
Posted By: ello

Re: Ruckler bei DDS-Dateien - 04/26/07 12:22

ists nicht. das hatte ich schon. es ist im übrigen immer das gleiche modell das geladen wird. hatte auch schon eines in wed außerhalb des sichtbereiches platziert. trotzdem ruckelts beim ent_create
Posted By: Damocles

Re: Ruckler bei DDS-Dateien - 04/26/07 12:36

Ich glaub das der Renderer erst das Modell läd, wenn es in den Sichtbaren bereich tritt.
Deswegen ja die Ruckler, wenn man durch ein schon fertig geladenes Level läuft.

Also müssten Die Modelle vor! der Kamera platziert werden beim laden.
Man könnte das ja hinter einem Schwarzen Panel am Anfang verbergen.
Posted By: ello

Re: Ruckler bei DDS-Dateien - 04/26/07 12:46

ja das werd ich mal probieren, aber ist doch kokulores, oder?? vll. wäre es sinnvol einen optionalen preload bei der definition des strings für ent_create?
Posted By: Wicht

Re: Ruckler bei DDS-Dateien - 04/26/07 12:55

Was allerdings noch nicht erklärt, warum dieses nur bei DDS auftritt und eben nicht bei BMPs oder TGAs ...
Posted By: ello

Re: Ruckler bei DDS-Dateien - 04/26/07 13:00

bei mir tritt es auch bei tga auf:)
Posted By: Wicht

Re: Ruckler bei DDS-Dateien - 04/26/07 13:06

Damit habe ich weniger Probleme. Deswegen wundere ich mich ja.
DDS-Dateien sind doch wesentlich kleiner. Entsprechend sollte es ja dort weniger ruckeln.
Posted By: ello

Re: Ruckler bei DDS-Dateien - 04/26/07 13:11

ich glaube die größe bezieht sich nur auf den datei umfang. die auflösung und die bittiefe sind nachher ja wieder gleich groß
Posted By: jcl

Re: Ruckler bei DDS-Dateien - 04/26/07 13:16

Bei dem Minigame, das Sie mir geschickt hatten, habe ich den Eindruck, es liegt nicht an ent_create, sondern an Ihrem Ogg-Sound. Allerdings ist das anhand eines Games sehr schwer zu sagen, ohne dass man massiv am dem Code herumtestet und herumbastelt. Sie koennten bei solchen Problemen zum Ursachefinden und Optimieren ein spezielles Testlevel (kein Game) erstellen, welches in einer Schleife nur die verdaechtige Aktion ausfuehrt.

Generell gilt:

- ent_create laedt das Modell und fuehrt das erste Mal zu einem Disk-Zugriff. Wenn das Modell einmal geladen ist, aendern weitere ent_creates nur nur etwas an der internen Datenbank und fuehren zu keiner Zeitverzoegerung mehr.

- Wenn die Entity das erste Mal sichtbar wird, wird das Mesh und die Textur erzeugt. Je nach 3D-Hardware kann das zu einer Verzoegerung fuehren, auf die die Engine natuerlich keinen Einfluss hat. Simple Abhilfe: die Entity mit ent_preload erzeugen.

ent_preload(ent_create(...

- Heisse Kandidaten fuer Verzoegerungen sind auch alle Anweisungen, die Diskzugriffe durchfuehren oder etwas dekomprimieren (z.B. Movies oder Ogg-Sounds).
Posted By: Wicht

Re: Ruckler bei DDS-Dateien - 04/26/07 13:39

Selbst mit ent_preload kam es zu Rucklern. Allerdings wesentlich weniger.

Im Handbuch steht nichts darüber, ob ent_preload einen Wert zurückliefert.
Dann könnte man z.B. ein Menü oder einen Ladebildschirm erst dann entfernen, wenn alle Preloads abgeschlossen wurden.
Posted By: ello

Re: Ruckler bei DDS-Dateien - 04/26/07 13:44

wie lädt man denn eine entity mit ent_preload, wenn diese noch gar nicht existiert, bzw. mit ent_create erzeugt wird?
Posted By: Wicht

Re: Ruckler bei DDS-Dateien - 04/26/07 13:48

@ello: Die inneren Funktionen werden doch vor den äußeren ausgeführt. Die Anweisung von jcl sollte passen.

Ich nehme an, dass ent_create ein handle (bzw. Entity/Entity-Pointer)zurückliefert, mit welchem ent_preload etwas anfangen kann.
Posted By: ello

Re: Ruckler bei DDS-Dateien - 04/26/07 13:59

also müsste in meine entity funktion "ent_preload(me);" ??
Posted By: Wicht

Re: Ruckler bei DDS-Dateien - 04/26/07 14:11

Ich hab's heute ausprobiert. In der Aktion steht ent_preload(me);
Wenn Du aber eine entity zur Laufzeit erzeugen willst, bindest Du die ent_create-Funktion in die ent_preload-Funktion ein.

Also z.B. ( sofern ich es richtig verstanden habe ) ...

ent_preload(ent_create("irgendwas.mdl", nullvector, entitiy_funktion_irgendwas));
Posted By: Harry Potter

Re: Ruckler bei DDS-Dateien - 04/26/07 14:28

Quote:

- ent_create laedt das Modell und fuehrt das erste Mal zu einem Disk-Zugriff. Wenn das Modell einmal geladen ist, aendern weitere ent_creates nur nur etwas an der internen Datenbank und fuehren zu keiner Zeitverzoegerung mehr.

- Wenn die Entity das erste Mal sichtbar wird, wird das Mesh und die Textur erzeugt. Je nach 3D-Hardware kann das zu einer Verzoegerung fuehren, auf die die Engine natuerlich keinen Einfluss hat. Simple Abhilfe: die Entity mit ent_preload erzeugen.




@JCL: Ich glaube nicht, dass ENT_PRELOAD eine Lösung für das Problem mit den Verzögerungen ist.

Mit ENT_PRELOAD wird doch nur der DISK-ZUGRIFF durchgeführt. ENT_PRELOAD erzeugt ja noch nicht die Textur bzw. kopiert die Textur noch nicht in den Grafikkartenspeicher.

Und die Aussetzer/Verzögerungen entstehen ja hauptsächlich dadurch, dass große Texturen in den Grafikkartenspeicher kopiert werden müssen (das dauert bei meiner Grafikkarte bis zu 4 Sekunden bei Texturgrößen von 4096x4096 Pixel!).
Und dieses Kopieren passiert ja erst dann, wenn das Model zum ersten mal am Bildschirm sichtbar wird. Ein zuvor durchgeführtes ENT_PRELOAD hilft da gar nichts.

Noch dazu kommen diese Aussetzer ja auch bei Models vor, die mit dem Level geladen wurden (also nicht per ENT_CREATE erstellt wurden). Und in diesem Fall bräuchte man ja gar kein ENT_PRELOAD zu benutzen.


Die einzige Lösung, um diese Aussetzer zu vermeiden, ist momentan folgende:

- Man muss die Models am Beginn vom Spiels kurz sichtbar werden lassen. Ich löse das meistens so, dass ich gleich nach dem Laden des Levels die Kamera zunächst für kurze Zeit so positioniere, dass alle Models im Level für die Kamera sichtbar sind. Das ganze passiert natürlich verborgen hinter einem Panel.


Schön wäre es allerdings, wenn es einen Befehl (oder einen zusätzlichen Parameter beim ENT_PRELOAD) gäbe, mit dem man steuern könnte, dass auch die Textur/Skin erstellt bzw. in den Speicher kopiert wird. Also OHNE dass das Model zuvor SICHTBAR werden muss.


Freundliche Grüße,
Thomas
Posted By: HeelX

Re: Ruckler bei DDS-Dateien - 04/26/07 14:42

@Thomas

also ich habe hier ein Dutzend 2048x2048 DDS files die ich in Modellen (die Textur ist extern verlinkt!) über die WMB lade. Wenn ich kein ent_preload ausführe, dann ladet das level und wenn ich einmal die Kamera drehe, dauert der nächste Frame entsprechend lange, weil die engine da erst die Texturen läd (also das dauert schon recht lange..)

Ich benutze nur die folgende function, die den entities zugewiesen ist (also die ist den entities direkt im WED zugeteilt):

Code:

void veg_meshLndscChunk ()
{
setMATERIAL(my, mat_landscape);
set(my, PASSABLE);
ent_preload(my);
}



Und wenn das level geladen wird, wird sofort preloaded. Und ich hab kein Ruckeln mehr.
Posted By: jcl

Re: Ruckler bei DDS-Dateien - 04/26/07 15:23

Harry: Handbuch lesen! http://manual.conitec.net/aent_preload.htm. Von Ihrer Kamera-Methode rate ich ab.

- Ich koennte eine globale Variable level_preload implementieren, die bei ent_create automatisch ein ent_preload durchfuehrt. Dies wuerde solche problemloesungen vereinfachen.
Posted By: Loopix

Re: Ruckler bei DDS-Dateien - 04/26/07 15:45

Ausgezeichnet! Kommt bestimmt noch mit dem nächsten stable A6 release...oder?
Posted By: Harry Potter

Re: Ruckler bei DDS-Dateien - 04/26/07 17:44

Quote:

Harry: Handbuch lesen! http://manual.conitec.net/aent_preload.htm. Von Ihrer Kamera-Methode rate ich ab.



@JCL: Ich habe das Handbuch schon so oft gelesen, dass ich es schon fast auswendig kann.

Tatsache ist jedenfalls, dass diese "Ruckler" auch dann auftreten, wenn ich zuvor ein ENT_PRELOAD mache. Und die "Ruckler" gibt es sogar dann, wenn ich im Spiel KEIN EINZIGES Model mit ENT_CREATE erstelle - alle Models werden direkt mit dem Level geladen.

Und im Handbuch steht doch: "Video memory is automatically preallocated for entities placed in the current level"

Daraus schließe ich, dass es diese "Ruckler" gar nicht geben dürfte, wenn alle Models direkt mit dem Level geladen werden (also nicht mit ENT_CREATE). Aber es gibt sie trotzdem!!! Das ganze bemerkt man allerdings erst bei sehr großen Texturen (ab 2048 x 2048)!!!

ENT_PRELOAD verkürzt beim ENT_CREATE zwar diese Ruckler-Zeit (also die Zeit, die der Level sozusagen "einfriert"). Aber es gibt dennoch einen "Ruckler", wenn eine Entity zum ersten mal sichtbar wird (egal ob MIT oder OHNE ENT_PRELOAD). Die Dauer des Rucklers hängt von der Texturgröße ab. Bei 512x512 oder 1024x1024 ist bei meinem PC kaum eine Verzögerung bemerkbar, bei 2048x2048 liegt die Verzögerung unter einer Sekunde, und bei 4096x4096 bei ca. 4 Sekunden. Erst wenn die Entities zum ersten mal sichtbar werden (sich also im Camera-Blickfeld befinden), gibt es daraufhin keine "Ruckler" mehr.


Sorry, aber ich bin fest der Überzeugung, dass das was im Handbuch steht, daher so nicht ganz stimmen kann.


Freundliche Grüße,
Thomas
Posted By: Harry Potter

Re: Ruckler bei DDS-Dateien - 04/27/07 13:29

@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
Posted By: jcl

Re: Ruckler bei DDS-Dateien - 04/27/07 14:05

Für den kurzen Ruckler gibt es eine moegliche Erklärung: Nicht nur die Textur, sondern auch das Mesh muss allociert werden - das geht allerdings normalerweise viel schneller als die Texture. Probieren Sie aber ent_mesh() vor oder nach ent_preload.

Fuer das Mipmap-Problem hingegen habe ich keine rechte Erklaerung. Es ist aber klar, dass Ihr Code oben nichts bringt - Sie muessen ent_preload _nach_ und nicht vor der Mipmap-Erzeugung aufrufen, denn die Textur hat sich ja jetzt geaendert.

Auch beim Aendern von Texturformaten, Alphakanal usw. muss ent_preload nach und nicht vor der jeweiligen Aenderung aufgerufen werden.
Posted By: Harry Potter

Re: Ruckler bei DDS-Dateien - 05/02/07 09:32

@JCL: Danke für die Antwort. Mittlerweile glaube ich, dass ich das Problem eingrenzen konnte.

Es dürfte etwas mit den MIPMAPS zu tun haben. Kann es sein, dass der Speicher für die Mipmaps immer erst dann allociert wird, wenn das Model zum ersten mal sichtbar ist?
Dass also ENT_PRELOAD beim Speicher-Zuordnen sozusagen nur die Haupt-Textur berücksichtigt, jedoch auf die Mipmaps "vergisst"?!

(Anmerkung: Da der Ruckler nur sehr kurz ist, kann ich mir auch vorstellen, dass aufgrund eines Programmfehlers z.B. auch einfach nur die letzte/kleinste Mipmap nicht allociert wird.)


Ich hatte nämlich am Wochenende ein paar Tests mit unterschiedlichen Models und unterschiedlichen Skin-Grafikformaten gemacht (Bitmap-Skins, TGA-Skins und DDS-Skins).
Und dabei ist mir aufgefallen, dass es den kurzen Ruckler NICHT GAB, wenn das Model keine Mipmaps hatte. Vorausgesetzt dass man zuvor ein ENT_PRELOAD verwendet hat.

Also kurz zusammengefasst:
- Bei ENT_PRELOAD mit Models OHNE Mipmap gibt es keine Ruckler.

- Bei ENT_PRELOAD mit Models welche eine Mipmap haben (oder bei externen DDS-Texturen, bei denen ja offensichtlich automatisch eine Mipmap erstellt wird?!) gibt es jedoch immer einen kurzen Ruckler, wenn das Model erstmals sichtbar wird.


Quote:

Für den kurzen Ruckler gibt es eine moegliche Erklärung: Nicht nur die Textur, sondern auch das Mesh muss allociert werden - das geht allerdings normalerweise viel schneller als die Texture



Bei meinem Testlevel kann das Mesh jedoch nicht das Problem gewesen sein - mein Test-Model hatte nämlich nur 2 Polygone.
Außerdem (siehe oben) gibt es KEINEN Ruckler, wenn das Model keine Mipmaps besitzt.


Quote:

Es ist aber klar, dass Ihr Code oben nichts bringt - Sie muessen ent_preload _nach_ und nicht vor der Mipmap-Erzeugung aufrufen, denn die Textur hat sich ja jetzt geaendert.



Ich hatte BEIDES ausprobiert (also ENT_PRELOAD vor und nach der Erstellung der Mipmaps) - das KURZE "Ruckel"-Problem hatte ich aber in BEIDEN Fällen.



Mit freundlichen Grüßen,
Thomas
Posted By: jcl

Re: Ruckler bei DDS-Dateien - 05/02/07 10:06

Ent_preload allociert definitiv auch alle Mipmaps. Moeglicherweise aber passiert innerhalb der DirectX-Bibliothek oder des Videotreibers irgendetwas mit den Mipmaps, das von ent_preload nicht beeinflusst wird. Das wuerde den Rucker erklaeren, dann aber muesste er eigentlich bei saemtlichen DirectX-Andwendungen auftreten. Oder es gibt doch irgendeinen Trick, ihn zu vermeiden.

Ich werde mal in der Richtung nachforschen und nachfragen.
Posted By: Harry Potter

Re: Ruckler bei DDS-Dateien - 05/02/07 10:26

Okay, danke.
Posted By: gri

Re: Ruckler bei DDS-Dateien - 05/03/07 08:56

fftopic

hi harry,

wie stehts eigentlich um dein "photorealistisches Mittelalter" -Project ?
Arbeitest du noch daran ?

, griller
Posted By: Harry Potter

Re: Ruckler bei DDS-Dateien - 05/03/07 09:55

@gri: Klar arbeite ich noch daran. Da es offtopic ist, schicke ich Dir etwas später eine PM.
© 2024 lite-C Forums