QOI 圖片無損壓縮演算法

Hacker News Daily 上看到「Lossless Image Compression in O(n) Time」這篇,作者丟出了一個圖片的無損壓縮演算法,壓縮與解壓縮的速度超快,但壓縮率又不輸 PNG 太多,在 Hacker News 上的討論也可以看一下:「QOI: Lossless Image Compression in O(n) Time (phoboslab.org)」。

裡面有提到在遊戲產業常用到的 stb_image.h

Yes, stb_image saved us all from the pains of dealing with libpng and is therefore used in countless games and apps. A while ago I aimed to do the same for video with pl_mpeg, with some success.

作者的簡介也可以看到他的主業也在遊戲這塊:

My name is Dominic Szablewski. I build games, experiment with JavaScript and occasionally tinker with low-level C.

圖片的無損壓縮與解壓縮算是遊戲創作者蠻常用到的功能,所以他想要看看這塊有沒有機會有更好的工具,於是他就用了四個很簡單的演算法幹完了 QOI (然後發現效果很讚):

  • A run of the previous pixel
  • An index into a previously seen pixel
  • The difference to the previous pixel
  • Full rgba values

其實從 Hacker News 的討論也可以看到這組演算法也常被拿出來在現代的壓縮演算法使用,所以雖然作者自稱不是 compression guy,但他用的演算法其實蠻專業的...

然後挑 single thread 主要是可以避免 threading 的複雜度以及 overhead,在「QOI Benchmark Results」這頁可以看到,無論是什麼類型的檔案,壓縮與解壓縮的速度都相當漂亮,而且壓縮率又沒有差 libpng 太多。

而且作者自己有提到,還沒用到 SIMD 指令集加速,這樣猜測應該還有不少空間...

超越線性成長的資料庫架構

標題取自 Percona 的「Better Than Linear Scaling」。

其實是因為機器數量增加,而且有妥善規劃,使得 cache 的 hit rate 上升而讓整體效率變好 (也就是 1 + 1 > 2)。

不只在 database 上會發生,在其他系統上其實會有類似的情況,剛好看到覺得很懷念 XD

四頁 PDF 介紹線性代數...

在「Linear algebra tutorial in four pages」這邊看到,先是回想之前大學學過的線性代數,好像不太可能用四頁搞定啊...

看了 PDF 後發現只講了最簡單以及一些實際應用,比較複雜的部份就沒有講了... 不過對於已經忘光的人拿來復健應該還是很有用... XD

不過如果以這種寫法,十頁說不定有機會把更複雜的部份寫完?像是比較長的 cheatsheet...

CSS 裡,px 的定義並沒有保證線性...?

在 Hacker News 上看到的舊文章,在「IN CSS, “PX” IS NOT AN ANGULAR MEASUREMENT AND IT IS NOT NON-LINEAR」這篇文章裡面,標題就直接提到「pixel 並非生而平等」...

文章裡的 pixel 的定義是:

a pixel is defined as the smallest object that can be displayed on a device

但我找不到這句話的出處...

到是 CSS 2.1 的 PDF 裡可以看到 px 的定義是:

px: pixel units — 1px is equal to 0.75pt.

以及 pt 的定義:

pt: points — the points used by CSS are equal to 1/72nd of 1in.

而連 in 都有定義:

in: inches — 1in is equal to 2.54cm.

然後 cm 這個縮寫定義到公制:

cm: centimeters

看起來不像是有問題啊?另外是還有對 reference pixel 的定義,看起來也很明確啊:

The reference pixel is the visual angle of one pixel on a device with a pixel density of 96dpi and a distance from the reader of an arm’s length. For a nominal arm’s length of 28 inches, the visual angle is therefore about 0.0213 degrees. For reading at arm’s length, 1px thus corresponds to about 0.26 mm (1/96 inch).

暫時不考慮這個問題... 有機會再回頭來看好了 @_@