Canvas blowing up (was Re: JavaFX Media issues)

steve.x.northover at oracle.com steve.x.northover at oracle.com
Fri Aug 9 09:35:48 PDT 2013


We would still do the fill but we could throw away any buffered commands 
that happened before the fill.

Steve

On 09/08/2013 12:16 PM, Dr. Michael Paus wrote:
> What would be the performance penalty for using this quick-fix? The 
> clear/fill commands do not
> just clear the command buffer. They also fill the canvas area with a 
> certain color. So in normal
> operation the canvas is always filled twice for each frame, isn't it?
>
>
> Am 09.08.13 17:23, schrieb Richard Bair:
>>> I mean, it looks like it is working for a few seconds,
>>> but then as the memory fills with the Canvas backlog it can lead to 
>>> the GC
>>> using a lot more CPU, thus reducing the ability for Canvas to 
>>> process its
>>> command queue even further, well it just collapses in on itself  and 
>>> dies.
>> Forking the thread.
>>
>> The problem with Canvas is that if you have a canvas and you scribble 
>> on it, and then scribble on it some more, and then scribble on it 
>> some more, then in order for us to get the right result in the end, 
>> we need to replay all those scribbles in order. If pulses are not 
>> happening, we still need to remember these scribbles so we can draw 
>> the right result.
>>
>> BUT, if you issue a command to the canvas which will cause it to 
>> "clear" all its contents, then we could throw away any previously 
>> buffered data. Right now the only way to do that would be a fillRect 
>> with a solid fill where the fillRect encompasses the entire canvas 
>> area, or a clearRect where the clearRect encompasses the entire 
>> canvas area.
>>
>> This seems like a very simple fix. GraphicsContext.clearRect and 
>> GraphicsContext.fillRect should both (under the right conditions) 
>> throw away the previously buffered commands. Then all you have to do 
>> is be sure to make one of these calls (likely just a clearRect) 
>> before each frame, and we'll never buffer more than a single frame's 
>> worth of data. We could also add a "clear" method which is 
>> "clearRect(0, 0, w, h)" to make this more foolproof, and then 
>> document it as a best practice to clear the canvas before each 
>> rendering if you intend to redraw the entire thing on each frame.
>>
>> If you're making use of manually operated "dirty rects" so that you 
>> only clear the damaged area to repaint, then we couldn't employ this 
>> technique and we'd have to buffer 'till kingdom come. So we still 
>> need a mechanism exposed in the scene graph of "liveness" and 
>> associated events so that when the scene is no longer live (for 
>> example, when minimized) you could stop your animation timer, but for 
>> your specific media use case this isn't as important.
>>
>> Richard
>



More information about the openjfx-dev mailing list