Posted June 11, 20169 yr Hello, I'm rendering a layer onto the back of the player all works fine, but the closer they look at there or someone else's layer the FPS just drops. Looking at a friends about a block away i drop from 400fps to 28fps. The memory doesn't particularly rise though.
June 11, 20169 yr Without seeing your code, all we can do is guess at possible causes. Post your code. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
June 11, 20169 yr Author main.java package MinecraftCapesAndElytras; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import Render.PlayerInfo; @Mod(modid = "MCE") public class main { @EventHandler public void preInit(FMLPreInitializationEvent event) { } @EventHandler public void load(FMLInitializationEvent event) { MinecraftForge.EVENT_BUS.register(new PlayerInfo()); MinecraftForge.EVENT_BUS.register(new MainEventHandler()); } @EventHandler public void postInit(FMLPostInitializationEvent event) { } } eventhandler package MinecraftCapesAndElytras; import Render.LayerCape; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; public class MainEventHandler { @SubscribeEvent public void onRenderEntity(RenderPlayerEvent.Pre event) { if(event.getEntity() instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)event.getEntity(); event.getRenderer().addLayer(new LayerCape(event.getRenderer(), event.getEntity().getName())); } } } layercape (causes the issue) package Render; import org.apache.commons.io.FilenameUtils; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.client.renderer.entity.layers.LayerRenderer; import net.minecraft.entity.player.EnumPlayerModelParts; import net.minecraft.init.Items; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StringUtils; import net.minecraft.util.math.MathHelper; public class LayerCape implements LayerRenderer<AbstractClientPlayer> { private final RenderPlayer playerRenderer; private final String username; private ResourceLocation locationcape; public LayerCape(RenderPlayer playerRendererIn, String username) { this.playerRenderer = playerRendererIn; this.username = username; this.locationcape = new ResourceLocation("capes/" + username); } public void doRenderLayer(AbstractClientPlayer entitylivingbaseIn, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { if (entitylivingbaseIn.hasPlayerInfo() && !entitylivingbaseIn.isInvisible() && entitylivingbaseIn.isWearing(EnumPlayerModelParts.CAPE) && locationcape != null) { ItemStack itemstack = entitylivingbaseIn.getItemStackFromSlot(EntityEquipmentSlot.CHEST); if (itemstack == null || itemstack.getItem() != Items.ELYTRA) { GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); this.playerRenderer.bindTexture(locationcape); GlStateManager.pushMatrix(); GlStateManager.translate(0.0F, 0.0F, 0.125F); double d0 = entitylivingbaseIn.prevChasingPosX + (entitylivingbaseIn.chasingPosX - entitylivingbaseIn.prevChasingPosX) * (double)partialTicks - (entitylivingbaseIn.prevPosX + (entitylivingbaseIn.posX - entitylivingbaseIn.prevPosX) * (double)partialTicks); double d1 = entitylivingbaseIn.prevChasingPosY + (entitylivingbaseIn.chasingPosY - entitylivingbaseIn.prevChasingPosY) * (double)partialTicks - (entitylivingbaseIn.prevPosY + (entitylivingbaseIn.posY - entitylivingbaseIn.prevPosY) * (double)partialTicks); double d2 = entitylivingbaseIn.prevChasingPosZ + (entitylivingbaseIn.chasingPosZ - entitylivingbaseIn.prevChasingPosZ) * (double)partialTicks - (entitylivingbaseIn.prevPosZ + (entitylivingbaseIn.posZ - entitylivingbaseIn.prevPosZ) * (double)partialTicks); float f = entitylivingbaseIn.prevRenderYawOffset + (entitylivingbaseIn.renderYawOffset - entitylivingbaseIn.prevRenderYawOffset) * partialTicks; double d3 = (double)MathHelper.sin(f * 0.017453292F); double d4 = (double)(-MathHelper.cos(f * 0.017453292F)); float f1 = (float)d1 * 10.0F; f1 = MathHelper.clamp_float(f1, -6.0F, 32.0F); float f2 = (float)(d0 * d3 + d2 * d4) * 100.0F; float f3 = (float)(d0 * d4 - d2 * d3) * 100.0F; if (f2 < 0.0F) { f2 = 0.0F; } float f4 = entitylivingbaseIn.prevCameraYaw + (entitylivingbaseIn.cameraYaw - entitylivingbaseIn.prevCameraYaw) * partialTicks; f1 = f1 + MathHelper.sin((entitylivingbaseIn.prevDistanceWalkedModified + (entitylivingbaseIn.distanceWalkedModified - entitylivingbaseIn.prevDistanceWalkedModified) * partialTicks) * 6.0F) * 32.0F * f4; if (entitylivingbaseIn.isSneaking()) { f1 += 25.0F; } GlStateManager.rotate(6.0F + f2 / 2.0F + f1, 1.0F, 0.0F, 0.0F); GlStateManager.rotate(f3 / 2.0F, 0.0F, 0.0F, 1.0F); GlStateManager.rotate(-f3 / 2.0F, 0.0F, 1.0F, 0.0F); GlStateManager.rotate(180.0F, 0.0F, 1.0F, 0.0F); this.playerRenderer.getMainModel().renderCape(0.0625F); GlStateManager.popMatrix(); } } } public boolean shouldCombineTextures() { return false; } }
June 11, 20169 yr Author You are adding a new layer... every frame. Don't. I'm not sure how to "fix" this.
June 12, 20169 yr Author Ok, i've done this, seems to be working - thanks for your help! package MinecraftCapesAndElytras; import Render.LayerCape; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; public class MainEventHandler { private boolean done = false; @SubscribeEvent public void onRenderEntity(RenderPlayerEvent.Pre event) { if(event.getEntity() instanceof EntityPlayer && !done) { EntityPlayer player = (EntityPlayer)event.getEntity(); event.getRenderer().addLayer(new LayerCape(event.getRenderer(), event.getEntity().getName())); System.out.println("§e[MinecraftCapes]§r Added Cape Layer to Player"); done = true; } } }
June 12, 20169 yr There are two instances of RenderPlayer , one for the Steve model (thick arms) and one for the Alex model (thin arms). Your current code will only add the layer to the first one that renders. In postInit, you should iterate through RenderManager#getSkinMap and add the layer to every RenderPlayer instance in the map. Don't use RenderPlayerEvent here at all. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
June 12, 20169 yr Author AHAH! Done it - Thank you <3 for(RenderPlayer render : Minecraft.getMinecraft().getRenderManager().getSkinMap().values()) { render.addLayer(new LayerCape(render, new PlayerInfo())); render.addLayer(new Deadmau5(render)); }
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.