Я не могу себе представить, что один кадр в секунду будет ужасен для производительности.Вы пробовали самый простой из возможных методов, чтобы увидеть, влияет ли это на производительность?
Посмотрите на 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
.Увеличьте индекс, чтобы он был местом вставки, оборачиваясь, когда вы увеличиваете с конца.Поиск тогда становится простым делом арифметики по модулю.