簡體   English   中英

如何在不影響性能的情況下不斷拍攝屏幕快照?

[英]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個項目不會太耗時。

或者,您可以使用ListArray實現一個簡單的循環緩沖區。 遞增一個索引作為插入點,當遞增到末尾時會回繞。 然后查找就變成了簡單的模運算問題。

按照吉姆所說的,您可以將屏幕快照的工作集存儲在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM