From da92d2d7648d2625b69fff60a0d645d55e0fa9ac Mon Sep 17 00:00:00 2001 From: nick_m Date: Sat, 24 Dec 2016 02:01:37 +1100 Subject: [PATCH] speed up load/quit for sessions containing ~25k events. - MGR uses a _note_group to hold events. - MRV & MGR delete canvas notes directly from their note group. - sysex is untested (it uses MRV note group). --- gtk2_ardour/ghostregion.cc | 13 ++++++------- gtk2_ardour/ghostregion.h | 1 + gtk2_ardour/midi_region_view.cc | 4 +--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/gtk2_ardour/ghostregion.cc b/gtk2_ardour/ghostregion.cc index e024a1a6e7..ba8ee05a46 100644 --- a/gtk2_ardour/ghostregion.cc +++ b/gtk2_ardour/ghostregion.cc @@ -179,6 +179,7 @@ MidiGhostRegion::MidiGhostRegion(RegionView& rv, TimeAxisView& source_tv, double initial_unit_pos) : GhostRegion(rv, tv.ghost_group(), tv, source_tv, initial_unit_pos) + , _note_group (new ArdourCanvas::Container (group)) , _optimization_iterator(events.end()) { _outline = UIConfiguration::instance().color ("ghost track midi outline"); @@ -200,6 +201,7 @@ MidiGhostRegion::MidiGhostRegion(RegionView& rv, msv.trackview(), source_tv, initial_unit_pos) + , _note_group (new ArdourCanvas::Container (group)) , _optimization_iterator(events.end()) { _outline = UIConfiguration::instance().color ("ghost track midi outline"); @@ -324,7 +326,7 @@ MidiGhostRegion::update_contents_height () void MidiGhostRegion::add_note (NoteBase* n) { - GhostEvent* event = new GhostEvent (n, group); + GhostEvent* event = new GhostEvent (n, _note_group); events.insert (make_pair (n->note(), event)); event->item->set_fill_color (UIConfiguration::instance().color_mod(n->base_color(), "ghost track midi fill")); @@ -356,12 +358,9 @@ MidiGhostRegion::add_note (NoteBase* n) void MidiGhostRegion::clear_events() { - _optimization_iterator = events.begin(); - - while (_optimization_iterator != events.end()) { - delete (*_optimization_iterator).second; - _optimization_iterator = events.erase (_optimization_iterator); - } + _note_group->clear (true); + events.clear (); + _optimization_iterator = events.end(); } /** Update the x positions of our representation of a parent's note. diff --git a/gtk2_ardour/ghostregion.h b/gtk2_ardour/ghostregion.h index 377530e2ea..0259231551 100644 --- a/gtk2_ardour/ghostregion.h +++ b/gtk2_ardour/ghostregion.h @@ -116,6 +116,7 @@ public: void clear_events(); private: + ArdourCanvas::Container* _note_group; ArdourCanvas::Color _outline; ArdourCanvas::Rectangle* _tmp_rect; ArdourCanvas::Polygon* _tmp_poly; diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 1a2a255a29..4feacff3a4 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -978,10 +978,8 @@ MidiRegionView::clear_events () } } - for (Events::iterator i = _events.begin(); i != _events.end(); ++i) { - delete *i; - } + _note_group->clear (true); _events.clear(); _patch_changes.clear(); _sys_exes.clear();