/** * Copyright (c) Lambda Innovation, 2013-2015 * 本作品版权由Lambda Innovation所有。 * http://www.li-dev.cn/ * * This project is open-source, and it is distributed under * the terms of GNU General Public License. You can modify * and distribute freely as long as you follow the license. * 本项目是一个开源项目,且遵循GNU通用公共授权协议。 * 在遵照该协议的情况下,您可以自由传播和修改。 * http://www.gnu.org/licenses/gpl.html */ package cn.liutils.render.particle; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.minecraft.world.World; import cn.annoreg.core.Registrant; import cn.annoreg.mc.RegEventHandler; import cn.annoreg.mc.RegEventHandler.Bus; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent; import cpw.mods.fml.common.gameevent.TickEvent.Phase; /** * @author WeAthFolD */ @Registrant public abstract class ParticleFactoryBase { static final int MAX_POOL_SIZE = 1000; static List<Particle> alive = new ArrayList(), dead = new ArrayList(); public abstract Particle next(World world); protected final Particle queryParticle() { Particle ret; if(!dead.isEmpty()) { Iterator<Particle> iter = dead.iterator(); ret = iter.next(); iter.remove(); } else { ret = new Particle(); } if(alive.size() < MAX_POOL_SIZE) { alive.add(ret); } ret.isDead = false; ret.ticksExisted = 0; ret.resetEntityX(); ret.reset(); return ret; } @RegEventHandler(Bus.FML) public static class EventHandlers { static final int UPDATE_RATE = 40; int ticker; @SubscribeEvent public void onClientTick(ClientTickEvent event) { if(event.phase == Phase.END && ++ticker == UPDATE_RATE) { ticker = 0; Iterator<Particle> iter = alive.iterator(); while(iter.hasNext()) { Particle p = iter.next(); if(p.isDead) { iter.remove(); if(dead.size() < MAX_POOL_SIZE) { dead.add(p); } } } //System.out.println("GC: " + alive.size() + " / " + dead.size()); } } } }