Crossposted to the OL dev list. No luck over there.
 

 
I've been developing an application to do animation of Untiled layers,
but I'm running across a bit of a design issue.

Snippet #1 - The blinking animation 
===================================

// on timestamp change event

var curLayer = objRef.oLlayers[layerName]                               
curLayer.mergeNewParams({"TIME":timestamp.firstChild.nodeValue});

The above calls mergeNewParams, which of course, destroys/erases the
image div, and then draws the new image with the new timestamp.
The problem is, when trying to animate, you get a pattern of:
Draw Frame 1 -> Erase Frame 1 -> Draw Frame 2.

The 'erase' step in between causes for some pretty awful flicker. So I
tried Snippet #2.

Snippet #2 - The memory leak
============================

var curLayer = objRef.oLlayers[layerName]                               
curLayer.tile = null;
curLayer.mergeNewParams({"TIME":timestamp.firstChild.nodeValue});

By setting the tile to null, it actually doesn't do destroy the image
div, it merely replaces the contents. 
This yields:
Draw Frame 1 -> Draw Frame 2 -> Draw Frame X

This is, of course, the desired behavior, but it causes two problems:
A) Frame 1's DIV never gets destroyed/erased, causing a memory leak
B) When using transparent images, all are drawn on top of one another.

So, on to Snippet #3 
==============================

/* This is Draw 1, Draw 2, Remove 1 
curLayer.tile = null;
curLayer.mergeNewParams({"TIME":timestamp.firstChild.nodeValue});
var oldImageId = curLayer.tile.imgDiv.id;
                                
var commandString = 'removeNode(\"' + oldImageId + '\")';

setTimeout(commandString, 1000);

function removeNode(oldImageId) {
        var olddiv = document.getElementById(oldImageId);
                
        var d = olddiv.parentNode;
        var e = d.parentNode;
        d.removeChild(olddiv);
        e.removeChild(d);                       
}


So, here, 
Draws Frame 1, Draws Frame 2, and then removeNode waits a second and
destroys Frame 1. 

This solves Snippet 2, Issue A, but looks hideous for Issue B.
Basically, you can actually see Frame 1 being drawn on top of, and then
removed, which makes for an admittedly awful user experience, even with
only 5 ms of time-delay.

And, then, Snippet #4 - URL substitution
=====================

var oldImageUrl = curLayer.tile.imgDiv.src;
var newImageUrl = oldImageUrl;          
newImageUrl = newImageUrl.replace(/TIME\=.*?\&/,'TIME=' +
timestamp.firstChild.nodeValue + '&');
curLayer.tile.imgDiv.src = newImageUrl;

Okay, so what we're doing here is direct regexp replacement of the URL.
This works, but with some issues.
A) It's somewhat slower than using mergeNewParams (cannot figure out
why)
B) I really don't like doing direct URL pattern substitution like this
(it strikes me as error-prone)
C) Is there a more 'OpenLayers-ish' way to do this?

So, can anyone suggest something that might be better than Snippet #4?

Thanks, 
Matthew D. Diez


IEM CONFIDENTIAL INFORMATION PLEASE READ OUR NOTICE:
http://www.iem.com/e_mail_confidentiality_notice.html

Effective July 15, 2007 IEM Headquarters will have a new physical and mailing 
address:
8550 United Plaza Blvd, Suite 501
Baton Rouge, LA 70809
If you should have any questions, please feel free to contact us at 225.952.8191

_______________________________________________
Dev mailing list
[EMAIL PROTECTED]
http://openlayers.org/mailman/listinfo/dev

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
mapbuilder-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mapbuilder-devel

Reply via email to