New vram usage algorithms, [was Re: 8u40 (already reviewed) post-push notification: RT-36566 - make vram target limit more dynamic]
Jim Graham
james.graham at oracle.com
Fri Oct 10 09:58:58 UTC 2014
Some interesting changes for developers to note with this fix:
- Previously (pre-8.0) we added 2 parameters to control our vram usage:
-Dprism.maxvram=NNN[kmg]
-Dprism.targetvram=NNN[kmg]
- Our implementation was fairly ham-handed, if you ever needed more than
the target we would thrash about trying to keep freeing anything that
wasn't tied down to stay under it and we'd do this on every allocation.
There was no "growing the target" as the tide of vram usage raised and
if you ever reached a point where you were using more than the target
amount on each frame then you probably would see a hit in fps as we
struggled to stay below it (even if you didn't use more than "max").
- The default limits were modest because they provided the only
backpressure against just allocating new vram on every operation with no
attempts to free unused blocks. The defaults were max=256m,
target=192m. Most apps wouldn't even notice those limits, but
media-intensive apps might have run into the limit.
- Due to the ham-handed algorithm we had to choose the defaults low
enough to provide enough back-pressure that even simple apps didn't
become frame-buffer wasted memory hogs and yet high enough to enable
media-rich apps.
- You could watch our attempts to stay under the target with:
-Dprism.pooldebug=true (prints out info on cleanup attempts)
-Dprism.poolstats=true (prints out vram usage on every frame)
------------------
The new system is a bit more flexible. In particular:
- target will grow (up to max) as we use more vram and don't find
anything (un)useful to free
- defaults are now max=512m, target=64m
- You will now see messages about growing the vram target with
-Dprism.verbose=true
- the lower initial target keeps some back-pressure so that we don't
keep a lot of stale vram around so hopefully our vram usage for regular
apps will be lower now (most apps would "free-wheel" up to the default
target of 192m, but now will likely stay well and happily under 64m).
- the higher max setting means some more media-heavy apps are now
possible without having to tweak the settings. We no longer need a low
"max" setting to keep simple apps small.
- the floating target that rises as you use more vram for media and
complicated effects means "target" doesn't end up being "really a
maximum in practice because you won't like the results if you exceed it"
like it is now. The target "bumps" will happen easily with just enough
back-pressure to make sure we aren't raising it when there are unused
textures wasting space - similar to the Java heap growth.
- Hopefully this is all transparent, but if you see something odd let us
know...
...jim
On 10/10/14 2:36 AM, Jim Graham wrote:
> Kevin already reviewed this fix during a discussion on the Jira issue
> (see the comments), but I realized after I pushed that I never sent out
> a public request for reviews to the list...
>
> Jira: https://javafx-jira.kenai.com/browse/RT-36566
> webrev: http://cr.openjdk.java.net/~flar/RT-36566/webrev.02/
>
> There was one minor change after that webrev which was to make 2 new
> variables final as per the final +1 review comment...
>
> ...jim
More information about the openjfx-dev
mailing list