Cinder-BluecadetAnalytics: Initial Release

Hi All,

We recently launched a large museum project that required Google Analytics tracking and packaged everything into a new block that implements Google’s Measurement Protocol. It’s been deployed with production apps in well trafficked spaces with 5,000+ measured interactions per hour and tested at much higher simulated loads too. We’re actively using this in other projects and are happy to incorporate any feedback and address issues.

Would love to hear any thoughts and hope this is useful to other folks here.

– Ben


  • Batched event and screen view tracking
  • Extendable to support more hit types
  • Multi-threaded HTTP requests using Cinder-Asio and Protocol
  • Offline support with automatic retries at increasing intervals
  • Automatic session renewal to stay within Google Analytics quota limits
  • Automatic cache busting


Single client usage:

AnalyticsClient::getInstance()->setup(clientId, gaId, appName);
AnalyticsClient::getInstance()->trackScreenView("My Screen");
AnalyticsClient::getInstance()->trackEvent("My Category", "My Action");

Multi client usage:

mClientA = AnalyticsClientRef(new AnalyticsClient());
mClientB = AnalyticsClientRef(new AnalyticsClient());
mClientC = AnalyticsClientRef(new AnalyticsClient());

mClientA->setup(clientIdA, gaId, appName, appVersion);
mClientB->setup(clientIdB, gaId, appName, appVersion);
mClientC->setup(clientIdC, gaId, appName, appVersion);

// Will track as three unique users/clients
mClientA->trackEvent("My Category", "My Action");
mClientB->trackEvent("My Category", "My Action");
mClientC->trackEvent("My Category", "My Action");

Wauw, super nice.
Looks very well build.

Thanks for sharing!

Ps: I’m also curious on which project you used this?

Thanks, @lab101. We originally developed this for a big touch wall with 21 screens driven by a single computer at the National Air and Space Museum in DC. They have a huge amount of daily visitors (more than 50k on launch day) so we wrote this block specifically to deal with Google’s quota limits, sessions and batch management.

Wow 21 screens from one computer.
A bit of topic but how did you do that?
I did a project a while ago where we had 8 HD screens running from one computer by using 2 FirePro W7000 cards with 4 outputs per card. Did you do the same trick but then with more cards?

We had two Nvidia M6000s, which output 8 x 4k via DP 1.2 that were stitched together to a single desktop via Nvidia Mosaic. The DP signals were fed into eight video processors that each chopped the 4k streams into 4 x 1080p. So we ultimately had 32 1080p signals powering 21 screens. To fit the 32 1080p signals onto a single desktop with 21 screens we used Nvidia’s Mosaic CLI to create overlaps. Here is a rough diagram. The biggest bottleneck was in the video processors because they only supported 4k at 30 fps, but otherwise the system chewed through the resolution pretty effortlessly. Would be happy to write this up in more detail if there’s interest.


Would be happy to write this up in more detail if there’s interest.

Yes please. :slight_smile: Experience with hardware like this is priceless.

Congrats on the project and thanks for putting out the analytics block!


1 Like

Nice, thx for the diagrams. I was already wondering if it was doable to split op the signals.
One of the side effects we had with using multiple cards is that we had to bind the texture per card.

Oh interesting, we never had to deal explicitly with the fact that we had multiple GPUs in our app. Mosaic + a sync card made that pretty seamless for us. Here are a few slides from Nvidia that go into (much) more detail, but we didn’t go nearly as far as described there. We did have some funky screen tearing caused by issues somewhere between the Nvidia drivers and Windows 7 Aero, but that’s another story :slight_smile: I’ll start with a more detailed writeup to capture those. Would be curious to see how other folks have dealt with large display matrices like this.

1 Like