- Subscribe to RSS Feed
 - Mark as New
 - Mark as Read
 - Bookmark
 - Subscribe
 - Email to a Friend
 - Printer Friendly Page
 - Report Inappropriate Content
 
I’m
 always on the look out for new software tools, so was delighted to 
learn about a utility created by experienced developer Jens Riboe, based
 in Sweden.   A couple of years ago, Jens wanted to demo an 
app, with the device screen mirrored to his PC.   At that time
 there wasn’t a good utility to repeatedly capture screenshots and 
display them on a host PC.   If “necessity is the mother of 
invention,” tight deadlines are probably the taxi driver rushing the 
mother to the delivery room.   Or something.  The point 
is, Jens got the screen mirroring utility working in time for his demo 
three days later. 
The app demo was a success, and Jens generously published the quick hack on his blog
 so that everyone could use it.  Jens gave it the name 
“droid@screen”.  He then moved on to other projects, and didn’t 
look at droid@screen for about a year.   By then, many 
developers were making good use of it.  So Jens decided to spend 
some time improving the software, up to its current state, version 
1.0.1.  (Open source projects infrequently get to version 1.0 or 
later!)
Droid@screen
 is a Java Swing app that runs on the host PC.  It uses the Android
 debugging API to take a screenshot on the mobile device, then pull the 
image file back over USB onto the host, where it is displayed.  The
 app repeats that over and over, so the PC shows any new stuff that 
happens on the device.   Droid@Screen is mostly used to give 
demos, and help with training. It’s an alternative to pointing a video 
camera at the device.  Video feeds are frequently not handled 
correctly by screen-sharing software, so droid@screen gives you the same
 effect and works reliably with screen sharing.
Figure 1: the Droid@Screen control panel, just start it up and go
The
 limiting factor on frame rate is the speed of the USB connection, 
believe it or not.   With a phone from 3 years ago, 
Droid@screen could display more than a frame per second.  As higher
 and higher resolution devices have taken over the market, it now takes 
longer to get each snapshot.  Jens added some code to display the 
data transfer rate of each screen shot.   Figure 2 shows that 
it takes about 2.8 seconds to retrieve a 540x960 resolution screen image
 from my DROID RAZR.
Figure 2: the lower part of a screen image, showing size and transfer time
That
 is way too slow!   It’s moving 540x960 pixels, each 
represented by 4 bytes of color and alpha information.  That’s 
about 2 MB of data for each screen.   My development Mac has 
USB 2.0, which has a nominal speed of 480 Mbit/sec, or 60 Mbyte/sec. 
 Why isn’t it transferring each frame in 1/30th of a second?  
 Well, the nominal rate is 60 MBps, but that doesn’t include packet 
overhead, dropped packets, bus negotiation, collisions, cosmic ray 
effects, dust mites, etc.  The effective throughput for USB 2.0 is 
more like 30 - 35 MByte/sec effective.
So
 why aren’t I seeing 15 frames per second?  As I looked at my set 
up, I noted that I was using a USB hub.  It only took a few seconds
 to reconfigure so that the handset was directly plugged into the host 
PC.   That gave the immediate improvement shown in figure 3.
Figure 3: USB is 4X faster when it doesn’t go through a hub
When
 I make a direct USB connection, the frame image takes 0.66 second to 
get onto the development host - more than four times faster than going 
through a hub!  I could also make my adb connection to the phone 
over WiFi, instead of USB.  But 802.11g WiFi is about 10x slower 
than USB, so that will be worse not better.   The best way to 
speed up the frame rate is to reduce the amount of image data sent over 
the wire.  Since no part of the composite screenshot is 
transparent, you don’t need to send the alpha byte.  That’s an 
immediate 25% speedup.   I should still be seeing 15 fps, so 
there's more to look at here than just USB.  But part of 
performance optimization is knowing when it's "good enough" and you can 
move on to other tasks.
I saved the best information till last.  Jens open sourced his utility program, and you can find all the code on Github at https://github.com/ribomation/DroidAtScreen1.  So, if you feel like tuning this excellent app some more, you know where to find it.
Update: Jens emailed me to query the poor performance I was seeing. Here's the hardware inventory on my development Mac. The line highlighted in blue shows the problem -- I'm using a very old hub that can only go up to 12 Mbps! That's OK when I use it for the keyboard and mouse, but it really hurts when I plug a high performance computer (my phone) into it. OK, I have to stop by Fry's and get a new hub!

Peter van der Linden
Android Technology Evangelist
	
				









