遠端控制之螢幕截取 小結

來源:互聯網
上載者:User
為了實現高速螢幕傳輸,勢必不能每次都截取整個螢幕,這樣做的後果就是待傳輸的過大資料量和有限頻寬(假設約20K~50K)之間的矛盾。為了讓顯示更加流暢,必須在單位時間內利用有限的頻寬傳輸近可能多幀的圖象過來,這裡就需要實現差異截屏!

實現差異截屏有以下三種方案可以選擇:

  1. (BitBlt或DirectDraw) + (隔行取樣或CRC或Hash)
  2. Hook: 參考VNC實現
  3. 虛擬顯卡:參考陳經韜的例子,無源碼(Delphi)

註:目前網上能找到源碼的一般都是使用第一種方案。

使用差異截屏有可能需要進行螢幕分塊,就是將整個螢幕分成N個小地區,每次僅僅傳輸通過某種演算法判斷已經變化的部分,地區的大小一般都是根據經驗設定!

為了進一步減少待傳輸的資料量,還可以選擇性地進行壓縮,壓縮方式也有兩種選擇:

  1. BMP -> JPEG:有損壓縮,壓縮比相對較高
  2. 通用壓縮:Zip、ZLib(Ex)等

通過以上的步驟,一般就可以實現在廣域網路上實現相對比較流暢的螢幕傳輸了,當然,採用虛擬顯卡方式好像速度最快,Hook方式次之,不過實現難度也是從高到低的!

目前該應用的瓶頸主要是頻寬的限制,為此需要盡量減小差異截屏後獲得的資料量,但是測試的結果也只能達到每秒數幀的效果,和網上某些文章提到的動輒幾十幀上百幀(註:個人感覺有水分^_^)的效果相差甚遠!

2007/07/06 Update:

使用虛擬顯卡驅動本質上是編寫一個Display Mirror Driver,安裝之後該驅動和物理顯卡驅動將會收到完全相同的事件,根據這些事件可以判斷螢幕的那些地區發生改變,而且在驅動中可以直接操作顯存,就不需要耗費大量的CPU進行bltting!

據說PcAnyWhere、遠端桌面(WIN2000之後)以及部分遠端控制軟體均採用該技術實現。

DirectDraw好像也是可以直接操作現存的,不知道和用Mirror Driver這種方法比效率相差有多大!?

參考:http://www.osronline.com/showthread.cfm?link=111960

2007/07/11 Update:

在用GDI Bitblt函數或DirectDraw進行高速截屏時,為了得知那些地區發生變化,必須儲存一份螢幕拷貝,通過將最新的螢幕鏡像和儲存的拷貝進行比較,從而獲得發生變化的地區!用Bitblt獲得螢幕拷貝速度非常慢,為了獲得1280*720大小的截屏,在我機器上需要350ms左右,用DirectDraw在這一點上就好多了。

VNC採用Hook的方法截獲所有相關的Windows訊息,然後判斷各個訊息對哪些螢幕矩形地區有影響,把這些矩形地區合成一個Region,在更新的時候進行更新這些地區。

採用虛擬驅動的原理和Hook方法類似,不過截獲的不是Windows訊息,而是直接在驅動中截獲GDI函數調用,在這些函數中獲得變化的矩形地區並組合成最終的Region,由於驅動和普通應用程式處於不同的特權層級,因此在讀顯存之後需要將資料傳到ring3,處理起來相當麻煩,而且處理不善將有很大的效率問題!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.