如何在不影响性能的情况下不断截屏?

本文关键字:情况下 性能 影响 | 更新日期: 2023-09-27 18:08:41

需求是这样的:

我必须发出一个请求截图的命令。转折吗?该命令指定了一个时间——这个时间是过去的。注意,不是永远,只有30秒的时间。

我的命令表示实际的秒,相应的屏幕截图从滚动缓存中取出并保存在一个永久位置,以供另一个进程使用。

要做到这一点,我必须每秒截取一个屏幕截图,并且我必须保存它们30秒。之后,缓存可以自己清理。

我的问题是

什么方法对桌面的截图影响最小?

如何在不影响性能的情况下不断截屏?

我无法想象每秒一帧会影响性能。您是否尝试过最简单的方法来查看它是否会影响性能?

查看http://www.dotnetjalps.com/2007/06/how-to-take-screenshot-in-c.html获取如何获取屏幕截图的信息。

我建议你使用计时器:

var ssTimer = new System.Threading.Timer((s) =>
    {
      GetAndStoreScreenShot();
    }, null, 1000, 1000);

你需要一些同步你的缓存,以防止线程问题(即试图读取缓存中的第一个项目,而它被推出)。使用锁可能是最简单的,因为它不会对性能特别敏感。

至于使用什么缓存,我建议使用LinkedList。很容易添加到列表(AddLast())并删除第一个项目(RemoveFirst()),并且由于您只有30个项目,并且屏幕截图请求相对较少,因此顺序扫描以获得第n个项目不会太耗时。

或者您可以使用ListArray实现一个简单的循环缓冲区。将索引自增为插入点,在结束时进行循环。查找就变成了简单的模运算。

按照Jim所说的,你可以将你的截图工作集存储在ConcurrentDictionary<DateTime, Bitmap>中,并设置两个计时器:第一个计时器将你的截图添加到字典中,第二个计时器将从字典中删除任何超过30秒的内容。

然而,无论你怎么划分,这对性能来说都是很糟糕的。

下面的内容:

        var imageDictionary = new ConcurrentDictionary<DateTime, Bitmap>();
        var screenshotTaker = new System.Timers.Timer(1000);
        screenshotTaker.Elapsed += (sender, e) =>
                                       {
                                           Bitmap bmp = GetScreenshot();
                                           imageDictionary.TryAdd(DateTime.Now, bmp);
                                       };
        var screenshotRemover = new System.Timers.Timer(1000);
        screenshotRemover.Elapsed += (sender, e) =>
                                         {
                                             RemoveExpiredBitmaps();
                                         };
        screenshotTaker.Start();
        screenshotRemover.Start();