[英]How can I constantly take screen shots without killing performance?
要求是这样的:
我必须发出命令以要求屏幕截图。 扭曲? 该命令指定一个时间-该时间位于PAST中。 在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
实现一个简单的循环缓冲区。 递增一个索引作为插入点,当递增到末尾时会回绕。 然后查找就变成了简单的模运算问题。
按照吉姆所说的,您可以将屏幕快照的工作集存储在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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.