Qt Graphics and Performance – Generating Content in Threads
2011-10-04 19:55
507 查看
Qt Graphics and Performance – Generating Content in Threads
Posted by Gunnar Sletta on January 21, 2010 · 14 commentsPrevious posts in this topic:
Whats Hot and whats Not
An Overview
The Raster Engine
The OpenVG Engine
The OpenGL Engine
The Cost of Convenience
Fast Text
In this series that we’ve been doing, I wanted to cover threading, a topic that has been actively discussed amongst some of the trolls over the last few months. We’ve had support for rendering into QImage’s from non-GUI threads since the early Qt 4.0 days, but its only in recent versions of Qt, I think, 4.4 that we got support for rendering text into images. Now that support is there, it begs the question how to make proper use of it. Generating the actual content in a thread is one usecase, here is an example of it.
Qt4.0我们支持在non-GUI线程中渲染QImage,但是Qt 4.4才支持渲染text到images。
What it means is that instead of rendering all the content of a certain view in the
QWidget::paintEvent()or in the
QGraphicsItem::paint()function, we use a background thread which produces the cache. The benefit is that even though drawing the actual content can be quite costly, drawing a pre-rendered image is fast, making it possible for the UI to stay 100% responsive while the heavy loading is happening in the background. It does imply that not all content is available at all times, but for many scenarios this is perfectly fine. There is nothing novel about this approach, I just think its a nice way to solve a problem that often comes up when dealing with user experience.
这个表示我们用后台线程来产生cache,而不是全部在
QWidget::paintEvent()or in the
QGraphicsItem::paint()function中。这样的好处是我们的UI可以一直有响应。提高用户体验。
This approach is used by Google Maps (actually, what the server does I don’t know, but it sends individual tiles to the browser at least), iPhone and N900 web browsers, and I’ve talked to customers in the past that use this approach for usecases where generating the content is costly, but the user interface needs to stay responsive. In fact, this approach applies to pretty much anything where it is ok that the content is not immediately there, such as data tables like an mp3-index or a contact list, images in a data folder, etc.
The Task
Lets first look at the task. I’ve done a trivial implementation which looks in a directory and displays all the images in there. Each image is a separate content piece and I’ve put a background, a small frame around it and a drop shadow under it. Just so that there is a bit of active work going on. If you are into it, here is the Source CodeThe content pieces could have been tiles in a map of Norway or tiles composing a webpage, but I choose images, because I already had some images around and I figured it made for an ok example. The demo is run on an N900 with compositor disabled using the following command lines:
Non-Threaded:
./threaded_tile_generation -no-thread -graphicssystem opengl MyImageFolder
Threaded:
./threaded_tile_generation -graphicssystem opengl MyImageFolder
Here’s how it looks when the content is generated in the GUI thread:
The UI is running super-smooth as long as I show only the content that is already loaded. Once work is needed, the entire UI stops and the user experience is really bad. Here is how it looks if we move the work into a background thread.
The algorithm
Don’t use this particular algorithm. It is very crude and written to show an idea. First of all, because I was lazy, I used queued connections rather than a synchronized queue to schedule the pieces to be rendered. This means that the queue is managed by Qt’s event loop, out of my control. So if I pan far out, I will schedule a lot of images to be rendered, then pan beyond them before they are done. In a decent implementation, I would dequeue these and make sure that only the pieces that are directly visible are being processed.The other thing is that there is no logic to “peek ahead”. I schedule images to be generated only when I need them. If I instead scheduled them based on the current panning direction, in addition to not discarding so aggressively, it would probably result in a situation most images are rendered ahead of time.
QGraphicsView
It would be kinda cool if this could be applied directly to QGraphicsView. You set a flag on the item and instead of generating its cache pixmap in the GUI thread, it was offloaded to the worker thread. This is not straight forward however, because the GUI thread can, pr today at least, continue to modify the state of the item, while its being rendered in the worker thread. Synching these two becomes a bit of a mess, and how to solve it, if at all, is not something we have a plan for. That doesn’t prevent people from doing this kind of work in their own custompaint()functions of course.
http://labs.qt.nokia.com/2010/01/21/qt-graphics-and-performance-generating-content-in-threads/
相关文章推荐
- Qt Graphics and Performance – The Cost of Convenience
- 怎样控制Qt标题栏(How can I handle events in the titlebar and change its color etc ? )
- what is the difference between "isempty"and "isnull"in the qt bool QString::isEmpty () const Retur.
- Method of packet transmission from node and content owner in content-centric networking
- Get the content of an Iframe in Javascript – crossbrowser solution for both IE and Firefox
- Monitor and diagnose performance in Java SE 6--转载
- Linux - Sysstat [ All-in-One System Performance and Usage Activity Monitoring Tool For Linux]
- processes, threads and signals in Linux
- Get the content of an Iframe in Javascript – crossbrowser solution for both IE and Firefox
- VTK Installation and Configuration with Qt in Ubuntu
- How to read out WhatsApp messages with Tasker and react on their content in real time
- Get the content of an Iframe in Javascript – crossbrowser solution for both IE and Firefox
- service performance and analysis in cloud computing
- The most simple and easy to use Qt GUI library plug-in FTStyle (3)How do Qt4 and Qt5 choose
- Content and Complexity: Information Design in Technical Communication
- (转)2.6 Qt提供的控件和对话框类(Built-in Widget and Dialog Classes)
- INSTALL CGAL on ubuntu and use it in qt
- Get the content of an Iframe in Javascript – crossbrowser solution for both IE and Firefox
- How to use virtual path providers to dynamically load and compile content from virtual paths in
- 【转】【QT】 Threads, Events and QObjects