Category: Flash

  • Dynamic Flash Example – 1 of 3: Amazon

    For those that attended Tuesday night’s Adobe Flash Platform User Group meeting, here are the 3 examples I promised to post. Sorry took so long.

    If you didn’t attend, these are 3 examples that show how to use just a little code to access dynamic data in Flash using AS1 and AS2. A significant amount of companies have started releasing data to be used via public API’s. This data can be used by Flash to create cool, quick little widgets or even mini-applications. Hopefully these small examples will show you how you can access this data without being a programmer.

    Amazon.com has a great developer API. Using just a little ActionScript 1 code, you can quickly create Flash widgets that access their swath of services. This example shows how to utilize Amazon’s API via loading variables via LoadVars and then parsing just a bit of the XML that comes back. This particular example gets a list of books that relate to “cows”.

    Amazon Dynamic Flash 8, AS1 – Source ZIP

  • Speaking Tonight about Design and Data Driven Flash

    Via Leif’s Site:

    WHAT: The Febuary 2007 Meeting of the Adobe Flash Platform User Group of Atlanta
    WHEN: Tuesday, February 13, 2007 from 7:00 PM to 9:00 PM
    WHO: Jesse Warden presents “Design and Data Driven Flash”
    WHERE: Roundbox Global at King Plow Arts Center (directions pdf)

    About this Meeting:

    There are many ways that you can get data into your Adobe Flash projects. Some data can be gathered dynamically, meaning that the data is not hardcoded into a static SWF file. Jesse will be showing how designers and developers can create very creative & impactful solutions to various problems using dynamic data. These solutions could take the form of Flash websites, widgets, or various adverts. Jesse will arm us against the may the perception that using dynamic data requires a server/back-end programmer, or that all dynamic data has some form of cost with it. Designers and developers will discover that using very little code they have a lot of power at their fingertips.

    Join us to see how designers and developers can utilize dynamic data in their Flash projects using

    • Actionscript 1
    • Actionscript 2
    • Actionscript 3
    • examples that use Flash Players 8 and 9
    • examples using Flash Lite 2.1

    Who Should Attend?

    • Adobe Flash Professional Designers
    • Adobe Flash Professional Developers
    • Web developers seeking insights into Flash
    • Server-side programmers seeking ways to bridge creative and technical gaps
    • Anyone seeking insights into dynamic data
    • Anyone wanting look coding in the new Actionscript 3 standard
    • Users of Adobe Flash Professional
    • Anyone wishing to see a fun and energetic speaker like Jesse
  • What to Unlearn?

    Some things I’ve learned in my early career that originally helped me succeed I believe now are hurting me in job interviews. One of the pro’s to typing via dynamic languages and forgiving compilers such as ActionScript 1, Ruby, JavaScript and others is that you can code things that work very quickly. In a lot of the early agency, multimedia, and small software company work that I did, these technologies were great. They didn’t get in your way, and empowered you to quickly create programmatic solutions that were enhanced or even driven by good designers. You could hit insane deadlines, recompile changes quickly for a client, and react flexibly to ever changing, almost fluid requirements… if any.

    I believe those early successes helped me become very pragmatic, agile, and optimized. While I to this day still question a lot of what is considered “good programming” practices, I believe my pragmatism allowed me to judge what OOP, design patterns, and frameworks were appropriate, and how much of each were used based on a projects need. As my projects increased in scope, I learned to love strict-typing. Design patterns helped organize my code enough to be able to quickly change the design for whatever reason and still have my code work. I learned to love frameworks such as ARP & Cairngorm as I started getting more development help on projects ( I used to be the only developer).

    …things have changed. With the release of Flex 2, 2006 opened the door for traditional programmers, both server-side an client side, to now contribute and benefit from the SWF format. Now they can create RIA’s, and really enjoy doing so. New blogs from talented developers you may not of known in the if you were strictly in the Flash Dev community are popping up daily, all with great code & development techniques to contribute to the greater community. Some were sleepers, others are just now getting around to getting a blog because other traditional developers are doing it too, and some are just coming into the echo chamber that is the Flash / Flex development blogosphere . All bring with them their style of development. More often than not, these are real developers that don’t have the learned expectations of a lot of the early pioneers and frontiersmen that were those early brave programmers like Branden Hall, Colin Moock, etc.. They are the ones who use Test Driven development, Inversion of Control, and some even care about your CMM level. Some are all about the Flex Component & FDS API’s where others are swimming around the boilerplate, low-level Flash Player AS3 API’s such as ByteArray & Socket as if they were nothing foreign and new.

    One things is abundantly clear, though. These are programmers, and they mean business. Business in the sense that they have lingo, processes, and development setups that only used to trickle into the Flash Development community. Granted, there are plenty of prior art to showcase all of these things in some shape, form, or fashion in our community, but never has it been on such a paradigm changing scale as this.

    Why does this matter?

    For one thing, these guys n’ gals don’t know the Flash Player, they just know they like what it can do. Most don’t know, nor care to know, about what an 8 bit alpha channel is, and how it revolutionized what we can do with design on the web. …but they know we do, and they want us on their teams because they need to focus on getting their J2EE back-ends to work wonders with our Flex front ends. If you know Flash and/or have a minuscule amount of Flex experience with a design background, you are in high demand.

    The common theme I keep seeing is that Flex is being used more and more in a lot of traditional enterprise development setups. This means having an actual Quality Assurance team, maybe even user testing, all with the assumption you’ll use the tools and processes that traditional Java developers on large teams use. I feel a lot of Flash Developers have spent their entire careers learning more and more about traditional software development to augment their ability to be more successful in their traditional multimedia & agency work. That is, of course, unless they truly have crossed over to full application development and are just waiting for Flash Player 9 to hit the magic 80% penetration mark before they make the dive to AS3 or event Flex. Either way, I feel we’ve all had this open mind about learning new things since our industry in particular has changed so fast. While I may be extremely suspicious of using test cases, or appear quite unconvinced about having Spring lend some of its concepts to the client, I’m actually very open. Again, while we’ve had a lot of great traditional developers contribute their learning to our industry to help move us forward, never had we had an entire industry merge in like this, and on such scale. So, I’m still learning every day about how a myriad of development teams do their work based on their varied backgrounds ( C, C++, Java ) and what tools and processes they use to make better software.

    It’s just really really hard to match those lessons they’ve learned with my own pragmatic ones. They don’t complement each other at all. They come to a harsh clashing in the old consulting adage of “fast, cheap, and good… choose 2”. If you want me to develop a widget for a client in 1 week (which is definitely more than reasonable), I see little value in creating test cases and implementing ARP . I’ve been burned too many times not to use source control, but what if I had 2 months… would those tools, and those who corroborate their joy of being converted be now justified? I’m sure the traditional software devs are nodding their heads saying, “Obviously”. Of course, if you asked them if they blindly accepted new frameworks and processes, I bet you most wouldn’t say “No”; they’d look at them logically, and want to see proof on ROI of their time invested before learning them.

    But is there any return? Do I have anything to give? What about all the accelerated development talents, tricks, and skills I’ve learned over the years to hit impossible deadlines with design and code… how do I convey value to them that a traditional software dev would understand? Obviously the Ruby guys “get” what the advantages of loosely typed languages, and the agency non-coders love when we have good attitudes to make their designs do awesome dyanmic things, but how do you translate that to AS3, when you are rewarded twice for strong-typing: speed & maintainability? I could not strongly type and turn off compiler warnings, type far less code, and get things done a lot faster. But to what gain? We are no longer suffering the agency problem under-bidding on both price & time forcing designers & programmers to slave away at immense hours of time (well… some of us). Yes, clients in the Enterprise sphere are as demanding as well, but we’re talking months or years here, not days & weeks.

    I guess what I’m saying is, the software developers coming to Flex already have preset ways they develop; Flex is just a technology in their repertoire where I think for a lot of us from the Flash background, it’s a way of life. And that way of life has drastically changed. And I think it’ll continue to change as swaths of more and more traditional software devs, both enterprise and small, get on board in such numbers we’ve never seen before. For them, it’s a nice, new opportunity to create more rich GUI’s that are easier to deploy, easier to develop for, and more enjoyable for all involved. For us old skoolerz? Our life is changing. What I’m having problems accepting is that it’s “supposed” to fit into traditional development molds. It seems just obvious now that the CompSci’s have their true IDE, command line compiler, and strongly-typed runtime. To me, it just seems one of the many ways to utilize the SWF platform, and therefore, nothing is implied or inferred.

    I feel like I have a lot to offer. I know how the Flash Player works. I know how to get a variety of designs to work. I know how to talk any back-end there is. I know how to get complementary technologies and tools to help make my development & design implementations efficient. I remove headaches from server-side developers, and they remove mine. I have client development experience that translates to both web application development and desktop development. I can get things done, and if need be, get them done quickly. The J2EE guys like this. What they don’t understand is us Flash and early Flex devs weren’t around for the EJB wars, or all of the other battles fought over blogs, email lists, and conferences about how Spring & Hibernate revolutionized server-side Java development, and that industry as a whole. When we ask questions, it’s because we didn’t participate in that. We had our own battles dealing with the maturation of a fledgling language moving from a dynamic environment to a more traditional programming one. Those are growing pains, yes, but they do not necessarily translate to process ones. This doesn’t mean we have the proper context to appreciate what you all have to offer. Just something to keep in mind when you explain something that’s wonderful in your work flow, and you’re greeted with a blank stare. Something to think about. We’re not dumb, we love new toys, and love this stuff as much as you do. An ActionScript developers’ life is fraught with learning new things all the time. That’s what makes it fun. It’s just there are wayyyyyy more opinions & options now than 5 years ago.

    I know that insane deadlines, hastily written ActionScript 1, and non-source controlled projects will still exist for some time. This could even be for me via side contract jobs I take to supplement my full-time income. To me, those development decisions exist because you can thrive on them in such fast-paced environments. It’s just been really hard to reconcile the lessons I learned from those areas into traditional software development, specifically in interview conversations. You can really sound like a buffoon to those people even if you’ve had a long history of proven successes & notes of merit. So far, I’ve had a few instances of tension with the bigger companies, and none with the startups. Basically, those who use more Enterprise development technologies struggle to understand why I wouldn’t WANT to use their uber-involved processes whereas the startups and I really have synergy in “getting things done”. When I bring this up to the Enterprise potential employers, they are definitely in agreement that they too like to get things done.

    …but it’s not the FIRST thing they said.

    Anyway, just wanted to point out it’s something that’s been challenging for me to reconcile: past learned lessons on “how to survive as an engineer in a fast-paced environment” coupled with “how to develop maintainable, long-lived software”. Different worlds, man, different worlds.

  • Invalidation Strategies for Flash Player

    Skip Intro

    Had the honor of meeting up with an old friend yesterday. Chris Skogen, one of the talented gents at Gizmolabs, was my manager & tech lead when I worked at BellSouth. He’s an extremely talented programmer, doing a lot of C, C++, assembly, and Java. Below is some of his team’s coding + hardware work in action. This is not actually the record music playing, but rather, the record’s time code being used to scrub an MP3. Plethora of other features but… isn’t this one alone enough to make you go, “OMFG!!!”

    He’s been doing it for a long time, and since I respect anyone who has a lot of experience in this industry, I pretty much spent the day absorbing every word. We were supposed to meet for lunch since her majesty and I skipped out on going to a Christmas party of a friend of his that we RSVP’d too. Figured, I could buy him lunch and he’d forgive me. Anyway, instead of staying an hour at noon, stayed till 7pm mainly talking shop, finishing with Gears of War coop. He’s the guy that got me typing my brackets on a new line after he and another C coder at BellSouth started making fun of my if statements (Flex Builder is biased against this way of coding, btw…bleh !). He was also the guy who first introduced me to the Command pattern, and wondered if the Flash community had any framework like that. Four months later, I was all into ARP, which has the Command pattern as its central crux.

    I spent some of the time asking about invalidation methods. Invalidation being defined as “painting the screen with pixels in an efficient manner”, also known as redraw. Since he develops for multiple platforms, he knows the libraries and strategies involved for screen redrawing on Linux, OSX, Windows, and various devices. I remember one of Bruce Epstein’s books, Director in a Nutshell describing “The Great White Flash”. It’s been so long I can’t really remember the cause, but the redraw of the window caused the application to start with this white flash, basically a redraw of the screen that sabotaged the initial experience with various ways around it. When Chris would describe Windows redraw events compared to other platforms, it sounded all too familiar. The Director mantra back then was, “If you build it on PC, you know for a FACT it’ll work just fine on a Mac. If you develop on a Mac, it will NOT work on a PC.” A lot of the intricacies of when something redraws an area, how you have to manage it, etc. seemed really gross, and painful. However, like a lot of C guys I’ve talked to, he seemed to take it stride, view it as a conquered fiefdom, and begin to relay the double-buffering strategy employed in some cross platform library. Must… get… that… attitude!!!!

    In particular, I recently had the good fortune of getting Greg Burch’s, bloke employed at Adobe on the Mobile Team, feedback on my Flash Lite 2 component set. The guy clearly knows his stuff, has massive knowledge in ActionScript optimization, and is very focused in achieving that goal. He also understands mobile GUI development as well as the experience users expect on devices. After talking to him on the phone, I can clearly see why he is employed with Adobe on the Mobile Team. In our discussions, both offline and on, he basically set out in the opposite direction as me. While I was originally interested in creating a nice API as a tertiary benefit to the original 3 goals, he instead approached it from a “we must make it lightweight”. Even 10 seconds of his recounting of past projects with no supportive details clearly indicates that he has earned in blood a lot of great techniques and understandings. Basically, he is making the code look as much like ActionScript 1 as possible (even C for that matter), not as an intention, just a result that optimization and ActionScript 2 & OOP do not go hand in hand. While he is confident and happy with these potential changes, I was somewhat disheartened. His suggestions all met the first goal of “if it runs Flash Lite 2, the framework needs to work”, but I felt it was losing a lot of it’s utility to developers; they would now have to do a lot more work (typing basically, and not all of it comfortable). However, if you are going to run under the insane CPU & RAM restraints, no one is left unscathed. Welcome to the suck.

    After talking to Chris, however, he pretty much corroborated everything Greg was suggesting and had little empathy for my forlorn yearning for OOP. This lead to a very interesting discussion about inheritance vs. interfaces. He’s a big believer in programming by contract; having classes implement interfaces instead of using the extends keyword. After hearing him recount the challenges of being “a slave to the base class”, I totally understand and agree… for large scale projects with uber-knowledgeable individuals. If you are on a deadline, and have a variety of skill sets on your team, abstracting details seems to me like a good thing. I hate those projects, though,hehe! Flash Lite, however, has no room for interfaces as they too are basically objects like classes, and take up RAM. I digress I know, but it’s fun stuff.


    Anyway, let me give some context first. There are multiple ways to redraw things to the screen in the Flash Player, with different repercussions in performance and developer approach. You basically have the following options in Flash Player 9:

    1. DisplayList
    2. Blitting
    3. Drawing

    Both blitting and drawing depend on the DisplayList, but they are not mutually exclusive. The DisplayList is the act of adding a graphic object to a list of “things to draw”. If the Flash Player see’s it in there, it’ll get drawn. You can remove the object from the list, and it’ll no longer be drawn. This has a lot of positive repercussions in that a graphical object can exist in RAM without taking up CPU resources being drawn. Flash Player 8 and below did not do this. If you created a graphical object, like a MovieClip for example, even if it was invisible, it would still take up system resources being drawn every frame.

    Suddenly, the programmer now has control over what is drawn, and when. This makes coding easier, too, because you can choose when to draw things, therefore writing more scalable & efficient applications… just what Flex needed when you started writing these gigantor Enterprise apps that made Flash Player 7 & 8 scream in pain.

    There is something, however, more efficient than the above. This is called blitting. It is the act of painting a bitmap to the screen. A Bitmap is a DisplayObject in Flash Player 9, meaning it can be painted, or not painted, to the screen at the developer’s discretion. While Flash Player 9 has removed the problem of “too many objects == too much system resources”, Bitmap never has this problem even if those objects are in the billions. This is because you only ever have 1 bitmap (usually) that you paint on top of. Therefore, you actually have multiple small objects in memory that are then redrawn at some interval to the screen, and ONLY those areas that have changed. This is actually what is probably under the hood of the Flash Player, written in C/C++, that is redrawing all of your DisplayObjects. However, if you know going in that you’ll have a lot of objects which aren’t interactive, blitting is a wonderful technique that scales well, uses less RAM than the DisplayObject , and CPU is minimal because Bitmaps don’t use a lot of CPU to redraw compared to vector graphics. This technique can be used in the Flash Player 8 as well, although, there is no DisplayList so even if the Bitmap isn’t being visibly shown, it is still taking up CPU cycles to redraw it. Both can be combined with double-buffering where you paint to an off-screen bitmap, and copy pixels onto a on screen, smaller one.

    Finally, there is drawing. Drawing is the act of using the Flash Player’s vector drawing API to create vector graphics. These are wonderful in that the engine to create them is small, and they take next to no RAM. They look nice in terms of anti-aliasing, and the API is simple enough you can create some pretty sophisticated results by building atop that foundation. The downside is that drawing doesn’t scale very well. A lot of “anything” in Flash Player 8 and below used a lot of CPU, and vector content is definitely a prime candidate to use those resources. There are various techniques you can apply in Flash Player 8 and 9 using cacheAsBitmap, scrollRect, or even blitting the resulting drawing and thus removing the vector part.

    The way each of the above is rendered is doing on an interval, called a “frame”. Flash Player was built originally as a vector to pixel renderer , and later incorporated a timeline to show changes in these images over time. In effect, a lightweight animation tool was the result, hence Flash Player’s rising popularity for design in the Internet during the modem, low bandwidth days. These frame ticks run on some developer / designer set time code, like “15 frames a second”, or “120 frames a second”.

    What that means is that the Flash Player will update the screen 15 times a second, but more no more. It is not guaranteed to update the screen that many times for various reasons such as screen refresh, CPU usage, etc., but it IS guaranteed not to update more than the set frame rate. This is useful for animators to convey motion. As Ted Patrick has written about in the past, the introduction of the ActionScript Virtual Machine share’s this time between rendering. The important thing to understand, though, is that ActionScript for the most part is single-threaded. This means that once it starts, it doesn’t stop till it’s done running all of it’s code. If you have a lot of “stuff” happening when a user clicks a button, that code is run, and nothing else can really happen in the meantime. There are various threads that the Flash Player spawns to handle network operations, keep tabs to see if theAVM stopped responding for whatever reason, but none of these are accessible to the developer. Bottom line, if you’re code is busy doing things, you’ve allocated less time to the Flash Player graphics renderer to redraw the screen, and thus you’ll lose redraw fidelity.

    How do you then lessen this impact, and create an effective invalidation solution given the technology?

    In Flash MX and Flash MX 2004, an invalidation routine was created that ensured that components were only ever changed visually once per frame. This was done because while the developer was more than capable of changing a MovieClip‘s x and y coordinates on the screen multiple times in a few milliseconds, it would only actually render once. Changing those properties directly actually triggers a need to redraw event in the Player, and thus you are being very inefficient in your use of the Flash Player. To remove this problem, the first technique was a convention called drawing and invalidation. You would have a few private properties in a base class that abstracted MovieClip , and allowed you to change it’s properties with the ability to then invalidate on your own time. Some would invalidate immediately. It was a good first attempt, but was more formalized and better implemented when ActionScript 2 came onto the scene in Flash MX 2004. While AS2 still outputted the same bytecode as AS, it still implemented the main function that made this possible, introduced flexibly in Flash Player 6: onEnterFrame.

    The enter frame event is something emitted every frame. In Flash Player 9, DisplayObjects do this regardless of whether something has a timeline or not, 1 frame or 10 billion such as MovieClip & Sprite. While the name itself is somewhat legacy, it is useful to understand what it really means. First, it is guaranteed to be fired once per frame. Unlike setInterval which can fire randomly (at most 10 times per frame, or less for longer intervals), you can depend on the onEnterFrame function to run when you expect it to run. When it actually fires within a frame context isn’t important. What is important to know is that it is synonymous with “redrawing now”. Since you can only redraw once per frame, it fits in nicely with knowing when you are best suited to do so effectively. FlashMX & Flash MX 2004 would use the invalidate method for graphical components. This meant, “redraw next frame”. So, the developer could change a bunch of properties, styles, etc. and theMovieClip wouldn’t actually redraw itself visually (by setting _x, _width, applying a color, etc.) until the next screen redrawn, no matter how many were changed, or how many times the same one was changed.

    This was great in theory, but a lot of the race conditions with measurement and styles made it hard to effectively do. Regardless, it was THE best way to ensure effective redraw. This was slightly improved upon in the Flex 1.5 framework with a more formal system:
    – set a property
    – if it causes a redraw, invalidate a draw function, otherwise have that property’s dirty flag set
    – if a dirty flag was set, determine what type of redraw to perform, a draw, size, measurement, or style change
    – invalidate one of those functions if applicable
    – one of the invalidated functions would run at the next redraw

    This made possible larger Flash Player applications. The problem was, though, that even if things weren’t redrawing and just sitting there, they were still taking up resources, regardless of the wonderful invalidation implementation. Hence Flash Player 9’s DisplayList being invented.

    Blitting is kind of a low-level, boilerplate affair, and it’s currently not used a lot by the Flex framework. This is a shame. While the Charting components and Flex components both make extensive use of caching as bitmap and setting effective scrollrects , I think for some of the non-interactive parts of charting, they could scale effectively better. I have not, however, read reports of problems with the charting components not scaling. Props to the power of ActionScript 3!

    A significant amount of the framework is being drawn with vector graphics via the Drawing API, and all uses extensive use of theDisplayList.

    So, returning to my invalidation implementation, I chose to use the Flex framework invalidation methodology in my implementation of a Flash Lite 2 component framework. Granted, I didn’t have the added or render event’s, but enter frame is all you really need. Seemed logical enough; you want something to efficiently redraw on a device that REALLY needs to be efficient. As I later found, some on my own, some with Greg’s help, there are a few problems with this.

    1. Most dirty flags in the Flex framework start out with default values of false. This default value takes up RAM, RAM that I don’t have.
    2. I am making an assumption that a developer wants to have the component redrawn when they change a property. This is an incorrect assumption to make.

    Regarding #1, one solution is to simply not define default values for the dirty flags. The if ( flag == true ) still results in a correct evaluation if the default value is false, undefined, or null. That way, the flags would only last for 1 frame. Unfortunately, that is still a lot because Objects, what all data-types derive and thus extend in pre-AS3, take up a lot of overhead so even a Boolean has a valid cost to think about.

    Regarding #2, there are numerous cases where data isn’t ready for consumption by GUI controls, or some other process hasn’t completed yet. Some of that data or relevant process may be needed to do internal calculations for redrawing. I’m slowly to see ways for developers to implement their own call to invalidate. So, instead of doing this:

    attachMovie ( ComboBox.SYMBOL_NAME, “cb”, 0 );
    cb.prompt = “– select a value –“;
    cb.dataProvider = someArray;
    cb.setClickHandler ( this, onClick );

    You would instead do (per Greg):

    attachMovie ( ComboBox.SYMBOL_NAME, “cb”, 0 );
    cb.prompt = “– select a value –“;
    cb.dataProvider = someArray;
    cb.setClickHandler ( this, onClick );
    cb.invalidate();

    Notice the only difference is the addition of a invalidate method call. This triggers a redraw. The former, every single public property set, and some methods may trigger a redraw, usually via getter / setters (which have a lot of overhead…). Yes, it’s efficient in that it supports an infinite amount of property setting with only one redraw, but again, I’m assuming the developer WANTS to redraw. Maybe they have the data, want to set it, throw it away, but are awaiting more. Maybe they need the above, plus they are doing it to multiple controls over a sequence so they can effectively deliver a large amount of data through a small series of steps the device can handle. Later, they can then redraw when they deem it necessarey to do so.

    In discussing this stratgedy with Chris, he’d recount a lot of techniques Apple’s Cocoa uses as well as some of his own implementations. He found the most successful (and I’m paraphrasing badly here) is when parents are responsible for drawing their children. This allows you can redraw just one section of the GUI, or if you need to redraw everything, you can call invalidate on the main parent, and it’ll cascade down the tree of children, who in turn call invalidate on their children.

    What I find interesting is that this technique could not only work in Flash Lite 2 / 2.1 which is basically Flash Player 7, but also in blitting in Flash Player 8 as well as utilizing the DisplayObject API in Flash Player 9. In fact, it’d be really nice if Flex 3 gave us this option. I think the reason it’s not in Flex 2 is a lot of people need an accessible framework; meaning, low learning curve. Some people have never developed or programmed before, or not done that level of heavy GUI work, etc. Bottom line, I think the decision by the Flex team is “developers shouldn’t have to know how the Flash Player works to effectively write applications atop it”. I totally agree. I also believe, however, that there should be a way to optionally allow those of us who know what we’re doing to redraw when we see fit. It’d really help those larger applications, or when you are trying to squeeze all you can out of an implementation, say, Flash Lite 3 which could possibly use the new AVM on a device :: crosses fingers ::.

    While it’s more work for the developer, I understand why Greg suggested what he did now, and have more context as to the ramifications what power this really gives developers. I guess I just don’t really have in my head best practices on implementing this. The abstracted invalidation model that Flex has removes any care, and provides a nice convention for me to build atop of. Now, I suddenly have to care when I redraw things which could be different for each GUI control. Furthermore, the less utility I add to a framework by making it more efficient instead, the more the expectations of the Flash Lite community shifts to wanting more features out of controls. Not sure the best approaches to either. Fun, regardless!