diff options
author | Sven Gothel <[email protected]> | 2012-01-13 16:13:40 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2012-01-13 16:13:40 +0100 |
commit | 48767a40c2461405dfce14e8d9eafbbab21d203e (patch) | |
tree | 3323739f3416eb5f8a00d6c10ac935ff6c6158b0 /src/newt/classes | |
parent | d23b08203e32f8f50991a48132eb3c2236b4efc0 (diff) |
NEWT/OSX Performance Fix: Cache CGDisplayScreenSize() result, since it's ridiculous slow
Each call to CGDisplayScreenSize() took around 6ms (5ms .. 20ms, avrg 6ms)
which added up to ~2s for ~400 Screen modes.
Diffstat (limited to 'src/newt/classes')
-rw-r--r-- | src/newt/classes/jogamp/newt/driver/macosx/MacScreen.java | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/newt/classes/jogamp/newt/driver/macosx/MacScreen.java b/src/newt/classes/jogamp/newt/driver/macosx/MacScreen.java index 3204982be..b9c725fd4 100644 --- a/src/newt/classes/jogamp/newt/driver/macosx/MacScreen.java +++ b/src/newt/classes/jogamp/newt/driver/macosx/MacScreen.java @@ -38,16 +38,24 @@ import java.util.List; import javax.media.nativewindow.DefaultGraphicsScreen; import javax.media.nativewindow.util.Dimension; +import javax.media.nativewindow.util.DimensionImmutable; import javax.media.nativewindow.util.Point; import jogamp.newt.ScreenImpl; +import com.jogamp.common.util.IntObjectHashMap; import com.jogamp.newt.ScreenMode; import com.jogamp.newt.util.ScreenModeUtil; public class MacScreen extends ScreenImpl { + + // caching native CGDisplayScreenSize() results, since it's ridiculous slow (~6 ms each call) + private static IntObjectHashMap/*<int, DimensionImmutable>*/ scrnIdx2Dimension; + static { MacDisplay.initSingleton(); + scrnIdx2Dimension = new IntObjectHashMap(); + scrnIdx2Dimension.setKeyNotFoundValue(null); } public MacScreen() { @@ -63,7 +71,18 @@ public class MacScreen extends ScreenImpl { private static native int getHeightImpl0(int scrn_idx); private int[] getScreenModeIdx(int idx) { - int[] modeProps = getScreenMode0(screen_idx, idx); + // caching native CGDisplayScreenSize() results, since it's ridiculous slow (~6 ms each call) + DimensionImmutable dim = (DimensionImmutable) scrnIdx2Dimension.get(screen_idx); + if(null == dim) { + int[] res = getScreenSizeMM0(screen_idx); + if(null == res || 0 == res.length) { + return null; + } + dim = new Dimension(res[0], res[1]); + scrnIdx2Dimension.put(screen_idx, dim); + } + + int[] modeProps = getScreenMode0(screen_idx, idx, dim.getWidth(), dim.getHeight()); if (null == modeProps || 0 == modeProps.length) { return null; } @@ -117,7 +136,8 @@ public class MacScreen extends ScreenImpl { virtualSize.setWidth(getWidthImpl0(screen_idx)); virtualSize.setHeight(getHeightImpl0(screen_idx)); } - - private native int[] getScreenMode0(int screen_index, int mode_index); + + private native int[] getScreenSizeMM0(int screen_idx); + private native int[] getScreenMode0(int screen_index, int mode_index, int widthMM, int heightMM); private native boolean setScreenMode0(int screen_index, int mode_idx); } |