Skip to content

feat: Implement diffing algorithm for MapTemplates#17

Open
Restioson wants to merge 1 commit into
NucleoidMC:1.20.6from
Restioson:feat/diff
Open

feat: Implement diffing algorithm for MapTemplates#17
Restioson wants to merge 1 commit into
NucleoidMC:1.20.6from
Restioson:feat/diff

Conversation

@Restioson

@Restioson Restioson commented Jun 14, 2024

Copy link
Copy Markdown

This PR implements a very coarse diffing algorithm for map templates. It is intended to be used with NucleoidMC/plasmid#293 as such:

The functionality offered is therefore pretty much the bare minimum to support that use case.

        if (newTemplate.diff(oldTemplate).needsRegeneration()) {
            gameSpace.getWorlds().regenerate(world, new TemplateChunkGenerator(server, newTemplate), newTemplate.getBounds().union(oldTemplate.getBounds()));
        }

The diffing algorithm uses the BLAKE3 hash function internally to compare MapChunks.

It takes around 100ms to hash a map that takes 400ms to load (based on siege:jungle). Therefore, the first hot reload of the map would take 100ms (hash old map) + 400ms (load new map) + 100ms (hash new map) + (negligible comparison) = 600ms. On second reload, the old map doesn't need to be hashed, so it would be 500ms.

@Restioson

Restioson commented Jun 14, 2024

Copy link
Copy Markdown
Author

This could probably be optimised somewhat by keeping the hash on the entire template rather than each MapChunk, but this would somewhat weaken encapsulation. I don't really have the bandwidth to change it and it's a minor optimisation for a use-case that isn't very performance-critical (reloading).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant