捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:高速屏幕傳輸程序改進版
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
程序运行了一下,感觉不错,谢谢分享。
第一页 上一页 下一页 最后页 有 14 条纪录 共1页 1 - 14
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 1999-2012 V3.01 沪ICP备05001939号 更新RSS列表