Programming 板


LINE

最近自己在寫一個繪圖軟體 被一些問題卡住了 想跟大家討論看看 我想要寫一個類似 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
1F:→ tkcn:若圖層只存有色彩的矩型,而不是整張畫布呢? 140.114.78.231 08/03 01:26
2F:→ pnpncat:這也是要燒香拜佛啊XD 使用者有可能會把 61.62.253.66 08/03 01:34
3F:→ pnpncat:十幾張照片各自載入為圖層 那就整張畫布 61.62.253.66 08/03 01:35
4F:→ pnpncat:都有資訊了 61.62.253.66 08/03 01:35
5F:→ MOONRAKER:photoshop之所以為photoshop就是因為他118.165.219.222 08/03 01:37
6F:→ MOONRAKER:能掌握每一layer最多需要多少空間118.165.219.222 08/03 01:37
7F:→ MOONRAKER:不是用「原子彈爆炸」的做法118.165.219.222 08/03 01:38
8F:→ pnpncat:如果姑且不論儲存空間 關於效能的問題呢? 61.62.253.66 08/03 01:40
9F:→ pnpncat:我想到的效能改善都是跟使用者行為有關的 61.62.253.66 08/03 01:41
10F:→ pnpncat:還沒想到什麼通用的方法 61.62.253.66 08/03 01:41
11F:→ pnpncat:如果真的沒辦法 可能就得探到更下面了 61.62.253.66 08/03 01:46
12F:→ pnpncat:例如用 Cuda 做平行運算之類的@@ 61.62.253.66 08/03 01:46
13F:推 bill42362:cuda不錯阿 shader 本來就是為這設計的 118.161.109.88 08/03 07:28
14F:→ pnpncat:其實有考慮用 cuda 但一直沒用的原因是不 219.84.209.192 08/03 11:06
15F:→ pnpncat:太想寫需要特定顯示卡支持的程式 唉 219.84.209.192 08/03 11:06
16F:→ Chikei:PS對於這種極端case也這麼厲害嘛?像是20層 211.72.92.133 08/03 13:01
17F:→ Chikei:都是複雜照片一樣只消耗預估的50%-? 211.72.92.133 08/03 13:02
18F:→ MOONRAKER:那不可能吧,他只會開始用硬碟當scratch 118.163.12.174 08/03 17:52
19F:→ MOONRAKER:disk而已,接著就開始變得很慢 118.163.12.174 08/03 17:52
20F:→ Chikei:那就應該是只存最小面積/色彩index吧 211.72.92.133 08/03 18:34
21F:→ Chikei:我也很懷疑對於3Kx2Kx100L這種東西PS真的能 211.72.92.133 08/03 18:42
22F:→ Chikei:辦到很流暢的混圖層嘛XD 211.72.92.133 08/03 18:43
23F:→ pnpncat:100 Layers 是不少見啦 但現實情況中 219.85.123.240 08/04 00:04
24F:→ pnpncat:很少會將100層同時打開 219.85.123.240 08/04 00:05
25F:→ pnpncat:我可能要對 PS 作更詳細的測試了@@ 219.85.123.240 08/04 00:06
26F:推 abcdefghi:把各layer scale成螢幕大小(dpi)再放記 114.44.183.241 08/04 21:27
27F:→ abcdefghi:憶體, 只有在zoom in/out的時候才重算 114.44.183.241 08/04 21:28
28F:推 bill42362:不用 cuda 可以考慮看看 OpenCL @@"118.161.191.142 08/05 00:26
29F:→ pnpncat:a兄的方法很好 不過那樣就不能做滾輪縮放 180.176.20.143 08/05 03:50
30F:→ pnpncat:了吧我想 變成縮放成本很高 180.176.20.143 08/05 03:50
31F:推 abcdefghi:開另一個threads專職作scaling,每個laye 114.42.176.184 08/05 08:30
32F:→ abcdefghi:只要完成就丟給主thread,互動性應該不差 114.42.176.184 08/05 08:33
33F:→ pnpncat:感謝指點 我再試試看^^ 219.84.209.244 08/06 09:40
34F:推 yoco315:我確定ps只有保存有像素的區塊 58.115.137.102 08/07 21:01
35F:→ yoco315:超出那個矩形的地方根本不吃記憶體 58.115.137.102 08/07 21:02
36F:→ yoco315:但相對的,如果那個圖層被移動到超出邊緣 58.115.137.102 08/07 21:03
37F:→ yoco315:即使已經超出畫紙,也依然會吃記憶體 58.115.137.102 08/07 21:03
38F:→ yoco315:這個設計很合理,也省記憶體,move的實作 58.115.137.102 08/07 21:03
39F:→ yoco315:也很快速,缺點就是blending的時候比較貴 58.115.137.102 08/07 21:04
40F:→ yoco315:另外,你要求的流暢度可能有點太超規格了 58.115.137.102 08/07 21:05
41F:→ yoco315:即使是adobe的千里馬,在多層的時候,即使在 58.115.137.102 08/07 21:05
42F:→ yoco315:高級電腦上也是卡卡的,除非使用GPU加速 58.115.137.102 08/07 21:06
43F:→ yoco315:這是我上次去參加conference的時候,CUDA給 58.115.137.102 08/07 21:06
44F:→ yoco315:的其中一個展示... 人家也要GPU才能作到:( 58.115.137.102 08/07 21:07
45F:→ pnpncat:多謝y兄 我再次測試的結果 正如y兄所述 219.85.243.227 08/11 17:31
46F:→ pnpncat:此外 先scale的方法似乎行不通 即使只做 219.85.243.227 08/11 17:32
47F:→ pnpncat:Bilinear 多次縮放的成本也太高了 不會 219.85.243.227 08/11 17:33
48F:→ pnpncat:低於Blending本身 先Blending 然後用顯 219.85.243.227 08/11 17:33
49F:→ pnpncat:卡縮放(我用openGL)還是比較節省 219.85.243.227 08/11 17:34
50F:→ pnpncat:經過一番討論 目前我已經比較有方向了 219.85.243.227 08/11 17:35
51F:→ pnpncat:正在努力coding中XD 219.85.243.227 08/11 17:36







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP