[請益] 寫作繪圖軟體碰到的一些問題@@
最近自己在寫一個繪圖軟體
被一些問題卡住了
想跟大家討論看看
我想要寫一個類似 Photoshop 的圖層系統
這個系統要可以同時容納
1. 可切換各種混色模式的繪圖圖層
以及
2. 其他一些具有調整效果的參數圖層
我以 C++ 將它實做為類似 Link List 的資料結構
也就是將每個圖層設計為一個物件
此物件含有圖層本身的資訊(圖像或調整參數)以及一個指向下一圖層的指標
實際混色時是使用遞迴方式
也就是每個圖層都先呼叫下一圖層的混色函數
然後再將自己這一層的資訊疊加到 Buffer 上去
遞迴到碰到最底層為止
從行為上來說這個設計是沒有問題的
但是我發現當圖層增多到一個程度之後
時間和空間上的開銷都會有點不合理
以空間而言
假設一張圖是 3000*2000px 的 RGBA 格式
那麼不壓縮的大小就是 24M bytes
由於任何一個圖層有改變時
都必須將混色結果即時顯示到螢幕上
因此所有圖層資訊都要同時載入記憶體
這種情況下 只要開20 個繪圖圖層
就已經用掉 480M 的記憶體了
但我用 Photoshop 作實測
它用的記憶體連我所預估的一半都遠遠不到
如何做到這點讓我頗為好奇......
我想過幾種改善的可能
例如將「目前工作圖層」以下的所有圖層都存進硬碟
只將這些「以下圖層」混色過後的結果載入記憶體
但這方法得要燒香拜佛
祈禱使用者多編輯上方圖層 少編輯下方圖層.....
我還想過是否可以用這種預計算的方法對付「所有以上圖層的結合」
但由於圖層的某些混色模式和某些調整顏色的演算法
都必須先決定下層圖層的顏色才能計算
所以這想法似乎也行不太通
不曉得在這方面各位有沒有什麼高見?
另外一個問題則是時間上的:
假設使用者開了100個圖層而且都沒關掉
(一般修圖情況下調整圖層比繪圖圖層多出數倍是正常的)
又將視窗畫面縮放到可以看到全圖的話
那麼必須做的即時運算
竟然有 3000*2000*100 = 100M 次混色之多!!
即使我已經對混色演算法做了 bitwise 的優化
但每次混色畢竟還是包含多次的是否判斷式、加法、乘法、位移......等等
從現實情況上來說跟本不可能來得及
(流暢動畫的最低標準是 24fps,也就是最慢0.04秒內要完成全部混色動作)
我想過一個改善方式
就是對每個像素偵測「是否已經掩蓋下層圖層」
換句話說
如果有某個像素在某一層的 Alpha 值已經是 FF
那就可以不用管他下面是三小了
但後來發現這方法會快速地在不同圖層間切換
造成 Cache 效率極差 反而不如整張一起算 老老實實的算到底XD
總之 我實在是想破頭也想不出好方法
關於這兩個問題 如果有人能給我一點方向 我會非常感激 ^^”
--
直接閱讀《琴劍六記》
http://gs.cathargraph.com/p/list.html
《琴劍六記》Facebook專頁
https://www.facebook.com/GSannals
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.62.253.66
→
08/03 01:26, , 1F
08/03 01:26, 1F
→
08/03 01:34, , 2F
08/03 01:34, 2F
→
08/03 01:35, , 3F
08/03 01:35, 3F
→
08/03 01:35, , 4F
08/03 01:35, 4F
→
08/03 01:37, , 5F
08/03 01:37, 5F
→
08/03 01:37, , 6F
08/03 01:37, 6F
→
08/03 01:38, , 7F
08/03 01:38, 7F
→
08/03 01:40, , 8F
08/03 01:40, 8F
→
08/03 01:41, , 9F
08/03 01:41, 9F
→
08/03 01:41, , 10F
08/03 01:41, 10F
→
08/03 01:46, , 11F
08/03 01:46, 11F
→
08/03 01:46, , 12F
08/03 01:46, 12F
推
08/03 07:28, , 13F
08/03 07:28, 13F
→
08/03 11:06, , 14F
08/03 11:06, 14F
→
08/03 11:06, , 15F
08/03 11:06, 15F
→
08/03 13:01, , 16F
08/03 13:01, 16F
→
08/03 13:02, , 17F
08/03 13:02, 17F
→
08/03 17:52, , 18F
08/03 17:52, 18F
→
08/03 17:52, , 19F
08/03 17:52, 19F
→
08/03 18:34, , 20F
08/03 18:34, 20F
→
08/03 18:42, , 21F
08/03 18:42, 21F
→
08/03 18:43, , 22F
08/03 18:43, 22F
→
08/04 00:04, , 23F
08/04 00:04, 23F
→
08/04 00:05, , 24F
08/04 00:05, 24F
→
08/04 00:06, , 25F
08/04 00:06, 25F
推
08/04 21:27, , 26F
08/04 21:27, 26F
→
08/04 21:28, , 27F
08/04 21:28, 27F
推
08/05 00:26, , 28F
08/05 00:26, 28F
→
08/05 03:50, , 29F
08/05 03:50, 29F
→
08/05 03:50, , 30F
08/05 03:50, 30F
推
08/05 08:30, , 31F
08/05 08:30, 31F
→
08/05 08:33, , 32F
08/05 08:33, 32F
→
08/06 09:40, , 33F
08/06 09:40, 33F
推
08/07 21:01, , 34F
08/07 21:01, 34F
→
08/07 21:02, , 35F
08/07 21:02, 35F
→
08/07 21:03, , 36F
08/07 21:03, 36F
→
08/07 21:03, , 37F
08/07 21:03, 37F
→
08/07 21:03, , 38F
08/07 21:03, 38F
→
08/07 21:04, , 39F
08/07 21:04, 39F
→
08/07 21:05, , 40F
08/07 21:05, 40F
→
08/07 21:05, , 41F
08/07 21:05, 41F
→
08/07 21:06, , 42F
08/07 21:06, 42F
→
08/07 21:06, , 43F
08/07 21:06, 43F
→
08/07 21:07, , 44F
08/07 21:07, 44F
→
08/11 17:31, , 45F
08/11 17:31, 45F
→
08/11 17:32, , 46F
08/11 17:32, 46F
→
08/11 17:33, , 47F
08/11 17:33, 47F
→
08/11 17:33, , 48F
08/11 17:33, 48F
→
08/11 17:34, , 49F
08/11 17:34, 49F
→
08/11 17:35, , 50F
08/11 17:35, 50F
→
08/11 17:36, , 51F
08/11 17:36, 51F
Programming 近期熱門文章
PTT數位生活區 即時熱門文章