Hier gibt es ein paar Unklarheiten über ein Paper.
In diesem Paper wird ab Seite 35 eine Methode beschrieben, um Indexdaten von Dreiecksmeshes zu komprimieren. Die Methode selbst entspricht so einer Art RLE-Encoding … ich zitiere einfach mal ein Beispiel. Das hier sind die Indizes:
Code: Alles auswählen
0 1 2
0 2 3
3 2 4
Code: Alles auswählen
new 0 new 1 new 2
prev0 prev2 new 3
prev2 prev1 new 4
Soweit, sogut. Jetzt das eigentliche Problem … auch hier zitiere ich wieder das Paper:
Okay. Wie soll das denn bitte gehen!?85% compression
6.5 : 1
Überschlagen wir das Ganze mal:
– Ein unkomprimierter Index ist 18 Bits groß. Zwei um zu markieren, dass er „frisch“ ist sowie 16 für die Zahl selbst.
– Ein komprimierter Index ist zwei Bits groß.
– In zwei Dreiecken sind immer mindestens zwei der drei Indizes unterschiedlich, denn sonst wäre es dasselbe Dreieck.
Selbst wenn wir nun davon ausgehen, dass immer nur der beste Fall eintritt und die Indizes perfekt regelmäßig wären (toller Optimizer, Rotation usw), würde das bedeuten, dass zwei Drittel aller Indizes zwei Bits groß sind und ein Drittel 18 Bits. Das macht im Schnitt 1 1/3 + 6 = 7 1/3 Bits pro Index – oder eine Kompression von 2,18 : 1.
Wie kommt das Paper nun auf die dreifache Kompression?!?
Selbst in dem Beispiel aus dem Paper lassen sich nur 11 von 24 Indizes komprimieren. Ich habe das selbst mal getestet und bei einem gewöhnlichen Mesh, mit Assimps Locality-Improver geladen, liegen die tatsächlich komprimierbaren Indizes bei rund 50%. Das geht eher auf eine Kompression von 1,7 : 1 zu.
Ich habe die Methode ein wenig erweitert: Bei mir markiert ein einziges Bit, ob der Index komprimiert ist, oder nicht. Bei komprimierten Indizes folgen dann n weitere Bits um 2^n vorherige Indizes wiederzuverwenden. Mal meine Kompressionsraten mit verschiedenen ns:
Zwei Bits: 62% komprimierbar, Kompression 1,78 : 1
Drei Bits: 70% komprimierbar, Kompression 1,87 : 1
Vier Bits: 75% komprimierbar, Kompression 1,81 : 1
Fünf Bits: 76% komprimierbar, Kompression 1,69 : 1
Also, habe ich da etwas fundamental falsch verstanden oder ist 6,5 : 1 einfach aus der Luft gegriffen?
Gruß, Ky