Skip to content

Optimización de caída de contenedores ​

El problema del lag ​

En Minecraft vanilla, romper un contenedor (cofre, barril, caja de shulker) divide la pila de cada ranura en pequeños grupos de 10 a 30 objetos. Si un cofre contiene miles o millones de objetos, romperlo intenta generar cientos de miles de entidades de objetos en un solo tick, lo que congela el servidor o bloquea el juego.


🧮 Fórmula de generación de entidades y división matemática ​

InventoryDropHelper.dropItemStack intercepta Containers.dropItemStack mediante ContainersMixin:

java
public class InventoryDropHelper {
    public static void dropItemStack(Level level, double x, double y, double z, ItemStack itemStack) {
        ...
        int maxEntities = DynamicGameRuleManager.getInt(level, StackSizeAdjusterFabric.MAX_DROP_ENTITIES);
        
        while (!itemStack.isEmpty()) {
            int currentCount = itemStack.getCount();
            int splitSize = random.nextInt(21) + 10;
            
            // Límite de seguridad: topar la generación de entidades por ranura
            if (currentCount > splitSize * maxEntities) {
                splitSize = (currentCount + maxEntities - 1) / maxEntities;
            }
            
            ItemEntity entity = new ItemEntity(level, xo, yo, zo, itemStack.split(splitSize));
            ...
            level.addFreshEntity(entity);
        }
    }
}

Formulación matemática ​

Dado un recuento total $N$ y un max_drop_entities $M$:

  1. Tamaño aleatorio de división base $S \in [10, 30]$.
  2. Verificación de umbral dinámico: $$\text{Si } N > S \times M \implies S_{\text{effective} = \left\lceil \frac{N}{M} \right\rceil$$
  3. El recuento total de ItemEntity generadas para esa ranura está estrictamente limitado por: $$E_{\text{spawned} \le M$$

📊 Comparativa de rendimiento de caídas ​

Ajuste max_drop_entitiesEntidades para 100,000 objetosImpacto en tick de servidorDispersión visual
Vanilla (Sin tope)$\sim 5,000$ entidadesLag severo / BloqueoExtrema dispersión caótica
8 (Predeterminado recomendado)$\le 8$ entidades$< 1\text{ms}$ tiempo de tickExcelente dispersión visual
1 (Rendimiento máximo)Exactamente $1$ entidadInstantáneo ($0\text{ms}$)Una sola pila condensada

Official documentation & web portal for Dasik Igaijinn mods.