( bzt | 2025. 05. 06., k – 09:25 )

Szerkesztve: 2025. 05. 06., k – 09:32

Egy kis érdekesség: eredetileg úgy írtam meg, hogy a csomagokban az adatbitek mérete változó lehet (VBR, azaz nem biztos, hogy a csomagok mindig bájthatárra esnek). Ez lassít ugyan, de feltételeztem, sokkal jobb tömörítést jelent majd. Az overhead minimális volt, a bitkicsomagoló O(1)-es volt, a következő:

#define POP_BITS(v, n) do{ v = (*((uint32_t*)src) >> off) & ((1 << (n)) - 1); off += n; src += off >> 3; off &= 7; }while(0)

(Cserébe +3 bájtnyira kellett allokálni a buffert, hogy az utolsó bájtból is tudjon olvasni)

Kigeneráltam az összes lehetséges bitméretet preset-ekbe, majd ráeresztettem többezer példaképre (amit csak találtam a vinyómon, szprájtlapok, ikonok, családi fotók, háttérképek, stb.), és mindnél megnéztem, melyik preset tömörítette be a legjobban. Az eredmények:

preset   0        1821 is 6 hs 2 ds 2 gs 4 vs 2
preset   1          97 is 7 hs 2 ds 2 gs 4 vs 2
preset   2          77 is 8 hs 2 ds 2 gs 4 vs 2
preset   3          11 is 9 hs 2 ds 2 gs 4 vs 2
preset   4          10 is 6 hs 2 ds 3 gs 4 vs 2
preset  12           4 is 6 hs 2 ds 4 gs 4 vs 2
preset  14           1 is 8 hs 2 ds 4 gs 4 vs 2
preset  19           1 is 9 hs 4 ds 4 gs 4 vs 2
preset  20          16 is 6 hs 4 ds 4 gs 4 vs 2
preset  22           1 is 8 hs 4 ds 4 gs 4 vs 2
preset  28          35 is 6 hs 2 ds 2 gs 5 vs 3
preset  29          17 is 7 hs 2 ds 2 gs 5 vs 3
preset  36           2 is 6 hs 3 ds 3 gs 5 vs 3
preset  38           1 is 8 hs 3 ds 3 gs 5 vs 3
preset  40          35 is 6 hs 2 ds 4 gs 5 vs 3
preset  48           2 is 6 hs 4 ds 4 gs 5 vs 3
preset  52        1126 is 6 hs 2 ds 2 gs 6 vs 4
preset  53         151 is 7 hs 2 ds 2 gs 6 vs 4
preset  54          63 is 8 hs 2 ds 2 gs 6 vs 4
preset  55           1 is 9 hs 2 ds 2 gs 6 vs 4
preset  56           4 is 6 hs 2 ds 3 gs 6 vs 4
preset  57           2 is 7 hs 2 ds 3 gs 6 vs 4
preset  60           9 is 6 hs 3 ds 3 gs 6 vs 4
preset  61          14 is 7 hs 3 ds 3 gs 6 vs 4
preset  62           4 is 8 hs 3 ds 3 gs 6 vs 4
preset  64          14 is 6 hs 2 ds 4 gs 6 vs 4
preset  65          33 is 7 hs 2 ds 4 gs 6 vs 4
preset  67           1 is 9 hs 2 ds 4 gs 6 vs 4
preset  68          61 is 6 hs 3 ds 4 gs 6 vs 4
preset  69          13 is 7 hs 3 ds 4 gs 6 vs 4
preset  70          11 is 8 hs 3 ds 4 gs 6 vs 4
preset  71           7 is 9 hs 4 ds 4 gs 6 vs 4
preset  72          55 is 6 hs 4 ds 4 gs 6 vs 4
preset  73          28 is 7 hs 4 ds 4 gs 6 vs 4
preset  74           9 is 8 hs 4 ds 4 gs 6 vs 4

Magyarázat:
- is: hash tábla index méret, 6 és 10 bit között (QOI2_INDX csomag),
- hs: halfwidth diff méret, ds: diff méret 2 és 6 bit között (QOI2_DIF2 és QOI2_DIF3),
- gs: zöld diff 4 és 7 között (QOI2_DIFL),
- vs: rb zöld relatív diff méret 1 és 4 bit között (QOI2_DIFL),
- a QOI2_RUNS, QOI2_RUNL kimaradt a tesztből (túl sok lett volna a kombináció),
- a QOI2_RGBA pedig koncepcionálisan nem változó bitméretű. mivel egy csatorna fixen 8 bites.

Érdekes megfigyelni, hogy az eloszlásnak két lokális maximuma van: a kissebb bitméret a transzparens képek esetén, a második nagyobb bitméret a fotó jellegű képeknél. Ez utóbbinál mindössze egy bit a különbség (ds 3 az optimális 2 helyett) a mindig bájthatárra eső csomaghoz képest.

Ami viszont meglepett, hogy azt hittem, a "látott pixelek" hasítótábla méretének növelésével drasztikusan javulni fog a tömörítési arány, mert több lesz a rövidebb QOI2_INDX csomag, azonban ez nincs így. Lehet kevés volt a skótkockamintás tesztképem.