Hacker News new | ask | show | jobs
by _camm 906 days ago
I haven't seen any performance issues on desktop, but on mobile they really stand out. I have separated logic into QML, and even experimented with implementing custom QQuickItems in some places.

Here are some issues I've seen related to performance on mobile:

1) Opening a larger app is really slow (maybe 3-5 seconds), but works okay for smaller apps. I'm not sure what's going on behind the scenes and haven't had time to dive deep there yet, so this could be specific to me.

2) Rendering full pages is quite slower than native, as is QML rendering in general, even when using the QML compiler (which compiles your QML to C++)

3) Qt text rendering is a bit slow too, but you may not need i.e QTextDocument if you're implementing a text editor of some sort.

3 comments

Regarding your first point, instantiating a lot of QML items is usually what makes startup slow. You can use Loaders to load things on demand (and timer triggered Loaders to load stuff you will probably need but shouldn't delay startup). Make the Loaders asynchronous and timer triggered (async but immediately triggered still slows down startup) and switch them to synchronous when their contents are needed immediately.

I have a component for it, it's 10-15 lines or so.

These performance issues are vastly different from what I experience on Desktop, so I'm curious to test my app on mobile. In my experience, C++ and QML outperforms comparable native apps by 4x.

Regarding no.3, what do you mean by QTextDocument? My block editor is implemented by each delegate being a TextArea (inh: TextEdit), and it's very fast.

One trick I've learned, is to use `reuseItems`[1][2] in ListView. It gives incredible performance boost. You'll need to adjust some things according to the onPooled and onReused signals, but it's a no-brainer for many use cases.

[1] https://doc.qt.io/qt-6/qml-qtquick-listview.html#reuseItems-...

[2] https://doc.qt.io/qt-6/qml-qtquick-tableview.html#reusing-it...

QTextDocument is a class in Qt::Gui that many of the other text classes/components use. I was thinking you may have implemented your own text handling widget/item, but using delegates of text areas makes sense too.

I will try reuseItems again. It's something I tried before briefly but thought it may have been causing some rendering glitches and removed it. Maybe because I didn't implement onResused or onPooled properly. Thanks!

> I was thinking you may have implemented your own text handling

Yes, but without QTextDocument as I had some problems with it. I had to implement my own undo/redo/copy/paste/etc.

> It's something I tried before briefly but thought it may have been causing some rendering glitches

Yes, I've experienced some (minor) glitches that I've yet to figure out how to fix. For example, the cursor seems to (sometimes) jump when creating new blocks. Sometimes delegates reappear with animation (while I turned them off when onPooled ran). I'm trying to figure out if I'm doing something incorrectly (highly probable) yet I don't get these issues without reuseItems.

Sure, I hope it works out well for you (:

Hmm, for 1 and 2 have you actually tried to profile your code? You can use the QML profiler to check which parts of QML compilation are slowing you down. Also consider using GammaRay [1] to see what's causing the rendering to be slow.

[1] https://www.kdab.com/development-resources/qt-tools/gammaray...

I'll try GammaRay. Thank you for the recommendation. I've tried the QML profiler before but I always have difficulty getting it to work on Android.