void RunRenderWindow() { bool winStarted = false; Task winthread = new Task(() => { win = new RenderWindow(renderer, midifile, settings); winStarted = true; win.Run(); }); winthread.Start(); SpinWait.SpinUntil(() => winStarted); double time = 0; int nc = -1; long maxRam = 0; long avgRam = 0; long ramSample = 0; Stopwatch timewatch = new Stopwatch(); timewatch.Start(); IPluginRender render = null; double lastWinTime = double.NaN; bool tryToParse() { lock (midifile) { return((midifile.ParseUpTo((win.midiTime + win.lastDeltaTimeOnScreen + (win.tempoFrameStep * 20 * settings.tempoMultiplier * (win.lastMV > 1 ? win.lastMV : 1)))) || nc != 0) && settings.running); } } try { while (tryToParse()) { //SpinWait.SpinUntil(() => lastWinTime != win.midiTime || render != renderer.renderer || !settings.running); if (!settings.running) { break; } Note n; double cutoffTime = win.midiTime; bool manualDelete = false; double noteCollectorOffset = 0; bool receivedInfo = false; while (!receivedInfo) { try { render = renderer.renderer; receivedInfo = true; } catch { } } manualDelete = render.ManualNoteDelete; noteCollectorOffset = render.NoteCollectorOffset; cutoffTime += noteCollectorOffset; if (!settings.running) { break; } lock (midifile.globalDisplayNotes) { var i = midifile.globalDisplayNotes.Iterate(); if (manualDelete) { while (i.MoveNext(out n)) { if (n.delete) { i.Remove(); } else { nc++; } } } else { while (i.MoveNext(out n)) { if (n.hasEnded && n.end < cutoffTime) { i.Remove(); } if (n.start > cutoffTime) { break; } } } GC.Collect(); } try { double progress = win.midiTime / midifile.maxTrackTime; if (settings.timeBasedNotes) { progress = win.midiTime / 1000 / midifile.info.secondsLength; } Console.WriteLine( Math.Round(progress * 10000) / 100 + "\tNotes drawn: " + renderer.renderer.LastNoteCount + "\tRender FPS: " + Math.Round(settings.liveFps) + " " ); } catch { } long ram = Process.GetCurrentProcess().PrivateMemorySize64; if (maxRam < ram) { maxRam = ram; } avgRam = (long)((double)avgRam * ramSample + ram) / (ramSample + 1); ramSample++; lastWinTime = win.midiTime; Stopwatch s = new Stopwatch(); s.Start(); SpinWait.SpinUntil(() => ( s.ElapsedMilliseconds > 1000.0 / settings.fps * 10 || win.midiTime + win.lastDeltaTimeOnScreen + (win.tempoFrameStep * 10 * settings.tempoMultiplier * win.lastMV) > midifile.currentSyncTime || lastWinTime != win.midiTime || render != renderer.renderer || !settings.running ) );; } } catch (Exception ex) { MessageBox.Show("An error occurred while opeining render window. Please try again.\n\n" + ex.Message + "\n" + ex.StackTrace); settings.running = false; } winthread.GetAwaiter().GetResult(); settings.running = false; Console.WriteLine("Reset midi file"); midifile.Reset(); win.Dispose(); win = null; GC.Collect(); GC.WaitForFullGCComplete(); Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine( "Finished render\nRAM usage (Private bytes)\nPeak: " + Math.Round((double)maxRam / 1000 / 1000 / 1000 * 100) / 100 + "GB\nAvg: " + Math.Round((double)avgRam / 1000 / 1000 / 1000 * 100) / 100 + "GB\nMinutes to render: " + Math.Round((double)timewatch.ElapsedMilliseconds / 1000 / 60 * 100) / 100); Console.ResetColor(); Dispatcher.Invoke(() => { Resources["notRendering"] = true; Resources["notPreviewing"] = true; }); }
void RunRenderWindow() { bool winStarted = false; Task winthread = new Task(() => { win = new RenderWindow(renderer, midifile, settings); winStarted = true; win.Run(); }); winthread.Start(); SpinWait.SpinUntil(() => winStarted); long time = 0; int nc = -1; long maxRam = 0; long avgRam = 0; long ramSample = 0; Stopwatch timewatch = new Stopwatch(); timewatch.Start(); try { while ((midifile.ParseUpTo(time += (long)(win.tempoFrameStep * 10)) || nc != 0) && settings.running) { SpinWait.SpinUntil(() => midifile.currentSyncTime < win.midiTime + win.lastDeltaTimeOnScreen + (long)(win.tempoFrameStep * 10) || !settings.running); if (!settings.running) { break; } nc = 0; Note n; lock (midifile.globalDisplayNotes) { var i = midifile.globalDisplayNotes.Iterate(); double cutoffTime = 0; cutoffTime = win.midiTime; while (i.MoveNext(out n)) { if (n.delete) { i.Remove(); } else { nc++; } } } try { Console.WriteLine( Math.Round((double)time / midifile.maxTrackTime * 10000) / 100 + "%\tNotes loaded: " + nc + "\tNotes drawn: " + renderer.renderer.LastNoteCount + "\tRender FPS: " + Math.Round(settings.liveFps) + " " ); } catch { } long ram = Process.GetCurrentProcess().PrivateMemorySize64; if (maxRam < ram) { maxRam = ram; } avgRam = (long)((double)avgRam * ramSample + ram) / (ramSample + 1); ramSample++; } } catch (Exception ex) { MessageBox.Show("An error occurred while opeining render window. Please try again.\n\n" + ex.Message + "\n" + ex.StackTrace); settings.running = false; } winthread.GetAwaiter().GetResult(); settings.running = false; midifile.Reset(); Console.ForegroundColor = ConsoleColor.Blue; Console.WriteLine( "Finished render\nRAM usage (Private bytes)\nPeak: " + Math.Round((double)maxRam / 1000 / 1000 / 1000 * 100) / 100 + "GB\nAvg: " + Math.Round((double)avgRam / 1000 / 1000 / 1000 * 100) / 100 + "GB\nMinutes to render: " + Math.Round((double)timewatch.ElapsedMilliseconds / 1000 / 60 * 100) / 100); Console.ResetColor(); Dispatcher.Invoke(() => { Resources["notRendering"] = true; Resources["notPreviewing"] = true; }); }