This weekend was very very bad. I paid to get featured by Free app a day true to their word over 10000 people downloaded the app.
However due to a unforseen bug Gravilocity was a completely dead in the water on the iPod touch.
After a few hours of debugging I traced this to two problems.
- The Sound Meter
- New External Display support.
the sound meter was pretty dumb, Gravilocity shares a code base with iBeams, and iBeams has a sound meter that shows up visually. This requires that I listen to the mic every frame. Now Gravilocity doesn’t have a sound meter but it does have the option to tie some of the parameter controls to the mic. So there was no reason to disable the code. The gotcha came when there was no mic, and suddenly the audio code started consuming a ton of CPU time trying to open the mic input, all it really needed was to return early, one line change. Presumably this is a bug in iBeams as well, and I just assumed it was the touch running slower then my 3GS.
So the meter didn’t turn the universe against me… But the external display did. I got external display support working for Gravilocity 1.1. You plug in the VGA out cable and poof neat party trick. Since, I make heavy use of Frame buffer objects to do the motion blur effects, it was fairly simple to pipe those dynamic textures to the external display, it was actually too simple. Since all I needed to do was draw 2 triangles per frame, there was almost no performance hit on the iPad or iPhone 3GS when the external display code was active. I stupidly left it running even if you didn’t have the display connected, in my own defense it’s pretty hard to debug Apple’s Objective C initialization framework. I had just pattern matched off of the standard OpenGL view. So I just didn’t realize when the initializers got called.
Now we get to the disaster, the iPod touch doesn’t seem to have the memory to handle the creation of a second rendering context. So one frame was drawn to the screen, and then the app became completely locked up. The fix was fairly simple, move the context initializer to the the screen got_connected function, which never happens on the touch. 3 lines of code
And now we’re all caught up to speed. 4 buggy lines of code, 10000+ downloads, 200-300 angry review trolls, fun fun fun.
What are my take aways:
- People who download busted things are a lot more vocal then the 20% that gave Gravilocity 5 stars, presumably 3gs/4g and iPad users.
- Angry reviews are depressing, especially when you’re paying for them
- Apple’s review process is just busted… At one point they were getting towards 24-36 hrs for a review. They are back up to a week. They’ve never spotted a crash in my code even though I’ve gotten a bunch of stuff through review with hard crashes in them, (usually buttons that were incorrectly wired in interface builder.) They’ve given me flack for UI choices, the attempt to give money to charity, But never a crash. If they are going to hold up an app for a week, at least test the thing on all the available devices. If they aren’t going to bother really testing the app, then give the developer a way to get a hot fix to the customer… I had a fix for the app within 3 hours of the complaints rolling in. It’s going to take a week for it to actually show up on the app store.
- iPad/iPhone universal apps… While it’s nice to support both in one app. It really increases the testing burden. Price points get locked together, mistakes in one target can drag down your ranking in the other. Even without the iPad, you can now expect to have to worry about 3-4 devices with various capabilities. not to mention OS versions.