選擇座標系統 (也就是選擇 1 個世界單位的意義) 時,請一併選擇筆刷 epsilon 值。座標系統會反映在您傳遞至 InProgressStrokesView.startStroke() 的 inputToWorld 轉換矩陣值,以及您在繪製乾筆觸時套用至 Canvas 的類似轉換。
一般應用程式可以只考慮世界單位,並將 strokeToWorldTransform 的 startStroke() 引數保留為預設的 ID 矩陣。
如果應用程式支援平移、縮放或旋轉繪圖表面,這些轉換矩陣的確切值會隨時間改變,但這些變更反映的是使用者透過攝影機檢視繪圖表面時,世界座標系統的變化。
世界座標系統可以想像成格線,每個儲存格的大小都是一個世界單位。Epsilon 是格線中的大小,以世界單位的浮點數表示。
使用者放大內容時,世界單位格線也會隨之放大,因此以預設 100% 縮放比例來說,世界單位和 epsilon 大小的選擇非常重要。
在應用程式的整個生命週期中,世界單位大小定義和世界單位中的 epsilon 值必須是固定值。
內部實作會使用 epsilon 來判斷兩個點的距離必須多近,才能視為同一個點。換句話說,任何小於 epsilon 的距離都會視為零距離。這項設定用於量化和捨入內部計算結果。
合理的全球單位大小和 epsilon 值為何?
為了在不同螢幕大小和裝置密度之間移植,世界單位大小應與密度無關。這類情境的傳統單位是密度獨立像素 (dp)。通常會選擇 1 dp 做為世界單位大小。
選擇固定 epsilon 值時,請避免內部實作將數字四捨五入至大於像素的任何距離。如果世界單位的尺寸為 1 dp,epsilon 應最多為 1/4 (0.25 個世界單位),才能成為高螢幕密度裝置上的像素大小 (1 dp 可為 4 px)。不過,如果您希望支援使用者將內容放大 10 倍,且與 epsilon 相關的捨入值仍維持在 1 像素以下,則 epsilon 應為 0.25 除以 10,也就是 0.025 個世界單位。
這不代表您無法將縮放比例調高至 10 倍以上,但此時筆觸的算繪可能會開始出現不精確和失真等問題。
選擇 epsilon 值時,必須在放大時的精確細節和運算資源之間取得平衡,例如:
- CPU 週期,用於計算更精確的幾何圖形
- 記憶體,可在該幾何圖形中儲存更多詳細資料
- 算繪該幾何圖形的 GPU 時間
這些是合理的預設值,但您可以根據需求,選擇更合適的座標系統和 epsilon 值。
如果與這些建議值相差太遠,可能會對應用程式造成負面影響。舉例來說,資源耗用量增加可能會導致應用程式執行緩慢。在某些情況下,浮點數精確度問題也可能導致奇怪的視覺構件。