Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Farbrausch



noxon
03.06.2007, 08:59
Da in einem anderen Thread das Minigame Sumotori Dreams erwähnt wurde und dort anscheinend auch Leute von Farbrausch mitgewerkelt haben, habe ich mich mal wieder etwas umgesehen, ob es von denen mal wieder etwas Neues gibt.

Das sind die, die auch schon den 96 kb großen Ego-Shooter geschrieben haben oder den 64 kb großen C64 Emulator. Neben all diesen Dingen produzieren sie aber immer noch die besten Demos, die ich je gesehen habe und auch die Neuste Farbrausch ist wieder der absolute Knaller und hat auf der Breakpoint auch wieder den ersten Platz gemacht.

Die solltet ihr euch unbedgint einmal ansehen: fr-041: debris. (http://www.pouet.net/prod.php?which=30244)

Ich bin immer wieder erstaunt, wie viel die in so eine kleine Datei packen können. Natürlich ist bei denen nicht alles so klein, wie die 15 MB große und ebenfalls recht neue fr-055: 828 (http://pouet.net/prod.php?which=29739) zeigt. Allerdings ist die nicht so mein Fall. Die ist mir etwas zu ruhig.

foofi
03.06.2007, 09:17
@Noxon zum Thema Packen: wie funktioniert das packen eigentlich genau?

Und können beim Packen wichtige Dateien kaputt gehen bzw. gehen Dateien verloren oder werden beschädigt?

Born_Brainless
03.06.2007, 09:59
Der absolute Wahnsinn, wie können die Sowas in 180 kb packen?
Echt super Demo, ruckelt bei mir teilweise ganz schön^^

ev1lbert
03.06.2007, 10:07
ja sau uebel laggt bisschen bei mir =(

Bullet-time
03.06.2007, 10:22
Mh, dann probier ichs mit meinen 450 Mhz garnicht erst aus ;)

ev1lbert
03.06.2007, 10:28
xD solltest du echt nich ;)

noxon
03.06.2007, 10:40
Echt super Demo, ruckelt bei mir teilweise ganz schön^^
Bei mir seltsamerweise auch, aber die Framerate liegt immer zwischen 60 und 120 fps. Irgendwo muss da ein Timingproblem vorliegen oder so. Der Prozessor dürfte eigentlich auch nicht zu schwach sein. Schließlich wird dort keine Kollisionserkennung verwendet. Dann hätte ich es noch verstehen können.


Zum Thema Packen:
Es gibt grundsätzlich zwei verschiedene Arten des Packens. Eine verlustfreie Art (Kompression) bei der die Datenmenge komprimiert wird, aber keine Daten verloren gehen und die verlustbehaftete Art (Reduktion) bei der die Daten so reduziert werden, dass sie sich nicht mehr völlig rekonstruieren lassen.

Ein Beispiel für die verlustfreie Kompression sind zip oder rar Achive. Die Dateien, die du damit packst kannst du 1:1 wieder entpcken ohne das Informationen verloren gehen.

Beispiele für eine verlustbehaftete Reduktion wären zum Beispiel jpg Bilder, alle möglichen Arten von Videos oder MP3-Dateien. Bei diesen Dateiformaten wird versucht die Datenmenge dadurch zu verkleinern indem mach unwichtige Daten einfach weg lässt. Dadurch werden sie zwar sehr klein, aber du bekommst nie weider die ursprünglichen Daten zurück.

Beim MP3 klingt der Ton schlechter als bei einem reinen ungepackten Wav-File, was man besonders gut merkt, wenn du ein lief mal mit 32kb Datenrate packst. Bei reduzierten Bildern erkennst du beim genauen Hinsehen auch die Artefekte (kleine Blöcke) und es wird unschärfer. Ähnliches gilt natürlich auch für Videos.

Das sind also die beiden unterschiedlichen Arten, die es gibt. Wie es funktioniert kann man am Besten an einem Bild erklären. Nehmen wir mal an du hast ein großes Bild, dass hauptschlich aus dem weißen Hintergrund besteht und in der Mitte nur ein Crysis-Logo hat.

Im BMP Format, welches völlig ungepckt ist schreibt dann Pixel für Pixel, Zeile für Zeile in die Datei.

Ein weißer Pixel repräsentieren wir hier mal durch ein "w"
Wenn die erste Zeile nur weiß ist und 30 Pixel breit, dann werden in der Datei 30 w's gespeichert:

"wwwwwwwwwwwwwwwwwwwwwwwwwwwwww"

Das ist natürlich eine irrsinnige Verschwendung von Speicherplatz. Stattdessen kann man die Datei packen und sagen:

"30*w"

Das ist bedeutend kürzer und lässt sich wieder vollkommen entschlüsseln. Wenn man ein Bild komprimiert versucht man immer möglichst große gleichfarbige Flächen zu finden und diese in solchen kurzen Formeln zu beschrieben. Ein Bild setzt man also nur aus solchen Flächen zusammen.

Schwierig wird es natürlich, wenn sich keine gleichfarbigen Flächen mehr finden lassen. Wenn jeder Pixel andersfarbig ist, als der Nachbar, dann muss man wieder jeden Pixel einzeln speichern.

Das verhindert bei komplexen Bildern, wie zum Beispiel Fotos, dass sie stark komprimiert werden können, da dort praktisch keine gleichfarbigen Flächen vorhanden sind.

Jedenfalls nicht 100% gleich. Sagen wir mal auf dem Foto ist auch der Himmel zu sehen. Der ist zwar gleichmäßig blau, aber eben nicht ganz gleichmäßig. Das eine Blau ist etwas blauer als das Andere und kein Pixel hat wirklich exakt die gleiche Farbe wie sein Nachbar. Mann müsste also wieder jeden Pixel einzlen speichern, obwohl es ziemlich gleichmäßig Blau aussieht.

Hier kommt nun die verlustbehaftete Komprimierung zum Einsatz, wie sie in jpg Bildern angewand wird.

Dort werden nun auch Pixel als eine Fläche zusammengefasst, die nicht 100% identisch sind, sondern auch welche, die ähnich blau sind. Aus vielen kleinen blauen Pixeln, die alle leicht unterschiedlich sind wird dann eine große Fläche mit einer einheitlichen Farbe.

Dabei gehen natürlich Details verloren, aber wenn man das Foto von Weitem betrachtet, dann fällt es kaum auf. Natürlich wird das Ganze in Wirklichkeit noch viel komplexer gemacht, mit Farbverläufen und so etwas und bei ganz komplexen Packverfahren werden aus Pixelfeldern mathematische Funktionen geformt, die man abspeichert. Rechnet man später diese Funktionen wieder aus bekommt man ein ähnliches Pixelmuster zurück und kann das Bild wieder rekonsturieren.

Nachdem man das alles gemacht hat, dann wird meistens noch eine Binärkompression durchgeführt. Dort werden ähnliche Bitmuster gesucht und zusammengefasst.

Sagen wir mal unser bereits sehr stark gekpacktes "30*w" würde binär so aussehen: "10011000000100000010000001"
Wie man sieht sind die letzten drei "00000001" identisch und würden sich auch wieder zusammenfassen lassen, sodass man vielleicht auf "10011011101111011" kommen würde oder so etwas. So braucht man nur 2 Byte um die ganze erste Zeile von weißen Pixeln zu speichern.

So viel erst einmal zum 1*1 des Packens. :)

Es ist ein komplexes Thema zu dem man Ewigkeiten etwas schreiben kann. Packverfahren sind eines der wichtigsten Dinge in der Informatik. Da beißen sich tausender kluger Köpfe seit Jahrzehnten die Zähne aus um immer noch bessere Verfahren zu entwickeln.