[OpenJDK Rasterizer] RFR: Marlin renderer #2
Jim Graham
james.graham at oracle.com
Fri Jun 5 22:13:48 UTC 2015
Hi Laurent,
Here's a suggestion on how I would set up the array caching code, mainly
with regard to making it easier to make sure we are managing then
consistently, but also to allow for more flexible tuning later.
First, make all interactions go through the cache object itself - get,
grow, put. This gets rid of a number of static methods with a bunch of
similar names and groups the management methods in a class hierarchy.
Second, have each consumer of arrays use its own cache object. Some of
them may be the same object reference between different "users", and
some of them may be different objects but share their underlying arrays
with each other, but a given piece of code could be traced to always
get/grow/put its arrays into the same cache object. That way it's
easier to see that you aren't mixing/matching clean/dirty arrays.
DirtyFooCache
foo[] get(size)
foo[] grow(foo[], newsize) // or widen?
void put(foo[])
CleanFooCache
foo[] get(size)
foo[] grow(foo[], newsize, <used parts>)
void put(foo[], <used parts>)
Then code that manages an array named bar would be managed as:
(It may be the same instance as another FooCache
or it may share its arrays with another FooCache
but the "barCache" reference is only ever used for the bar array...)
[Clean|Dirty]FooCache barCache = make/get/share a Cache instance;
foo[] bar;
...
bar = barCache.get(initSize);
...
bar = barCache.grow/widen(bar, newSize[, usage if clean]);
...
barCache.put(bar[, usage if clean]);
bar = null;
It's easier to verify that bar is being managed consistently if it
always goes back to its own bar object. You can then decide if too
different uses of foo[] arrays should share the same arrays or not based
on profiling. You can also potentially have different growth algorithms
for 2 different arrays of the same type, but possibly even sharing the
same underlying arrays. Any degree of customization is possible
underneath the covers behind a FooCache basic interface.
I'd also either make the growth heuristics an argument to
creating/fetching a FooCache instance or make it subject to a helper
"CacheSizeManager" or "CacheSizeStrategy" object in such a way that
different uses of IntCache might be able to have different growth
strategies - and to possibly even manage different sizing strategies on
top of the same set of underlying arrays (i.e. one has buckets that grow
by <<2 and another by <<1 and for the even buckets, they share arrays,
for instance).
The main thing for the near term, is that it would be nice to have each
array use its own cache object so that we can easily verify that it is
being consistent with its handling of arrays...
...jim
More information about the graphics-rasterizer-dev
mailing list