guanyueguan
29693
|
2007/5/29 17:10:15 |
不熟悉Ring0,所以不做,而且沒這個必要,關鍵是算法的效率。 |
guoj
29688
|
2007/5/29 12:58:17 |
guanyueguan:能否在Ring0层做一个 隔行屏幕比较,然后只传给应用层变化的区块编码即可。这个样子效率还可以在提高。 |
guanyueguan
29639
|
2007/5/26 16:15:36 |
隔行版本基本上寫到一定程度了,比紅蜻蜓要快點,但動畫效果比較差,還有待完善,暫時放棄開源了。 |
phone88
29253
|
2007/5/3 0:54:47 |
D7+ICS 生成的client + server 都說 Error Reading wsA.LastError:Property is Read-Only 請教 |
chenyoukun
29217
|
2007/4/29 22:10:04 |
该版本还不完善,期待隔行扫描呀,楼主加油呀...
===前人栽树,后人乘凉=== |
chenyoukun
29216
|
2007/4/29 21:55:08 |
呵呵,楼主果然有信用啊!~谢谢了啊.@!{^_^} |
guanyueguan
29214
|
2007/4/29 17:07:07 |
这里先贴一段关键代码吧,让有经验的朋友可以先去思考,Bitmap是自己用API封装的。
function TScreenSpy.GetNext: Boolean; var i, j: Integer; l2, r2: Integer; p1, p2: PDWord; begin FLine := (FLine + 3) mod DEF_STEP; i := FLine; FBolck.Cmd := 2; FScrStream.Clear; FBolck.rt.Left := 0; FBolck.rt.Right := 0; while i < FHeight do begin FLineBmp.CopyLine(i); p1 := FFullBmp.ScanLine[i]; p2 := FLineBmp.ScanLine[0]; if (FBolck.rt.Left <> 0) or (FBolck.rt.Right <> 0) then begin FBolck.rt.Top := i - DEF_STEP; FBolck.rt.Bottom := FBolck.rt.Top + 3; l2 := 0; r2 := 0; j := 0; while j < FWidth do begin if p1^ <> p2^ then begin if l2 = 0 then begin l2 := j; FBolck.rt.Bottom := i; end; if j > r2 then r2 := j + 4; end else if (r2 <> 0) and (r2 - l2 < DEF_STEP) then begin if j - r2 > DEF_STEP then begin l2 := 0; r2 := 0; end; end; Inc(p1); Inc(p2); Inc(j, 4); end; if l2 < FBolck.rt.Left then FBolck.rt.Left := l2; if r2 > FBolck.rt.Right then FBolck.rt.Right := r2; FBolck.Size := (FBolck.rt.Right - FBolck.rt.Left) * (FBolck.rt.Bottom - FBolck.rt.Top); if FRectBmp.CopyRect(FBolck.rt) then begin FScrStream.WriteBuffer(FBolck, Sizeof(TBmpBlock)); FRectBmp.SaveRectDataA(FBolck.rt, FScrStream); FScrStream.Position := FScrStream.Position - FBolck.Size; FFullBmp.LoadRectData(FBolck.rt, FScrStream); end; end else begin j := 0; while j < FWidth do begin if p1^ <> p2^ then begin if FBolck.rt.Left = 0 then FBolck.rt.Left := j; if j > FBolck.rt.Right then FBolck.rt.Right := j + 4; end else if (FBolck.rt.Right <> 0) and (FBolck.rt.Right - FBolck.rt.Left < 10) then begin if j - FBolck.rt.Right > 10 then begin FBolck.rt.Left := 0; FBolck.rt.Right := 0; end; end; Inc(p1); Inc(p2); Inc(j, 4); end; end; Inc(i, DEF_STEP); end; Result := Compress; end; |
guanyueguan
29213
|
2007/4/29 17:00:28 |
由于有两个重要的地方没有解决(上面说的),所以暂时还不想发布,等差不多了再发布出来。
算法思想很简单,当然也不是我想到的,只是简单分析了一下红蜻蜓的远控(不是黑洞,而且也跟作者说了要看看他的红蜻蜓,他没意见),得出这样的结论。就是每隔一定的行数进行取样,比较出不同的样,再得出变化矩形,然后就是压缩传输了。 |
701701
29211
|
2007/4/29 15:28:20 |
guanyueguan 的很多思路我很赞同, 比如影响屏幕传输速度的大部分说法,我都十分认同。 你的代码是目前同类开源代码中比较有价值比较实用的 我以为可以该进的地方: 1 截屏没有处理好(关键!) 2 为什么一定要分块,其实不分块也可以求变化区域的.
隔行扫描版本 可否给我一份? lee518@21cn.com |
guanyueguan
29207
|
2007/4/29 10:37:15 |
这个是不理想,我已经说清楚了问题在哪了,但在好点的机子+独显,也是能勉强用用。
写得另外一个隔行扫描版本的却能在小变化时轻易达到50侦/秒,CPU在10%以内,800X600的分辨率,甚至我测试的有台机达到了90多侦,如果去噪与矩形计算处理的好还可以提高不少。但这个侦是个抽样侦,不是完整侦,否则就达不到这个速度了。 |
wealsh
29206
|
2007/4/29 10:19:37 |
如果是在局域网还是这份 “远程屏幕传输 (差异截图)” 比较理想 http://www.2ccc.com/article.asp?articleid=3710 |
wealsh
29205
|
2007/4/29 10:17:07 |
server CPU占太高了 30% ,只在两台分辨率不同的电脑测试,第一幅全屏图像能正常显示,之后传过来的就乱了。 |
luckyso999
29202
|
2007/4/29 8:41:11 |
这样的真正有用的高速屏幕傳輸程序代码网上真是少,感谢分享! |
swgame
29201
|
2007/4/29 8:10:05 |
程序运行了一下,感觉不错,谢谢分享。 |