Итак, я пытаюсь проанализировать следующий фрагмент кода, написанный мной:
private void Scrn_Timer_Tick(object sender, EventArgs e)
{
watcher.Start();
try
{
using (Bitmap bmpScreenshot = new Bitmap(Program.ScreenParameters.ScreenshotWidth, Program.ScreenParameters.ScreenshotHeight))
{
using (Graphics gfxScreenshot = Graphics.FromImage(bmpScreenshot))
{
gfxScreenshot.CopyFromScreen(Program.ScreenParameters.FromX, Program.ScreenParameters.FromY, 0, 0, size, CopyPixelOperation.SourceCopy);
var rect = new Rectangle(0, 0, bmpScreenshot.Width, bmpScreenshot.Height);
var data = bmpScreenshot.LockBits(rect, ImageLockMode.ReadWrite, bmpScreenshot.PixelFormat);
var depth = Bitmap.GetPixelFormatSize(data.PixelFormat) / 8; //bytes per pixel
var screenshotData = new byte[data.Width * data.Height * depth];
//copy pixels to buffer
//Marshal.Copy(data.Scan0, screenshotData, 0, screenshotData.Length);
Parallel.ForEach(Program.slaveList, slave =>
{
Marshal.Copy(data.Scan0, slave.image, 0, screenshotData.Length);
slave.Notify();
});
bmpScreenshot.UnlockBits(data);
}
}
}
catch(Exception ex)
{
logger.Debug(ex);
}
watcher.Stop();
logger.Debug("Iteration-Time 'Scrn_Timer_Tick': " + watcher.Elapsed.TotalMilliseconds);
watcher.Reset();
}
Это System.Timers.Timer, который тикает каждые 30 мс. Он делает скриншот, получает байты и распределяет их по каждому ведомому, подключенному к моей системе.
Поэтому я пытаюсь измерить весь этот процесс, чтобы получить представление о FPS, которого я могу достичь. Мой секундомер постоянно показывает значения от 0 до 30 мс, что совершенно нормально. Но я раздражен, потому что я получаю много измерений, которые показывают 0.
Например:
2018-11-05 13:56:59.9248 [16] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 1,9086
2018-11-05 13:56:59.9404 [19] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0
2018-11-05 13:56:59.9716 [17] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0
2018-11-05 13:57:00.0028 [15] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0
2018-11-05 13:57:00.0496 [16] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 10,9468
2018-11-05 13:57:00.0652 [17] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 10,9468
2018-11-05 13:57:00.0964 [18] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0
2018-11-05 13:57:00.1432 [22] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0,8427
2018-11-05 13:57:00.1588 [19] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0,8427
2018-11-05 13:57:00.1900 [18] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 0
2018-11-05 13:57:00.2368 [23] DEBUG: Iteration-Time 'Scrn_Timer_Tick': 7,0265
Я просто не могу понять, в этом случае секундомер должен показывать 0. Я имею в виду, что в моем понимании обработка между точками измерения всегда выполняется по крайней мере, и если она прерывается, я бы поймал исключение, но я ничего не вижу ,
Так может кто-нибудь помочь мне объяснить, как появляются эти 0 измерений?