• 沒有找到結果。

其他命令

在文檔中 終端服務的桌面影像壓縮 (頁 64-70)

第四章 RDP Client 實做與程式分析

4.3 Primary order 的處理

4.3.3 其他命令

RDP 中 primary order 除了文字、圖形外,還有一些控制畫面更新的命令,例如:

Memory Blt、Pattern Blt、DeskSave、Screen Blt 等,利用這些命令將 cache 中暫存的圖 片顯示在畫面,這一章節,對於這些命令的實作程序及實驗過程做說明。

z Pattern Blt

主要是傳輸圖樣,依據 RDP Server 指定的前景(foreground)、背景(background)

在指定的位置顯示圖樣,最常見的情況是文字輸入的空格游標,在處理命令之前先定 義 PATBLT_ORDER 參數結構,如下圖。

圖 44. PATBLT ORDER 參數架構

收到 Pattern Blt 封包後,由 process_patblt 處理參數後,將封包資料解開後,將收 到的參數放入 PATBLT_ORDER 架構中,呼叫 ui_patblt 並引用 PATBLT_ORDER 的參 數,ui_patblt 依據 opcode 中 Brush 的 style 決定樣式,例如:實心(Solid)、影線(Hatch)、 圖樣(Pattern),根據不同的樣式設定前景或是背景,呼叫 X Lib 的函數進行繪圖,不 同的樣式呼叫不同的 X Lib 函數,最主要的還是呼叫 XFillRectangle 繪製出圖形。

z Screen Blt

在視窗桌面系統中,在視窗拖曳的過程中,視窗內的畫面是沒有改變的,變動的 是視窗的位置,因此 RDP Server 利用 Screen Blt 傳送給 RDP Client,通知改變視窗位 置,而不用傳送整個視窗的 bitmap 給 RDP Client。ㄧ個 Screen Blt 的參數包含如下圖。

圖 45. SCREENBLT ORDER 參數結構

rdesktop 接收到 Screen Blt 封包後,讀取封包參數後,將參數存入 SCREENBLT ORDER 結構中,呼叫 ui_screenblt()處理,ui_screenblt()函數呼叫 X Lib 的 XCopyArea() 將來源端的影像複製到目標座標的位置,封包處理流程如下圖。

圖 46. screen blt 命令處理流程 process_screenblt

讀取參數,並將參數 置入 SCREENBLT ORDER 結構中。

ui_screenblt

XCopyArea

依據來源座標、區域大小(寬、

高)、目標座標,進行複製

z Desktop Save

rdesktop 中建立了 DESKSAVE_ORDER 參數結構,如下圖。

圖 47. DESKSAVE ORDER 參數結構

rdesktop 程式中建立了 process_desksave()函數來處理這個指令,解析出 desktop 暫 存區域的四個頂點後,計算出長、寬、offset 和 action(定義 save/restore)後,判斷 action 是 save 或是 restore,交給 ui_desktop_save 或是 ui_desktop_restore 處理。

假設是 save,交由 ui_desktop_save 處理並呼叫 cache_put_desktop 將資料存入 desktop cache;反之如果是 restore,就呼叫 ui_desktop_restore 處理,函式中呼叫 cache_get_desktop 將桌面圖檔從 dektop cache 中讀取出來。

這個命令是使用在視窗畫面中,常常可遇到的 menu 選單中,例如:Windows 視 窗中的開始選單或是視窗選項中的工具列,由於選單延伸出來後往往會蓋住原本底下 的畫面,但是當我們選擇完選項後,桌面被覆蓋的畫面又出現了,如果重複的畫面需 要 RDP Server 重新傳送,將浪費頻寬,因此 RDP Server 在覆蓋前會判斷選單的出現,

在畫面被覆蓋之前先傳送一個 desktop save 的命令,使得 RDP Client 將桌面的畫面暫 存到 desktop cache 中,當選單結束,底下的桌面需要顯示時,RDP Server 便傳送一個 desktop restore 的命令給 RDP Client,RDP Client 便將暫存在 cache 中的畫面重現出來。

透過 RDP 這樣的機制可以有效節省網路頻寬的使用,為了暸解 RDP Server 的判 斷機制,下圖 48.系列就是我們實驗的畫面。圖 48.(a)是原始的畫面,還沒拉出選單,

圖 48.(b)是桌面拉出「我最近的文件」選單後的畫面,圖 48.(c)是選單下的桌面畫面,

也就是暫存在 desktop cache 中的畫面資料。

圖 48.(a) 原本的視窗畫面

圖 48.(b) 拉出選單目錄後的畫面

圖 48.(c) 暫存在 desktop cache 中的畫面資料

由圖 48.,我們可以看出(c)圖的資料,也就是(b)圖中選單拉出來後,所覆蓋的資 料,因此在選單覆蓋的面積越大時,RDP 指令的效益越大。

z Memory Blt

在 RDP Server 傳送過來的 bitmap 都將暫存在 cache 中,每個 bitmap 都附予一個 cache id 和 cache index,在畫面顯示時,RDP Server 就傳送 Memory Blt 給 RDP Client,

RDP Client 就根據 Memory Blt 所包含的參數,將 cache 中的圖片顯示在畫面上,簡單 說 Memory Blt 是將 cache 中的 bitmap 顯示在畫面的特定位置。

一般來說,視窗中單一色調的底色,如果沒有使用圖形命令(例如:rectangle order)

的話,就是利用單一個 bitmap(最大為 64x64),在不同的位置上進行重複的顯示。

rdesktop 將 Memory Blt 的參數結構定義如下圖。

圖 49. MEMBLT ORDER 結構

rdesktop 定義了 process_memblt 進行 memory blt 的封包處理並定義了 HBITMAP 變 數 , 讀 取 memory blt 參 數 後 將 資 料 放 入 MEMBLT_ORDER 結 構 中 , 利 用 cache_get_bitmap 函數依據 cache id 和 cache index 將 bitmap 從 cache 取出,並將讀取 出來的 bitmap 資料放入 HBITMAP,之後使用 ui_memblt 進行更新,最後利用 X Lib 的 XCopyArea 將 bitmap 的資料複製到連線的畫面上,程式架構如下圖。

圖 50. memory blt 封包處理流程

透過 memory blt 指令的使用,在重複出現或是單一色調的區塊中,可以節省頻寬 的使用,但是,當我們想要在遠端桌面進行影片播放時,假設影片大小為 800x600,

因為影片的畫面每張 frame 都不一樣,RDP Server 不斷傳送 bitmap,那麼畫面中就是 都用 bitmap 在更新畫面,那麼就沒有達到節省頻寬的目的,下頁圖 51.我們根據影片 畫面中 memory blt 所提供的資訊,將傳送 memory blt 位置顯示出來,在第五章,我們 將詳細說明 RDP 在影片播放上的瓶頸。

process_memblt

宣告 HBITMAP 類型變數—bitmap 讀取命令參數資料

bitmap=cache_get_bitmap(id,idx)

ui_memblt( )

XCopyArea

從 cache 中得到點 陣圖資料,並放入 宣告的 bitmap 變數 中

將 bitmap 資料視為來源,連線 程式的顯示畫面視為目的,依 據 RDP Server 所定義的座標,

將 bitmap 複製到顯示畫面

圖 51. RDP 連線中 Memory blt 顯示位置

可以看出,影片畫面為 320x240,寬的部份切為 64 pixel 五塊,高的部份為 64 pixel 三塊,剩餘一塊高度則為 48pixels。

在文檔中 終端服務的桌面影像壓縮 (頁 64-70)