无论如何还是想把前段时间写到一半的程序做个了结,情况是这样的,当时天真的想做个类似电子教室的程序,最主要的功能也就是监控了,在大家的帮助之下,总算是成型了,最基本也最重要的功能也就是屏幕监控的是实现了,我是这样子做的,Client 截取屏幕图像,进行编码压缩,发送至 Server,Server 接收数据解码,显示,用 Intel Jpeg Library ,将 BMP 数据转 Jpeg ,测试时效果还不错,至少看不出延时,但是有个致命问题致使我停下来没有继续写下去,那就是 CPU 占用问题,太占用 CPU 了,在我这台上,Server CPU 占用 15% 左右,而 Client 除了编码之外,还要不停的抓取屏幕数据,CPU 高达 35% 左右,而在一些较老的配置较差的机器上,Server 60% 左右,Client 则接近 99%,这个致命的问题,BMP 数据的编码和解码,太消耗 CPU 了,这样怎么行,但我下载过一些试用版的电子教室软件,查看过它们的 CPU 占用稳定情况下都是接近 00 的,最多也不过个位数,不知它们是怎么做到的,目前还没想到解决的方法,大家有什么好的设计方法或者思路,能解决这一问题的?    谢谢!

解决方案 »

  1.   

    在发送和接收的循环节的第一行加上 sleep(1);
    老机器sleep(5);
      

  2.   

    使用多媒体格式的话,CPU占用率也没有这么高1秒钟抓20-30次就足够了。
      

  3.   

    我几年前研究过一点
    尝试一下通过DirectX函数来获得显示表面
    我当时使用IDirect3D8、IDirect3DDevice8、IDirect3DSurface8,可以比较快速地取得显示表面并处理。
    但是在某些显示设置硬件加速级别不同时,可能会引发鼠标的闪烁最好的方法还是需要开发显示的Mirror Driver来处理,这样的话CPU占用将很小
      

  4.   

    几年前我也用GDI方式做过一个类似的东西,估计现在你或许可以找到。
    在搜索引擎中输入“网络控制台”,当时为了尽量降低受控端的资源占用,我没有压缩图像,虽然代码都写了,呵呵。
      

  5.   


    是的,这样也是一个不错的方法,但是你需要一个API HOOK,挂钩一些函数,这样的话就可以判定特定情况下的屏幕变化区域了。
      

  6.   


    alfwolf 说的深了些,这些都没接触过,Mirror Driver 也没听说过,呵呵,自己还得好好学习噢
      

  7.   


    建立参考VNC的方式,可以直接从显存里捕捉数据。
    另外,VNC的算法是只发送下一个图象变化的部分(矩形区域的象素)。
      

  8.   

    VNC有2个版本
    1个是HOOK ,一个是mirror driver
    不过VNC只公开了HOOK 的版本。
    我也写过1个GDI的。效果和driver比差太多了mirror driver也不难,DDK有个SAMELP的框架
    看看DDK文档,再查点资料,应该能写得出来。
      

  9.   

    抓屏只是抓一次的,真正的监控软件是通过HOOK截取到目标被控主机的PAINT消息,发送到控制端
    然后控制端再通过底层重新绘制,具体实现方法请参考VNC
      

  10.   

    和你的图像编码策略有关.
    对于动态图像,一般都不会使用对每帧都进行单独JPEG的方式进行压缩,而是使用视频的压缩方法,可能每20帧或50帧才对图像进行一次关键帧的压缩,而其它各帧只是使用前向或后向的简单预测修正算法对其进行压缩.这样CPU利用率会非常低.
    事实上Windows自带了很多视频编码/解码组件,你可以使用vfw.h中的函数进行mpeg压缩算法进行编码.
    参考函数:ICSeqCompressFrame()