qt for device creation - d21tv0wm5mksdn.cloudfront.net · • how qt for device creation addresses...

48
Qt for Device Creation Nils Christian Roscher-Nielsen Product Manager, The Qt Company

Upload: others

Post on 17-Nov-2019

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Qt for Device Creation

Nils Christian Roscher-Nielsen

Product Manager, The Qt Company

Page 2: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 20152

Overview

• Problems facing device creators• How Qt for Device Creation addresses those problems

• Boot to Qt pre-built reference stack

• Demonstrations

• Performance improvement tools• Qt Quick 2D renderer

• Qt Quick compiler

• QML Profiler

Page 3: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 20153

Problems facing Device Creators (Software)

• Finding an Software Development Kit

• Interfacing with Hardware

• Finding Middleware to accelerate development

• Tooling that enables rapid iterative development

Page 4: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 20154

Software Development Kits for Device Creation

• System Images• Software that runs on the hardware

• Toolchain• Compilers

• Tools

• Sysroot• Development files for system image

Page 5: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Operating System SDKLinux

• Yocto

• Buildroot

• Ubuntu/Debian

• Board Support Packages (BSP)• Linux kernel (patches)

• Graphics Drivers

• Radio hardware firmware

• Wi-Fi

• Bluetooth

• NFC

• GSM

© 20155

Page 6: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Operating System SDKOther

• AOSP (Android Open Source Project)• Linux/Android Kernel

• Standardized platform

• Windows Embedded• Pre built images from the HW vendor

• Microsoft provides and controls the SDK and tooling

• QNX

• VxWorks• Need to go through the OS vendor to get image and SDK

© 20156

Page 7: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Interfacing with Device Hardware

• Camera and Sensors

• GPU • OpenGL

• OpenCL/CUDA

• Radio (Wi-Fi, Bluetooth, NFC)

• Serial, CAN, i2c

• Audio

• Display

© 20157

Application

Qt Libraries

Platform Native Interfaces

Linux AndroidWindows

EmbeddedQNX VxWorks

Page 8: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 20158

Accelerating Development with Qt Middleware

• User Interface Primitives • Buttons, Checkboxes, Radio Buttons

• Views

• Easily converting designer’s vision into a User Interface • Look and Feel

• Internationalization Support

• Input methods (Virtual Keyboards, remote controls)

• Integrated Web Browser

• Multimedia playback

Page 9: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 20159

Qt Developer Offering, Cross-Platform APIs

GUI

non-GUI

Essentials

Add-onsWidgets

C++Native LAFLayoutsStylesOpenGL

Qt Quick

QMLControlsLayoutsStylesOpenGL

WebEngine+ WebView

HTML 5Hybrid UIs SVG

Canvas 3D

Serial PortCore

ProcessesThreadsIPCContainersI/OStringsEtc.

Multimedia

AudioVideoRadioCamera

Sql

SQL and Oracle databases

Network

HTTPFTPTCP/UDPSSL

Qt Test

Bluetooth

Positioning Concurrency

Printing Scripting

NFC Platform Extras

XML Sensors

Image formats

Charts

In-App Purchasing

Data Visualization

Virtual Keyboard

Page 10: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 201510

Tooling for Rapid Iterative Development

• IDE (Integrated Development Environment)

• Ease of deployment to devices

• Remote debugging and profiling

• Simulation/Emulation of devices

Page 11: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Qt Creator

Page 12: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 201512

Qt UI Offering – Choose the Best of All Worlds

Qt Quick

C++ on the back, declarative UI design

(QML) in the front for beautiful,

modern touch-based User

Experiences.

Qt Widgets

Customizable C++ UI controls for

traditional desktop look-and-feel. Also

good for more static embedded UIs

for more limited devices / operating

systems.

Web / Hybrid

Use HTML5 for dynamic web

documents, Qt Quick for native

interaction.

Page 13: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 201513

Rapid Workflow with Qt Quick

Developer

Declarative UI Design

Modern User Interfaces, written with QML. Ideal for rapid UI prototyping.

Imperative Logic

Power of Cross-Platform Native Qt/C++

Core

Processes, Threads,IPC, Containers,I/O, Strings,etc.

Network

HTTPFTPSSL

Sql

SQL &OracleDatabases

XM

L

Blu

eto

oth

Po

siti

on

ing

NFC

Se

ria

l Po

rt

Designer

+ Direct Hardware Access

Page 14: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 201514

Boot to Qt Pre-built Reference Stack

• Lightweight Linux stack• Without X11 (targets fbdev)

• Minimum dependencies to enable most Qt features

• Images and full development environment available for reference hardware

• Build scripts to further customize the image and SDK for your needs

Page 15: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Immediate Prototyping with a

Reference Stack: Boot to Qt

Page 16: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Demo Time!

Page 17: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 201517

Embedded Linux: Building your own Qt

• Toolchain

• Sysroot• Yocto/Buildroot

• Existing image

• Host machine vs Target Image

Page 18: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

© 201518

Qt Configure Arguments for Cross-Compilation

• -prefix /usr/local• Intended install directory on device

• -extprefix $SYSROOT/usr/local• Location installed on host machine by “make install”

• -host prefix ~/Qt-build/• Location to install host tools (qmake, moc, uic…)

• -sysroot $SYSROOT

• -device rasp-pi• Name of the devices mkspec you are targeting

• -device-option CROSS_COMPILE=${location_of_toolchain}

Page 19: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Improving the performance

of your applications

Page 20: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Qt Quick Profiler

Page 21: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

21

Why do you need a Profiler

• Classic optimization• Minimize the total time a program takes

• Instrument your binary to count and time function calls

• Run in an emulator to keep track of function calls

• Create Call statistics to see

• Which functions took the most time

• Which functions are called most often

• Go back and optimize

• This is not always very helpful in a Qt Quick application

Page 22: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

22

Challenges

• JIT compiled QML makes little sense in tools like Valgrind• Which functions are called?

• No symbolic information available

• Stack unwinding only with emulating profilers

• Mainly statistical information

• 40 ms event handler• No big deal statistically

• When it happens is important

Page 23: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

23

Challenges “Many” Calls

• Time for each object creation is not very important

• Number of calls a bit more interesting, but …

• Their distribution over the time frames is most important

Page 24: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

24

The QML Profiler

• Analyze modein Qt Creator1. Start/Stop profiling

2. Control execution directly or profile external process

3. Switch recording on and off while the application is running

4. Select event types to be recorded

5. Clear current trace

• Save and load traces from the context menu

Page 25: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

25

• Pixmap Cache• Slow loading or large pictures

• Scene Graph, Animations• Composition of the Scene Graph

• Memory usage• JavaScript heap and garbage collector

• Binding, Signal Handling, JavaScript, etc.• QML and JavaScript execution time

Timeline View

Page 26: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

26

• Statistical profile of QML/JavaScript

• For problems that lend themselves to the classical workflow

• Optimize the overall most expensive parts of the application to get a general speedup

Events View

Page 27: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

27

• Too much JavaScript in each frame

• All JavaScript must return before GUI thread advances

• Frames delayed/dropped if GUI thread not ready

• Result: Unresponsive, stuttering UI

• Creating/Painting/Updating invisible items?

• Takes time in GUI thread

• Same effect as “Too much JavaScript”

• Triggering long running C++ functions?

• Paint methods, signal handlers, etc. triggered from QML

• Also takes time in GUI thread

• Harder to see in the QML profiler as C++ isn’t profiled

My application is slowWhat is wrong?

Page 28: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

28

• Watch frame rate in Animations and Scene Graph

• Gaps and orange animation events are bad

• JavaScript category shows functions and run time

• Stay under 1000/60 ≈ 16ms per frame

Too much JavaScript

Page 29: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

29

• Check again for dropped frames

• Check for many short bindings or signal handlers => Too many items updated per frame

• QSG_VISUALIZE=overdraw shows scene layout

• Are items outside the screen or underneath visible elements

Invisible Items

Page 30: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

30

• Dropped frames, but no JavaScript running?

• Large unexplained gaps in the timeline?

• Check your custom QQuickItem implementations

• Use general purpose profiler to explore the details

Long Running C++ functions

Page 31: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Qt Quick 2D Renderer

Page 32: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Qt Quick 2D renderer

• Renders Qt Quick without OpenGL

• Can render fully in Software

• Makes use of 2D Hardware acceleration

• DirectFB (Linux)

• Direct 2D (Windows)

• Others possible

Qt Quick 2

Scene Graph

OpenGL QPainter

Direct2D DirectFb LinuxFb

Qt Quick 2D Renderer

© 201532

Page 33: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

33

What is the Qt Quick 2D Renderer?

Qt Quick 2

QML SceneGraph

SceneGraph Adaptation Layer

Qt Quick 2D Render

QPainter QBackingStore

OpenGL Batch Render

OpenGL (ES) 2.0

© 2015

Page 34: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

34

Problems Qt Quick 2D Renderer Addresses

• No GPU, or no OpenGL 2.0 support

• No requirement for:• Particles

• 60 FPS animations

• “Eye Candy”

• Same UI across device portfolio

© 2015

Page 35: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

35

Simple to use

• export QMLSCENE_DEVICE=softwarecontext

• But make sure you are not using unsupported features.

© 2015

Page 36: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

37

2D Hardware Acceleration with QBlittable

QBackingStore

QPixmap

fillRect

alphaFillRect

drawPixmap

drawPixmapOpacity

drawCachedGlyphs

© 2015

Page 37: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

38

Qt Quick 2 Limitations with the 2D Renderer

• ShaderEffect

• Particles

• Sprites

• Custom Items with OpenGL

• RenderControls

© 2015

Page 38: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

39

Not Just for Embedded

• Works anywhere QWidget works• Uses the same rendering path as QWidgets

• No dependency on QWidgets Module

• Desktop Platforms• Windows (remove OpenGL dependency)

• Linux (X11 Forwarding)

• Remote Desktop

© 2015

Page 39: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Future of 2D renderer

• OpenVG• Possible to add support

• Not planned at the moment

• Let us know if you are interested

• New Hardware• Moving beyond DirectFB

• Partnering with HW vendors

• Customer requests

• Many improvements to come• Close collaboration with users

© 201540

Page 40: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

Qt Quick Compiler

Page 41: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

42

Background

• Qt Quick applications consist traditionally of a mixture of• C++ code

• Declarative QML files with embedded, imperative JavaScript code

• Additional resources such as PNG image files

• C++ code gets compiled to native code in target architecture

• PNG image files and other resource get embedded into the resulting binary through the Qt Resource System

• QML source files need to be deployed verbatim to the target device

Page 42: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

44

Introducing Qt Quick Compiler

• Allows for compilation of .qml and .js files in Qt Quick applications ahead of time

• Output is portable C++ code that is compiled alongside the application C++ code

• Embedded in the final application binary

• Requires a commercial Qt license

Page 43: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

48

Memory Consumption: Example Samegame

• Environment: Linux, armv7, release build

• Without Qt Quick Compiler:• smaps reports:

• Private_Clean: 4076 kB

• Private_Dirty: 12744 kB

• With Qt Quick Compiler:• Private_Clean: 4652 kB

• Private_Dirty: 11976 kB

• ~600 kB memory became mmap()’able from disk

• Merely by flipping a switch in the build system

Page 44: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

52

Start-up time: Same game example

• Platform: Linux, x86-64

• Counting instructions with callgrind (stable)

• Without Qt Quick Compiler:• ~461 Million Instructions for startup

• With Qt Quick Compiler:• ~339 Million Instructions for startup

• 27% instructions saved, merely by flipping a switch in the build system

Page 45: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

53

Run-time Performance Implications

• Qt Quick Compiler generated code is about as fast as Just-In-Time compiler in average• Where JIT is available

• Just-In-Time compilation not supported on all platforms

• Fallback to byte-code interpreter on PowerPC, MIPS, etc.

• Qt Quick Compiler gives ~2x speed-up• Where JIT not available

Page 46: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

58

Summary

• Port your Qt Quick application to use the Qt Resource system

• Easily toggle use of Qt Quick Compiler in your project

• The more binding expressions and JavaScript code, the greater the benefits of using the compiler

• Safer deployment of closed binaries, rather than collection of open and readable files.

Page 47: Qt for Device Creation - d21tv0wm5mksdn.cloudfront.net · • How Qt for Device Creation addresses those problems • Boot to Qt pre-built reference stack • Demonstrations • Performance

• Qt Quick 2D renderer• Target more devices, and low-power hardware

• Qt Quick Profiler• Improve code performance

• Ensure smooth animations at all time

• Qt Quick Compiler• Shorter application start up time

• Faster application execution

• Lower application binary size

• More secure and simple-to-deployable binaries

Conclusions

59