Slow map scrolling with v3.7

After upgrading to v3.7.0, I am finding that scrolling around large map sets in monster game modules has now become so slow as to render the modules unusable…even after more than tripling my max heap size under the Preferences tab to 15000 MB. For example, try opening the OCS Case Blue or DAKII modules in v3.7. Any suggestions appreciated, as I am now needing to re-upload v3.6.19 in order to handle these behemoths. Games with smaller map sets are a bit slower, but still perfectly functional.

Can you specify your architecture? For example, Windows 64-bit, MacOS Intel CPU, MacOS Apple Silicon, etc.

I have Windows 64-bit, running Windows 10 operating system.

Please show us an errorLog from a run where the problem occurs.

Here is an error log.

2023-09-11 21:32:05,696 [9676-main] INFO VASSAL.launch.StartUp - Starting
2023-09-11 21:32:05,727 [9676-main] INFO VASSAL.launch.StartUp - OS Windows 10 10.0 amd64
2023-09-11 21:32:05,727 [9676-main] INFO VASSAL.launch.StartUp - Java version 20.0.2
2023-09-11 21:32:05,727 [9676-main] INFO VASSAL.launch.StartUp - Java home C:\Program Files\VASSAL-3.7.0\jre
2023-09-11 21:32:05,727 [9676-main] INFO VASSAL.launch.StartUp - VASSAL version 3.7.0
2023-09-11 21:32:05,931 [9676-AWT-EventQueue-0] INFO VASSAL.launch.ModuleManager - Manager
2023-09-11 21:32:36,336 [9676-SwingWorker-pool-2-thread-1] INFO VASSAL.launch.AbstractLaunchAction - Loading module file E:\My Documents\Wargames\Vassal modules\OCS modules\CaseBlue_GBII_v6_18.vmod
2023-09-11 21:32:39,639 [9676-SwingWorker-pool-2-thread-1] INFO VASSAL.launch.TilingHandler - No images to tile.
2023-09-11 21:32:39,639 [9676-SwingWorker-pool-2-thread-1] INFO VASSAL.launch.AbstractLaunchAction - Loading module OCS - Case Blue & GB II
2023-09-11 21:32:39,655 [9676-SwingWorker-pool-2-thread-1] INFO VASSAL.tools.io.ProcessLauncher - launching C:\Program Files\VASSAL-3.7.0\jre\bin\java -Xms512M -Xmx512M -javaagent:lib\vassal-agent.jar --add-opens java.desktop/sun.awt.shell=ALL-UNNAMED -Duser.home=C:\Users\SSD_WD -Duser.dir=C:\Program Files\VASSAL-3.7.0 -cp lib\Vengine.jar VASSAL.launch.Player --load – E:\My Documents\Wargames\Vassal modules\OCS modules\CaseBlue_GBII_v6_18.vmod
2023-09-11 21:32:41,710 [10408-main] INFO VASSAL.launch.StartUp - Starting
2023-09-11 21:32:41,741 [10408-main] INFO VASSAL.launch.StartUp - OS Windows 10 10.0 amd64
2023-09-11 21:32:41,741 [10408-main] INFO VASSAL.launch.StartUp - Java version 20.0.2
2023-09-11 21:32:41,741 [10408-main] INFO VASSAL.launch.StartUp - Java home C:\Program Files\VASSAL-3.7.0\jre
2023-09-11 21:32:41,741 [10408-main] INFO VASSAL.launch.StartUp - VASSAL version 3.7.0
2023-09-11 21:32:41,741 [10408-main] INFO VASSAL.launch.Launcher - Player
2023-09-11 21:32:48,369 [10408-AWT-EventQueue-0] INFO VASSAL.build.GameModule - OCS - Case Blue & GB II version 6.18
2023-09-11 21:33:56,224 [10408-pool-1-thread-2] INFO VASSAL.tools.image.FallbackImageTypeConverter - Switching to FileImageTypeConverter…
2023-09-11 21:34:30,013 [10408-AWT-EventQueue-0] ERROR VASSAL.tools.ErrorDialog -
java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
at java.desktop/javax.swing.SwingWorker.get(SwingWorker.java:613)
at VASSAL.tools.opcache.OpCache$Request.done(OpCache.java:209)
at java.desktop/javax.swing.SwingWorker$5.run(SwingWorker.java:750)
at java.desktop/javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:848)
at java.desktop/sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:112)
at java.desktop/javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:858)
at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:311)
at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:243)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
at VASSAL.tools.opcache.OpCache.getFuture(OpCache.java:323)
at VASSAL.tools.opcache.OpCache.get(OpCache.java:261)
at VASSAL.tools.opcache.AbstractOpImpl.get(AbstractOpImpl.java:77)
at VASSAL.tools.imageop.AbstractOpImpl.getImage(AbstractOpImpl.java:101)
at VASSAL.tools.imageop.AbstractTiledOpImpl.getTile(AbstractTiledOpImpl.java:137)
at VASSAL.tools.imageop.AbstractOpImpl.getTile(AbstractOpImpl.java:176)
at VASSAL.build.module.map.boardPicker.board.GridOp.draw(GridOp.java:104)
at VASSAL.build.module.map.boardPicker.board.GridOp$TileOp.eval(GridOp.java:187)
at VASSAL.build.module.map.boardPicker.board.GridOp$TileOp.eval(GridOp.java:138)
at VASSAL.tools.opcache.OpCache$Request.doInBackground(OpCache.java:203)
at java.desktop/javax.swing.SwingWorker$1.call(SwingWorker.java:304)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.desktop/javax.swing.SwingWorker.run(SwingWorker.java:343)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1623)
Caused by: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
at VASSAL.tools.opcache.OpCache.getFuture(OpCache.java:323)
at VASSAL.tools.opcache.OpCache.get(OpCache.java:261)
at VASSAL.tools.opcache.AbstractOpImpl.get(AbstractOpImpl.java:77)
at VASSAL.tools.imageop.AbstractOpImpl.getImage(AbstractOpImpl.java:101)
at VASSAL.tools.imageop.FixedScaleOpBitmapImpl$TileOp.eval(FixedScaleOpBitmapImpl.java:168)
at VASSAL.tools.imageop.FixedScaleOpBitmapImpl$TileOp.eval(FixedScaleOpBitmapImpl.java:117)
at VASSAL.tools.opcache.OpCache.getFuture(OpCache.java:318)
… 15 common frames omitted
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.desktop/java.awt.image.DataBufferByte.(DataBufferByte.java:93)
at java.desktop/java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:436)
at java.desktop/java.awt.image.Raster.createWritableRaster(Raster.java:1122)
at java.desktop/javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1066)
at java.desktop/javax.imageio.ImageReader.getDestination(ImageReader.java:2877)
at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1200)
at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1162)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1466)
at VASSAL.tools.image.ImageIOImageLoader$1.run(ImageIOImageLoader.java:476)
at VASSAL.tools.image.ImageIOImageLoader$1.run(ImageIOImageLoader.java:463)
at VASSAL.tools.image.ImageIOImageLoader.wrapImageIO(ImageIOImageLoader.java:430)
at VASSAL.tools.image.ImageIOImageLoader.load(ImageIOImageLoader.java:375)
at VASSAL.tools.image.ImageUtils.getImage(ImageUtils.java:259)
at VASSAL.tools.imageop.SourceOpBitmapImpl.eval(SourceOpBitmapImpl.java:114)
at VASSAL.tools.imageop.SourceOpBitmapImpl.eval(SourceOpBitmapImpl.java:44)
at VASSAL.tools.opcache.OpCache.getFuture(OpCache.java:318)
at VASSAL.tools.opcache.OpCache.get(OpCache.java:261)
at VASSAL.tools.opcache.AbstractOpImpl.get(AbstractOpImpl.java:77)
at VASSAL.tools.imageop.AbstractOpImpl.getImage(AbstractOpImpl.java:101)
at VASSAL.tools.imageop.FixedScaleOpBitmapImpl$TileOp.eval(FixedScaleOpBitmapImpl.java:168)
at VASSAL.tools.imageop.FixedScaleOpBitmapImpl$TileOp.eval(FixedScaleOpBitmapImpl.java:117)
at VASSAL.tools.opcache.OpCache.getFuture(OpCache.java:318)
at VASSAL.tools.opcache.OpCache.get(OpCache.java:261)
at VASSAL.tools.opcache.AbstractOpImpl.get(AbstractOpImpl.java:77)
at VASSAL.tools.imageop.AbstractOpImpl.getImage(AbstractOpImpl.java:101)
at VASSAL.tools.imageop.AbstractTiledOpImpl.getTile(AbstractTiledOpImpl.java:137)
at VASSAL.tools.imageop.AbstractOpImpl.getTile(AbstractOpImpl.java:176)
at VASSAL.build.module.map.boardPicker.board.GridOp.draw(GridOp.java:104)
at VASSAL.build.module.map.boardPicker.board.GridOp$TileOp.eval(GridOp.java:187)
at VASSAL.build.module.map.boardPicker.board.GridOp$TileOp.eval(GridOp.java:138)
at VASSAL.tools.opcache.OpCache$Request.doInBackground(OpCache.java:203)
at java.desktop/javax.swing.SwingWorker$1.call(SwingWorker.java:304)
2023-09-11 21:34:30,028 [10408-AWT-EventQueue-0] ERROR VASSAL.tools.ErrorDialog -
java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
at java.desktop/javax.swing.SwingWorker.get(SwingWorker.java:613)
at VASSAL.tools.opcache.OpCache$Request.done(OpCache.java:209)
at java.desktop/javax.swing.SwingWorker$5.run(SwingWorker.java:750)
at java.desktop/javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:848)
at java.desktop/sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:112)
at java.desktop/javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:858)
at java.desktop/javax.swing.Timer.fireActionPerformed(Timer.java:311)
at java.desktop/javax.swing.Timer$DoPostEvent.run(Timer.java:243)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
at VASSAL.tools.opcache.OpCache.getFuture(OpCache.java:323)
at VASSAL.tools.opcache.OpCache.get(OpCache.java:261)
at VASSAL.tools.opcache.AbstractOpImpl.get(AbstractOpImpl.java:77)
at VASSAL.tools.imageop.AbstractOpImpl.getImage(AbstractOpImpl.java:101)
at VASSAL.tools.imageop.AbstractTiledOpImpl.getTile(AbstractTiledOpImpl.java:137)
at VASSAL.tools.imageop.AbstractOpImpl.getTile(AbstractOpImpl.java:176)
at VASSAL.build.module.map.boardPicker.board.GridOp.draw(GridOp.java:104)
at VASSAL.build.module.map.boardPicker.board.GridOp$TileOp.eval(GridOp.java:187)
at VASSAL.build.module.map.boardPicker.board.GridOp$TileOp.eval(GridOp.java:138)
at VASSAL.tools.opcache.OpCache$Request.doInBackground(OpCache.java:203)
at java.desktop/javax.swing.SwingWorker$1.call(SwingWorker.java:304)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.desktop/javax.swing.SwingWorker.run(SwingWorker.java:343)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1623)
Caused by: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
at VASSAL.tools.opcache.OpCache.getFuture(OpCache.java:323)
at VASSAL.tools.opcache.OpCache.get(OpCache.java:261)
at VASSAL.tools.opcache.AbstractOpImpl.get(AbstractOpImpl.java:77)
at VASSAL.tools.imageop.AbstractOpImpl.getImage(AbstractOpImpl.java:101)
at VASSAL.tools.imageop.FixedScaleOpBitmapImpl$TileOp.eval(FixedScaleOpBitmapImpl.java:168)
at VASSAL.tools.imageop.FixedScaleOpBitmapImpl$TileOp.eval(FixedScaleOpBitmapImpl.java:117)
at VASSAL.tools.opcache.OpCache.getFuture(OpCache.java:318)
… 15 common frames omitted
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.desktop/java.awt.image.DataBufferByte.(DataBufferByte.java:93)
at java.desktop/java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:436)
at java.desktop/java.awt.image.Raster.createWritableRaster(Raster.java:1122)
at java.desktop/javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1066)
at java.desktop/javax.imageio.ImageReader.getDestination(ImageReader.java:2877)
at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1200)
at java.desktop/com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1162)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1466)
at VASSAL.tools.image.ImageIOImageLoader$1.run(ImageIOImageLoader.java:476)
at VASSAL.tools.image.ImageIOImageLoader$1.run(ImageIOImageLoader.java:463)
at VASSAL.tools.image.ImageIOImageLoader.wrapImageIO(ImageIOImageLoader.java:430)
at VASSAL.tools.image.ImageIOImageLoader.load(ImageIOImageLoader.java:375)
at VASSAL.tools.image.ImageUtils.getImage(ImageUtils.java:259)
at VASSAL.tools.imageop.SourceOpBitmapImpl.eval(SourceOpBitmapImpl.java:114)
at VASSAL.tools.imageop.SourceOpBitmapImpl.eval(SourceOpBitmapImpl.java:44)
at VASSAL.tools.opcache.OpCache.getFuture(OpCache.java:318)
at VASSAL.tools.opcache.OpCache.get(OpCache.java:261)
at VASSAL.tools.opcache.AbstractOpImpl.get(AbstractOpImpl.java:77)
at VASSAL.tools.imageop.AbstractOpImpl.getImage(AbstractOpImpl.java:101)
at VASSAL.tools.imageop.FixedScaleOpBitmapImpl$TileOp.eval(FixedScaleOpBitmapImpl.java:168)
at VASSAL.tools.imageop.FixedScaleOpBitmapImpl$TileOp.eval(FixedScaleOpBitmapImpl.java:117)
at VASSAL.tools.opcache.OpCache.getFuture(OpCache.java:318)
at VASSAL.tools.opcache.OpCache.get(OpCache.java:261)
at VASSAL.tools.opcache.AbstractOpImpl.get(AbstractOpImpl.java:77)
at VASSAL.tools.imageop.AbstractOpImpl.getImage(AbstractOpImpl.java:101)
at VASSAL.tools.imageop.AbstractTiledOpImpl.getTile(AbstractTiledOpImpl.java:137)
at VASSAL.tools.imageop.AbstractOpImpl.getTile(AbstractOpImpl.java:176)
at VASSAL.build.module.map.boardPicker.board.GridOp.draw(GridOp.java:104)
at VASSAL.build.module.map.boardPicker.board.GridOp$TileOp.eval(GridOp.java:187)
at VASSAL.build.module.map.boardPicker.board.GridOp$TileOp.eval(GridOp.java:138)
at VASSAL.tools.opcache.OpCache$Request.doInBackground(OpCache.java:203)
at java.desktop/javax.swing.SwingWorker$1.call(SwingWorker.java:304)
2023-09-11 21:34:47,062 [10408-AWT-EventQueue-0] INFO VASSAL.build.GameModule - Exiting

That error indicates you ran out of heap space. Are you sure you altered the correct heap settings? The setting in the Module Manager only affects the amount of heap that the image tiler has available…you need to go to the Preferences in the module itself (after loading the module) to change how much heap each individual module has. (You also need to completely close and reload the module after changing that setting.)

1 Like

Did not know about that…that seems to have fixed the issue on my end. Thanks!

I also saw that I had to increase heap value for modules with a bigger map with 3.7. With the same heap values that used to work with 3.6.19, I had this kind of behavior with big maps → https://forum.vassalengine.org/t/possible-bug-3-7-maps-keep-going-through-refresh/77840

1 Like

We have tracked down the change that is causing this and will have a fix for 3.7.1.

5 Likes

Please try the VASSAL-3.7.1-SNAPSHOT-9586060-cobble_fixed_size build from our builds archive and let me know whether this fixes the problems you’re seeing.

Yes it certainly seems to have done the trick. Thanks!
Opened the OCS DAK module at base 512 MB heap size without problems.
Opened the OCS Case Blue/GB2 module, decreasing the max heap from 4096 MB down to 1024 MB, also without problems.