Jump to content

[1.7.10] RegionFileCache createOrLoadRegionFile() behavior question...


Recommended Posts

This isn't a specific modding question, rather, I am trying to understand the foundation of what Minecraft is doing.


During my travels I came across RegionFileCache.  I see that createOrLoadRegionFile() will "purge" the internal cache once it hits a total of 256 entries.  This is kinda strange to me for several reasons:


* I would have expected some sort of LRU mechanism, not a dump of the entire cache.

* On a modded server with players travelling around and loading up regions in separate worlds I would imagine that this cache can reach full pretty quick.


Given these two it seems the cache would thrash which in turn could cause ripples in performance.  I was wondering from those in the know if my concerns are valid, and if not how should I be looking at this.





EDIT: For clarity, I am looking at the decompiled forgebin JAR file. :)

Link to comment
Share on other sites

OK - I been poking a stick at the underlying mechanics of RegionFile and RegionFileCache.  In my local sandbox I have a set of replacement classes which were a bear trying to get into the Minecraft runtime using class transformers. :\


Anyways, based on what I have seen I think that chunk write performance can be enhanced by changing the init parameters to the Deflator.  The measurements I took weren't 100% scientific (i.e. get the nano time between when the ChunkBuffer is given to the upper level write routine until after the write completes within ChunkBuffer), and the ChunkBuffer I used was a replacement I came up with in order to get some additional streamlining.


With the Vanilla Minecraft defaults for the Deflater (Deflater.DEFAULT_COMPRESSION, Deflater.DEFAULT_STRATEGY, buffer of 512 bytes) a write of a chunk stream to the region file took about 2.5 seconds, and wrote on average 2.3K of information.  Keep in mind that the amount of time taken is inclusive of the compression of chunk NBT as well as the write to disk.


With new parameters I have been working on (compression level of 3, Deflater.FILTERED, 4K buffer size) a write of a chunk stream to the region file took about 1.5 seconds and wrote on average 3K of information.


My observations:


  • My tweaked compression settings resulted in a 66% increase write performance.
  • My tweaked compression settings resulted in a 30% increase in data size.
  • Though the amount of information written is larger, the minimum allocation size within the region file is a single 4K sector.  If the region had a bunch of modded items in a chunk I would expect the chunk stream to be larger with the tweaked compression settings than what Vanilla would do.



  • I have not looked in detail at the upper level Minecraft routines to see what they are actually doing.  My tweaks and changes are based on my observations of behavior at the lower levels and how they manifest.  As such the upper level routines could be taking 5 minutes to do something which makes the gain of 66% at the low level where I am looking kinda pointless.
  • The development system I am using is high end Windows 10 i7 system.  Not sure how these changes will play on other OS platforms or other less capable systems.
  • The code I used has been heavily modified from the originals.  My intent is to streamline operations and reduce impacts of buffer allocation, information caching, etc.


If you want to take a look at the code I am working with you can find it here.  This code is highly experimental and should be more of a proof of concept than anything production ready.

Link to comment
Share on other sites

I'm doing it for several reasons:


  • Currently unemployed and going stir crazy. :)
  • I have played on servers that have had bouts of lag for inexplicable reasons, and I decided to take a look at how Minecraft works from the ground up to understand what may be happening.  As I dig up from the bottom I am making tweaks that I believe reduce contention with threading and memory management and improve on file access.


If I can come up with justifiable set of improvements I am looking at folding the logic into some of my mods.  The method I am using of replacing the Minecraft classes has me a bit nervous because I am intercepting the class load and replacing the entire class with my own implementation.  I have never done this before and I am just waiting to run afoul of the law of unintended consequences.


Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...

Important Information

By using this site, you agree to our Terms of Use.