After almost 4 months of really hard work I’ve released ThrottleLauncher 1.0!! You can check it at throttlelauncher’s portal.
This version includes quite a lot of improvements. From OpenGL ES support to a full redesigned finger friendly configuration dialogs.
I’ve already written some blog entries about OpenGL ES in ThrottleLauncher. They key in the implementation of this feature has been the multilayered core design that I implemented for the previous RC3. The ThrottleLauncher’s core is structured in different layers (following a pattern similar to MVC, but with even more layers ). That design has allowed me to implement the OpenGL support while keeping compatibility with GDI rendering. I will upload eventually a diagram of the core design.
The worst part of using OpenGL ES, IMHO, was making it compatible with all devices. I’ve had some hard time trying to make it work for the Common Lite profile while allowing the Common profile to render pixel perfect graphics. Finally I’ve had to branch the code in order to make it work for CL. I’ve not released the CL profile version because it doesn’t seem to work properly on Dell Axim.
Other of the improvements of this release is the APNG and MNG (partial) support. The implementation is not fully compatible with both specifications. The animations are a pain to handle because the take so many memory, and the take to much time to load. I finally decided to use the same method with the animations than with the rest of the graphics: they are loaded when needed and released when the page is exited.
I’ve also spent to much time optimizing the app. To do this I’ve used the NET.CF 3.5 CLR profiler tool. One of the biggest problems I was trying to solve there was reducing the number of garbage collection. The GC was causing the scrolling to stop from time to time leading to a poor user experience. Thanks to the CLR profiler I reduced the creation of objects, specially the ones caused by the user events. In fact I discovered that NET.CF creates a MouseEventArgs item for every mouse movement over the form or a control. I shorted this by wrapping the windows proc with my own function (see SetWindowLong native function).
The last great improvment in this version is the fully redesigned configuration dialogs. This dialogs are implemented by using a custom Control set, not based in the .NET controls (wich I hate ), but done directly by rendering. This custom set allows the kinetic scrolling to work equally in a WM5 or WM6.5 device, and also provides multiple resolutions support.