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.