Kevin Jenkins wrote: >While working on my game I (now) consistently use a programming design >that makes it easier to write and maintain code. > >I call it level triggered data synchronization. By level triggered I mean >as opposed to edge triggered - data changes during processing rather than >when the event to change the data occurs. > >The concept is quite simple. When you have a variable that you can set >based on the current program state you should recreate the value for that >data every cycle rather than setting that data on the conditions that >directly modify it. > >For example, lets say you have a program where the user clicks on one of 3 >filenames and a bitmap shows up to display the filename chosen. > >To program this using edge triggered data synchronization, you would put >code in the MousePress function. Depending on which filename was clicked, >you immediately load that file and unload the older image if necessary. > >To program this using level triggered data synchronization, you would put >code in the Render function. The render function would check the variable >containing the index of which filename was picked. It would then compare >this filename what Bitmap::Name() returns. If they are different, or if the >bitmap is NULL, then load the new image. > >The second way is slightly less efficient because you are doing a comparison >every frame. However, it is far more maintainable because if at a later >point you add another place to show another image it will show the correct >image for free. In the first case, you would either cut and paste the code >to load the image or at best call a function, assuming (in the unlikely >case) that you made this a function to begin with or put it in a function to >avoid code duplication. > >Another benefit of the second way is you sometimes avoid processing. For >example, lets say there were two places you could pick the same bitmap. If >you picked the new bitmap that had the exact same path/filename as the old >one, >it would avoid an unnecessary load. > >In trivial cases both ways works fine. But in large classes with many >variables this can cut down on a lot of code and maintenance. It also makes >the program more maintainable if someone else has to work on it because they >can change one section of the code and it just works - as opposed to working >in some cases and not others. Of course when it takes a lot of processing >to determine the state then stay with edge triggered. But in most cases >it's as simple as checking a few pointers. > >I'm sure a lot of people know this. The reason I point it out is because I >didn't strictly follow it before and now I do and have really seen the >benefit. >I think it's important enough to point out. > > > > Interesting. As you point in your example, I think this is especially useful in GUI programming. I will think about it and see if it can improve the code of my current game project. Thanks ! Julien