Exemple #1
0
        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;
            });
        }
Exemple #2
0
        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;
            });
        }