mitchcurtis / slate

Pixel Art Editor
GNU General Public License v3.0
1.07k stars 103 forks source link

Closing Slate with large images open takes a long time #134

Closed mitchcurtis closed 5 years ago

mitchcurtis commented 5 years ago

Open a large PNG (e.g. > 1 mb) and then quit the application. On macOS the app takes ~30 seconds to close, using almost 100% CPU.

mitchcurtis commented 5 years ago

Seems to be the AutoSwatchModel:

1  __psynch_cvwait                                                                                                       (x86_64) /usr/lib/system/libsystem_kernel.dylib                                                                     0x7fff7c96186a 
2  _pthread_cond_wait                                                                                                    (x86_64) /usr/lib/system/libsystem_pthread.dylib                                                                    0x7fff7ca2056e 
3  QWaitConditionPrivate::wait(QDeadlineTimer)                                                                           qwaitcondition_unix.cpp                                                                                        146  0x100207baa    
4  QWaitCondition::wait(QMutex *, QDeadlineTimer)                                                                        qwaitcondition_unix.cpp                                                                                        225  0x100207adf    
5  QWaitCondition::wait(QMutex *, unsigned long)                                                                         qwaitcondition_unix.cpp                                                                                        208  0x1002079a4    
6  QThread::wait(unsigned long)                                                                                          qthread_unix.cpp                                                                                               788  0x1001f6a1e    
7  AutoSwatchModel::~AutoSwatchModel()                                                                                   autoswatchmodel.cpp                                                                                            65   0x10444ee5d    
8  QQmlPrivate::QQmlElement<AutoSwatchModel>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  108  0x1000131e8    
9  QQmlPrivate::QQmlElement<AutoSwatchModel>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  106  0x100013175    
10 QQmlPrivate::QQmlElement<AutoSwatchModel>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  106  0x100013199    
11 QObjectPrivate::deleteChildren()                                                                                      qobject.cpp                                                                                                    2019 0x100537776    
12 QObject::~QObject()                                                                                                   qobject.cpp                                                                                                    1032 0x100537473    
13 QQuickItem::~QQuickItem()                                                                                             qquickitem.cpp                                                                                                 2444 0x102d83793    
14 QQuickFlickable::~QQuickFlickable()                                                                                   qquickflickable.cpp                                                                                            753  0x102ea3525    
15 QQuickItemView::~QQuickItemView()                                                                                     qquickitemview.cpp                                                                                             170  0x102f04992    
16 QQuickGridView::~QQuickGridView()                                                                                     qquickgridview.cpp                                                                                             1252 0x102efd415    
17 QQmlPrivate::QQmlElement<QQuickGridView>::~QQmlElement()                                                              qqmlprivate.h                                                                                                  108  0x102df9267    
18 QQmlPrivate::QQmlElement<QQuickGridView>::~QQmlElement()                                                              qqmlprivate.h                                                                                                  106  0x102df91a5    
19 QQmlPrivate::QQmlElement<QQuickGridView>::~QQmlElement()                                                              qqmlprivate.h                                                                                                  106  0x102df91c9    
20 QObjectPrivate::deleteChildren()                                                                                      qobject.cpp                                                                                                    2019 0x100537776    
21 QObject::~QObject()                                                                                                   qobject.cpp                                                                                                    1032 0x100537473    
22 QQuickItem::~QQuickItem()                                                                                             qquickitem.cpp                                                                                                 2444 0x102d83793    
23 QQuickImplicitSizeItem::~QQuickImplicitSizeItem()                                                                     qquickimplicitsizeitem_p.h                                                                                     60   0x102e06a55    
24 QQuickLoader::~QQuickLoader()                                                                                         qquickloader.cpp                                                                                               316  0x102eaeeee    
25 QQmlPrivate::QQmlElement<QQuickLoader>::~QQmlElement()                                                                qqmlprivate.h                                                                                                  108  0x102dfbae7    
26 QQmlPrivate::QQmlElement<QQuickLoader>::~QQmlElement()                                                                qqmlprivate.h                                                                                                  106  0x102dfba25    
27 QQmlPrivate::QQmlElement<QQuickLoader>::~QQmlElement()                                                                qqmlprivate.h                                                                                                  106  0x102dfba49    
28 QObjectPrivate::deleteChildren()                                                                                      qobject.cpp                                                                                                    2019 0x100537776    
29 QObject::~QObject()                                                                                                   qobject.cpp                                                                                                    1032 0x100537473    
30 QQuickItem::~QQuickItem()                                                                                             qquickitem.cpp                                                                                                 2444 0x102d83793    
31 QQuickLayout::~QQuickLayout()                                                                                         qquicklayout.cpp                                                                                               723  0x10efa3aea    
32 QQuickGridLayoutBase::~QQuickGridLayoutBase()                                                                         qquicklinearlayout.cpp                                                                                         311  0x10efa7275    
33 QQuickLinearLayout::~QQuickLinearLayout()                                                                             qquicklinearlayout_p.h                                                                                         191  0x10ef9e695    
34 QQuickRowLayout::~QQuickRowLayout()                                                                                   qquicklinearlayout_p.h                                                                                         223  0x10ef9e675    
35 QQmlPrivate::QQmlElement<QQuickRowLayout>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  108  0x10ef9e655    
36 QQmlPrivate::QQmlElement<QQuickRowLayout>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  106  0x10ef9e485    
37 QQmlPrivate::QQmlElement<QQuickRowLayout>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  106  0x10ef9e4a9    
38 QObjectPrivate::deleteChildren()                                                                                      qobject.cpp                                                                                                    2019 0x100537776    
39 QObject::~QObject()                                                                                                   qobject.cpp                                                                                                    1032 0x100537473    
40 QQuickItem::~QQuickItem()                                                                                             qquickitem.cpp                                                                                                 2444 0x102d83793    
41 QQuickLayout::~QQuickLayout()                                                                                         qquicklayout.cpp                                                                                               723  0x10efa3aea    
42 QQuickGridLayoutBase::~QQuickGridLayoutBase()                                                                         qquicklinearlayout.cpp                                                                                         311  0x10efa7275    
43 QQuickLinearLayout::~QQuickLinearLayout()                                                                             qquicklinearlayout_p.h                                                                                         191  0x10ef9e695    
44 QQuickColumnLayout::~QQuickColumnLayout()                                                                             qquicklinearlayout_p.h                                                                                         238  0x10ef9f1d5    
45 QQmlPrivate::QQmlElement<QQuickColumnLayout>::~QQmlElement()                                                          qqmlprivate.h                                                                                                  108  0x10ef9f1b5    
46 QQmlPrivate::QQmlElement<QQuickColumnLayout>::~QQmlElement()                                                          qqmlprivate.h                                                                                                  106  0x10ef9f0a5    
47 QQmlPrivate::QQmlElement<QQuickColumnLayout>::~QQmlElement()                                                          qqmlprivate.h                                                                                                  106  0x10ef9f0c9    
48 QObjectPrivate::deleteChildren()                                                                                      qobject.cpp                                                                                                    2019 0x100537776    
49 QObject::~QObject()                                                                                                   qobject.cpp                                                                                                    1032 0x100537473    
50 QQuickItem::~QQuickItem()                                                                                             qquickitem.cpp                                                                                                 2444 0x102d83793    
51 QQuickControl::~QQuickControl()                                                                                       qquickcontrol.cpp                                                                                              937  0x10f22232a    
52 QQuickPane::~QQuickPane()                                                                                             qquickpane.cpp                                                                                                 255  0x10f25b871    
53 QQuickPage::~QQuickPage()                                                                                             qquickpage.cpp                                                                                                 237  0x10f2576f9    
54 QQmlPrivate::QQmlElement<QQuickPage>::~QQmlElement()                                                                  qqmlprivate.h                                                                                                  108  0x10fb9b3b7    
55 QQmlPrivate::QQmlElement<QQuickPage>::~QQmlElement()                                                                  qqmlprivate.h                                                                                                  106  0x10fb9b2f5    
56 QQmlPrivate::QQmlElement<QQuickPage>::~QQmlElement()                                                                  qqmlprivate.h                                                                                                  106  0x10fb9b319    
57 QObjectPrivate::deleteChildren()                                                                                      qobject.cpp                                                                                                    2019 0x100537776    
58 QObject::~QObject()                                                                                                   qobject.cpp                                                                                                    1032 0x100537473    
59 QQuickItem::~QQuickItem()                                                                                             qquickitem.cpp                                                                                                 2444 0x102d83793    
60 QQuickControl::~QQuickControl()                                                                                       qquickcontrol.cpp                                                                                              937  0x10f22232a    
61 QQuickContainer::~QQuickContainer()                                                                                   qquickcontainer.cpp                                                                                            473  0x10f219ece    
62 QQuickSplitView::~QQuickSplitView()                                                                                   qquicksplitview.cpp                                                                                            1075 0x10f286c49    
63 QQmlPrivate::QQmlElement<QQuickSplitView>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  108  0x10fbbb307    
64 QQmlPrivate::QQmlElement<QQuickSplitView>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  106  0x10fbbb245    
65 QQmlPrivate::QQmlElement<QQuickSplitView>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  106  0x10fbbb269    
66 QObjectPrivate::deleteChildren()                                                                                      qobject.cpp                                                                                                    2019 0x100537776    
67 QObject::~QObject()                                                                                                   qobject.cpp                                                                                                    1032 0x100537473    
68 QQuickItem::~QQuickItem()                                                                                             qquickitem.cpp                                                                                                 2444 0x102d83793    
69 QQuickControl::~QQuickControl()                                                                                       qquickcontrol.cpp                                                                                              937  0x10f22232a    
70 QQuickContainer::~QQuickContainer()                                                                                   qquickcontainer.cpp                                                                                            473  0x10f219ece    
71 QQuickSplitView::~QQuickSplitView()                                                                                   qquicksplitview.cpp                                                                                            1075 0x10f286c49    
72 QQmlPrivate::QQmlElement<QQuickSplitView>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  108  0x10fbbb307    
73 QQmlPrivate::QQmlElement<QQuickSplitView>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  106  0x10fbbb245    
74 QQmlPrivate::QQmlElement<QQuickSplitView>::~QQmlElement()                                                             qqmlprivate.h                                                                                                  106  0x10fbbb269    
75 QObjectPrivate::deleteChildren()                                                                                      qobject.cpp                                                                                                    2019 0x100537776    
76 QObject::~QObject()                                                                                                   qobject.cpp                                                                                                    1032 0x100537473    
77 QWindow::~QWindow()                                                                                                   qwindow.cpp                                                                                                    227  0x100f0a0cd    
78 QQuickWindow::~QQuickWindow()                                                                                         qquickwindow.cpp                                                                                               1377 0x102dba1ff    
79 QQuickWindowQmlImpl::~QQuickWindowQmlImpl()                                                                           qquickwindowmodule_p.h                                                                                         63   0x10f20029f    
80 QQuickApplicationWindow::~QQuickApplicationWindow()                                                                   qquickapplicationwindow.cpp                                                                                    368  0x10f2001d9    
81 QQmlPrivate::QQmlElement<QQuickApplicationWindow>::~QQmlElement()                                                     qqmlprivate.h                                                                                                  108  0x10fb8f645    
82 QQmlPrivate::QQmlElement<QQuickApplicationWindow>::~QQmlElement()                                                     qqmlprivate.h                                                                                                  106  0x10fb8f4c5    
83 QQmlPrivate::QQmlElement<QQuickApplicationWindow>::~QQmlElement()                                                     qqmlprivate.h                                                                                                  106  0x10fb8f4e9    
84 void qDeleteAll<QList<QObject *>::const_iterator>(QList<QObject *>::const_iterator, QList<QObject *>::const_iterator) qalgorithms.h                                                                                                  320  0x10231cda1    
85 void qDeleteAll<QList<QObject *>>(QList<QObject *> const&)                                                            qalgorithms.h                                                                                                  328  0x10231b2e6    
86 QQmlApplicationEnginePrivate::cleanUp()                                                                               qqmlapplicationengine.cpp                                                                                      64   0x10231b222    
87 QQmlApplicationEngine::~QQmlApplicationEngine()                                                                       qqmlapplicationengine.cpp                                                                                      250  0x10231c6d0    
88 QQmlApplicationEngine::~QQmlApplicationEngine()                                                                       qqmlapplicationengine.cpp                                                                                      247  0x10231c705    
89 QQmlApplicationEngine::~QQmlApplicationEngine()                                                                       qqmlapplicationengine.cpp                                                                                      247  0x10231c729    
90 QScopedPointerDeleter<QQmlApplicationEngine>::cleanup(QQmlApplicationEngine *)                                        qscopedpointer.h                                                                                               60   0x1000125fb    
91 QScopedPointer<QQmlApplicationEngine, QScopedPointerDeleter<QQmlApplicationEngine>>::reset(QQmlApplicationEngine *)   qscopedpointer.h                                                                                               159  0x10000de45    
92 Application::~Application()                                                                                           application.cpp                                                                                                185  0x10000dd67    
93 Application::~Application()                                                                                           application.cpp                                                                                                177  0x10000de75    
94 main                                                                                                                  main.cpp                                                                                                       7    0x10002272d    
95 start                                                                                                                 (x86_64) /Users/mitch/dev/slate-qt5_slate_fw-Debug/Debug/install-root/usr/local/Slate.app/Contents/MacOS/Slate      0x100000cd4    
mitchcurtis commented 5 years ago

For larger images, the time it takes to find all of the swatches (unique colours) in the image is really long. In the case of the image that caused this, it probably never finished before I closed Slate, and then this code caused the app to wait until it was done before actually closing:

https://github.com/mitchcurtis/slate/blob/bcfc3b12bf4ec81cf58799ec3fe89aab37678d21/lib/autoswatchmodel.cpp#L62-L66

I don't really want to support large images like this, at least not in the context of auto swatches. Putting a limit on image dimensions for auto swatches is the ideal solution for now.