2D/3D 繪圖程式庫整理

2D 和 3D 的程式庫相當地多, 每天聽到這些名詞, 不免又手癢想整理一下. 以下就是我的第一版.

 Library 名稱  2D 3D 硬體加速 keyboard
mouse
Note
DFB  V  V  V 主要支援 bitblit, stretch 等基本的繪圖.
GLUT (OpenGL Utility Toolkit)  V  V  V  V 它包含以下幾項
 – OPEN GL  V  V MS 版硬件不支援時用軟件
SGI 版使用純軟件
 – OPEN GL ES  V  V OPEN GL 的子集合
 – OPEN VG  V  V
 – EGL  初始化 2D/3D 方法
 ShivaVG  *  V  以 3D 實作 2D
 QT Modular Class  V  *  V  V 如下圖, Qt 廣泛地包含了許多其他規格,
期中也包括 3D 的插件, 所以用 * 號表示,
下面 GTK 亦同.
 CAIRO  V  V
 SKIA  V  V  Google 擁有
 GTK / GTK+  V  *  V  V 和 Qt 一樣都是 toolkit.
在 2D 的部分是 Cairo,
 GTK+ 2.0  V  *  V  V 和 GTK+ 不完全相容,
2D 部分仍然是 Cairo

[QT Modular Class Library]

Skype 付費陷阱

今天不小心在信箱的垃圾郵件裡面發現 Skype 昨天寄給我的通知, 它說我買的點數過兩天就要到期了, 害我大吃一驚.

當初買這個點數, 主要是為了和印度人做電話 interview (翻成面談就怪怪的, 因為沒有見到面.). 公司雖然有配給點數, 不過一下就用完了. 在假日也沒辦法找管理部補充, 想說幫公司省點錢, 就買下了不少點數, 以便和一大群的印度工程師周旋. 這次到期的就是這些點數. 

Your credit will become inactive in 3 days

You don't seem to have used any of your Skype Credit in a while. It becomes inactive if you haven't used it in 180 days. But don't worry – once it becomes inactive, you can reactivate it whenever you're ready to use it. Simply sign into your account online and follow the option to Reactivate credit.

Your account details:

Skype Name: XXX
Balance: TWD1,874.27

How do you keep your balance active?

It's simple. Do any of the following and your Skype Credit balance will be active for another 180 days:

– Call any phone (landline or mobile) – even if the call lasts for just one second.
– Send an SMS message direct from Skype.
– Purchase a personal Online Number, subscription or voicemail using your Skype Credit.

在這幾個解決方案之中, 我最先想到的是註冊一個大陸的電話號碼, 可惜 Skype 沒有提供這種服務. 於是我改變主意申請一個美國的電話, 說不定以後去 Amazon 買東西可以用得到. 不過點進去看了之後, 發現一個月要花 200 NTD 才能維持住一個美國的號碼. 這樣實在太不划算啦!

送一個簡訊? 嗯, 今天正好是我前長官的生日. 不過我已經在 Facebook 和他打過招呼了, 再送給簡訊似乎 "禮多人奇怪".   最後我就測試打電話這個選項啦. 打給誰呢? 上次銀行幫我開刷卡繳稅臨時額度的小姐曾經問過我公司電話, 我卻支支吾吾地講不出來. 誰沒事會打到自己公司找人呢? 當然不會放在 cache memory, 要到 external storage 找才會知道.

不過, 記不得公司的電話還是有點尷尬的. 我就拿公司的電話來練習一下吧! "擎展科技您好, .."  聽到回應我趕快掛掉, 通話 UI 上顯示我用了兩秒, 不過 Skype 的通話記錄算我 4 秒, 一共花掉 3.19 元. 這筆錢是白花的, 所以一定要抱怨一下.

TLC NAND 小註解

TLC 是 Triple Level Cell 的縮寫, 和 SLC, MLC 所代表的 Single / Multiple Level Cell 都是類似的東西.

從 SLC, MLC, 到 TLC; 在成本上, 愈來愈低, 因此在容量上也愈來愈大. 所謂的容量變大,  是指單一 cell 可以表示更多 bits.

SLC 用 1 cell 表示  1 bit.

MLC 用 1 cell 表示 2 bit. 以 4 個電壓表示  (0,0), (0,1), (1,0), (1,1).

TLC 用  1 cell 表示 3 bit. 以 8 個電壓表示  (000, 001, 010, 011, 100, 101, 110, and 111).

所以在相同的 cell 容量之下, MLC 的容量變成 SLC 的 2 倍, TLC 的容量是 SLC 的 3 倍.

雖然容量提昇, 但是 TLC 的速度和穩定性都比  MLC 更下降了. 即便如此, 從  MLC 成功取代 SLC 的先例來看, 未來的固態硬碟, 有可能是 TLC 的天下. 畢竟一顆超大的硬碟, 過了兩年可能就變成 "好小一顆", 誰還管它耐不耐用呢?

[ref]

1. 全面了解TLC NAND技术以及市场现状

ARM ACP 小註解

ARM 的 CPU 有個機制叫做 ACP (Accelerator Coherence Port), 它是啥呢?

以 MIPS 系統為例, 如果我用 DMA 搬了一塊 memory, 而 CPU 不知情 –  因為不是透過它搬的, 那麼 CPU 就不能用 cache memory 來存取這塊記憶體, 以免發生預期以外的狀況. 既然不能 cache, 那麼 CPU 就不能自由自在地操作它了.

一般來說, 部分的 DMA 還是透過 CPU 填寫 register, 故 CPU 可以等 DMA done, 然後再進行一般的操作. 不過在多工的情況下, 使用起來就會更加地麻煩.

ARM 的 ACP 就是解決這個問題, 假如一個 device 被掛在 ACP 上, 那麼即使用 DMA 對這個 device 做動作, 其內容也會被同步到 cache memory 裡面, 包括 L1 和  L2 cache. 雖然 ACP 只支援 3 個 bit 的 AXI device ID – 8 個 device, 還是可以用 bridge 的方式加以擴充.

ACP 上的 device 在 read 的時候, 依序在 L1, L2 cache 和 external memory 讀資料.

ACP 上的 device 在 write 的時候, 會優先灌入 L1 cache, invalid 舊資料, 當然也就 update 了 L2 cache.

從行為上來看, 如果一個 device  有很多 DMA, 又有很多 CPU 動作, 那麼 ACP 將可以帶來不少的好處. 包括快速, 省電等等.

Android Thread Safe / Lock Free / Atomic 小註解

Atomic (原子) 通常是指一個指令不會被打斷, 例如一道組合語言的指令, 在沒有執行完之前, 就是 ISR (interrupt service routine) 也無法干擾其結果. 同樣的概念如果放到 function 上, 就很難說這個 function 從來都沒有打斷過了. 我們頂多說這個 function 的結果是如預期的.

怎麼樣保證如預期呢?在 Android 當中的 atomic.c 採用暴力的方法進行, 例如要做一個 write.

void android_atomic_write(int32_t value, volatile int32_t* addr) 顧名思義想把 value 寫到這個 addr,  而它裡面的內容就是:

{

int32_t oldValue;

do {

oldValue = *addr;

} while (android_atomic_cmpxchg(oldValue, value, addr);

只要 OldValue 沒有 value, 這個 loop 就不善罷休. 所以一定可以寫成功. 只要成功了, 就準備離開. 大家可以發現, 如果此時別的 thread 也來寫同樣的位置, 那就出事了. 

為了避免後者的狀況發生, 我們最好不允許這個在有效期間之內又被改掉. 解決之道是 lock 此一變數, 直到 unlock 之前, 都不讓別人改寫. 不過 Android 的 atomic 是 lock-free 的, 所以不需要用 lock. 相對地, 它讓其他的 thread 不會影響到當前的 thread, 也就是確保 thread safe.

怎麼做到 lock free, thread safe 呢, 簡單地說就是避免使用全域變數 (global variable), 只用區域變數 (local variable 或 auto variable). 此時每個 thread 都只針對自己的記憶體空間操作, 就不會影響到別人了.

此外, 我們可以指定哪些變數必須是 automic 的, 例如宣告成:AtomicBoolean, AutomicInteger, AutomicLong, AutomicIntegerFieldUpdate<T> …等等就有保護作用. 這些描述在 java.util.concurrent,automic.

當然, Android 還是有 lock, class 是 java.util.concurrent.locks.

[ref]

1. Android SDK

2. Lock-free atomic operations in Android

3. Thread-Safe的理解與分析