Affects Version/s: Minecraft 1.14.1 Pre-Release 2
Fix Version/s: Minecraft 1.14.2 Pre-Release 1
Java 1.8.0_74 64bit
I ran 1.14.1-pre2 for an hour to test
MC-150218. I have a very simple flushing mob farm and wanted to check the rates. Good news is that rates are back to 1.13.2 levels however the frame rate has dropped to 1-2 fps and the game is unplayable. When first running the farm everything is just fine but after an hour (maybe earlier) the frames drop significantly.
Please see the screenshot where I've drilled down to see where the time is being spent and as you can see the mobs are taking up around 97%.
The world file is too large to upload here, so I've uploaded it to MediaFire: https://www.mediafire.com/file/s3hwbb1mgzk25g2/Mob_Farm_pre2.zip/file
The mob farm is at 1000, 70, 1000. Then just flip the lever to start it.
I've also attached my latest log file.
This same farm worked fine in 1.13.2, 1.14.0 and 1.14.1-pre1 (except for the drop in rates), this is a new issue in 1.14.1-pre2.
Personally I would see this as a major bug that needs fixing before release.
After some more testing I tried this in pre1 again. This version seems also affected but to a different degree. After an hour or so of running the fps fluctuates as low as 2fps but then recovers up to the high 40s. It does this repeatedly dropping very low then recovering somewhat. It doesn't get back up to the starting level of 60 (which I have set as the max fps). In pre2, the extremely low fps is seens after around 20-30 mins for me.
After speaking with Masa from SciCraft, he investigated and isolated the issue. Here is what he said, hopefully this will help with the fix:
Using Yarn names here: The issue is that when the client receives a chunk packet (>= 64 block changes within one chunk in one tick), inside ClientPlayNetworkHandler.onChunkData(ChunkDataS2CPacket packet), it gets the chunk from ClientChunkManager.loadChunkFromPacket(), but that method returns the existing chunk instead of a fresh chunk, unless the position doesn't match. And the onChunkData() method then calls this.world.addEntitiesToChunk(chunk), which basically adds all the entities from the World's list to the given Chunk. But because it usually re-uses the existing Chunk, the entities are already in that Chunk. So basically any time the client receives a chunk packet, it dupes the current entities within that chunk from the world's list.