如何在不影响性能的情况下不断截屏?
本文关键字:情况下 性能 影响 | 更新日期: 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个项目不会太耗时。
或者您可以使用List
或Array
实现一个简单的循环缓冲区。将索引自增为插入点,在结束时进行循环。查找就变成了简单的模运算。
按照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();