Greatly optimize WebChannel in various ways.
authorMilian Wolff <milian.wolff@kdab.com>
Wed, 23 Oct 2013 09:48:48 +0000 (11:48 +0200)
committerMilian Wolff <milian.wolff@kdab.com>
Wed, 23 Oct 2013 09:48:48 +0000 (11:48 +0200)
commit08a6c74aaa07f14e855b22fa0a2948069ffe9f5c
tree454f7fe55af75eefa3e288965730c7aea4e6723e
parent5947a251d2a01be6513b2a37075b05fe817603a0
Greatly optimize WebChannel in various ways.

This is a big code drop - sorry for that. The benefits are worth it
though, I'm sure. The optimizations were required to make the
WebChannel useable even on a low-end embedded device with medium
amount of traffic.

The changes in this patch can be grouped into different parts:

a) Do more in C++: Esp. by leveraging e.g. the new classInfoForObjects
in QtMetaObjectPublisher (on the C++ side) one can greatly reduce
the time required for initialization of the webchannel.

b) Property Caching: Instead of requiring a socket roundtrip whenever
a property is read on the HTML side, we now cache the property values
on the HTML side. Note that for this to work properly, one needs to
add proper notify signals to the property declarations, as otherwise
the cache will not get updated.

c) Grouping: Instead of sending separate messages to the clients
for every property update, these signals are grouped by a 50ms timer,
and then send aggregated to the client. This reduces the socket
traffic, as more boiler plate can be shared.

d) Compression: Some data was previously send repeatedly, such as
property name and notify signal. This is now compressed internally
where possible (i.e. for the ${propName}Changed naming scheme).

e) Message Flood Prevention: Previously, one could easily flood an
HTML client by sending data to it. If it could not work off the
incoming stream one would freeze the HTML client. Now, we wait for an
idle signal of the client prior to sending new data to it. Paired
with the message grouping and property cache mentioned above, we
are able to only send the newest data once the HTML client becomes
active again. I.e. we discard now-obsolete property updates etc.
examples/qtobject/qml/qtobject/main.qml
examples/qtobject/testobject.cpp
examples/qtobject/testobject.h
src/MetaObjectPublisher.qml
src/qobject.js
src/qtmetaobjectpublisher.cpp
src/qtmetaobjectpublisher.h
src/src.pro
src/webchannel.js