Hello everybody,
I’m a beginner with JME and I have a problem. I have only few objects in my game and I’m running at 8fps! So I was wondering what makes the performance drop like this…
Here is my little code:
[java]package mygame;
import com.jme3.animation.AnimChannel;
import com.jme3.animation.AnimControl;
import com.jme3.animation.AnimEventListener;
import com.jme3.animation.LoopMode;
import com.jme3.app.SimpleApplication;
import com.jme3.bullet.BulletAppState;
import com.jme3.bullet.collision.shapes.CapsuleCollisionShape;
import com.jme3.bullet.control.CharacterControl;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.effect.ParticleEmitter;
import com.jme3.effect.ParticleMesh;
import com.jme3.input.ChaseCamera;
import com.jme3.input.KeyInput;
import com.jme3.input.MouseInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.AnalogListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.input.controls.MouseAxisTrigger;
import com.jme3.input.controls.MouseButtonTrigger;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Plane;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.queue.RenderQueue.ShadowMode;
import com.jme3.scene.CameraNode;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.control.CameraControl.ControlDirection;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Quad;
import com.jme3.shadow.PssmShadowRenderer;
import com.jme3.util.SkyFactory;
import com.jme3.water.SimpleWaterProcessor;
/**
*
*/
public class Main extends SimpleApplication implements AnalogListener, ActionListener , AnimEventListener
{
private PssmShadowRenderer pssmRenderer;
private Node sceneNode;
private Node map;
private Node player;
private Node playerCamNode;
private ChaseCamera chaseCam;
boolean rotate = false;
Vector3f direction = new Vector3f();
private BulletAppState bulletAppState;
private CharacterControl character;
private CharacterControl elephantCharacter;
private Spatial elephant;
private AnimChannel animationChannel;
private AnimChannel attackChannel;
private AnimControl animationControl;
private boolean left = false, right = false, up = false, down = false;
private Vector3f walkDirection = new Vector3f(0,0,0); // stop
private float airTime = 0;
public static void main(String[] args)
{
Main app = new Main();
app.start();
}
@Override
public void simpleInitApp()
{
initScene();
registerInput();
initChaseCam();
for (String anim : animationControl.getAnimationNames()) { System.out.println(anim); }
}
@Override
public void simpleUpdate(float tpf)
{
walk(tpf);
elephantCharacter.setWalkDirection(walkDirection);
}
@Override
public void simpleRender(RenderManager rm)
{
//TODO: add render code
}
public void initScene()
{
bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState);
bulletAppState.getPhysicsSpace().enableDebug(assetManager);
sceneNode = new Node("sceneNode");
rootNode.attachChild(sceneNode);
sceneNode.attachChild(SkyFactory.createSky(assetManager, "Textures/Sky/Bright/BrightSky.dds", false));
pssmRenderer = new PssmShadowRenderer(assetManager, 1024, 3);
pssmRenderer.setDirection(new Vector3f(-0.5f,-0.5f,-0.5f).normalizeLocal()); // light direction
viewPort.addProcessor(pssmRenderer);
map =(Node) assetManager.loadModel("Scenes/Map.j3o");
map.addControl(new RigidBodyControl(0));
sceneNode.attachChild(map);
bulletAppState.getPhysicsSpace().addAll(map);
map.setShadowMode(ShadowMode.Receive);
CapsuleCollisionShape capsule2 = new CapsuleCollisionShape(10f,8f,2);
elephantCharacter = new CharacterControl(capsule2, 3f);
elephantCharacter.setGravity(60);
elephant = assetManager.loadModel("Models/Elephant/Elephant.mesh.xml");
elephant.scale(0.2f);
elephant.setLocalTranslation(30f,5f,10);
elephant.setShadowMode(ShadowMode.CastAndReceive);
elephant.addControl(elephantCharacter);
bulletAppState.getPhysicsSpace().add(elephantCharacter);
sceneNode.attachChild(elephant);
CapsuleCollisionShape capsule = new CapsuleCollisionShape(3f, 4f);
character = new CharacterControl(capsule, 3f);
character.setJumpSpeed(30f);
character.setGravity(60);
player = (Node) assetManager.loadModel("Models/Sinbad/Sinbad.mesh.xml");
player.setShadowMode(ShadowMode.CastAndReceive);
player.addControl(character);
bulletAppState.getPhysicsSpace().add(character);
player.setLocalTranslation(0f,5f,0);
player.rotate(0f, 3f, 0f);
playerCamNode = new Node("playerCamNode");
playerCamNode.attachChild(player);
rootNode.attachChild(playerCamNode);
SimpleWaterProcessor waterProcessor = new SimpleWaterProcessor(assetManager);
waterProcessor.setReflectionScene(sceneNode);
Vector3f waterLocation=new Vector3f(0,-8,0);
waterProcessor.setPlane(new Plane(Vector3f.UNIT_Y, waterLocation.dot(Vector3f.UNIT_Y)));
viewPort.addProcessor(waterProcessor);
waterProcessor.setWaterDepth(40); // transparency of water
waterProcessor.setDistortionScale(0.05f); // strength of waves
waterProcessor.setWaveSpeed(0.05f);
Quad quad = new Quad(60,60);
quad.scaleTextureCoordinates(new Vector2f(6f,6f));
Geometry water= new Geometry("water", quad);
water.setLocalRotation(new Quaternion().fromAngleAxis(-FastMath.HALF_PI, Vector3f.UNIT_X));
water.setLocalTranslation(-100, -15, 1);
water.setShadowMode(ShadowMode.Receive);
water.setMaterial(waterProcessor.getMaterial());
rootNode.attachChild(water);
DirectionalLight dayLight = new DirectionalLight();
dayLight.setColor(ColorRGBA.White);
dayLight.setDirection(new Vector3f(-0.5f,-0.5f,-0.5f));
rootNode.addLight(dayLight);
animationControl = player.getControl(AnimControl.class);
animationControl.addListener(this);
animationChannel = animationControl.createChannel();
attackChannel = animationControl.createChannel();
}
public void initChaseCam()
{
flyCam.setEnabled(false);
chaseCam = new ChaseCamera(cam, player, inputManager);
chaseCam.setDefaultDistance(80);
chaseCam.setMinDistance(40);
chaseCam.setMaxDistance(100);
chaseCam.setToggleRotationTrigger(new MouseButtonTrigger(MouseInput.BUTTON_MIDDLE));
chaseCam.setSmoothMotion(true);
}
public void registerInput()
{
inputManager.addMapping("CharLeft", new KeyTrigger(KeyInput.KEY_A));
inputManager.addMapping("CharRight", new KeyTrigger(KeyInput.KEY_D));
inputManager.addMapping("CharForward", new KeyTrigger(KeyInput.KEY_W));
inputManager.addMapping("CharBackward", new KeyTrigger(KeyInput.KEY_S));
inputManager.addMapping("CharJump", new KeyTrigger(KeyInput.KEY_RETURN));
inputManager.addMapping("CharAttack", new KeyTrigger(KeyInput.KEY_SPACE));
inputManager.addListener(this, "CharLeft", "CharRight");
inputManager.addListener(this, "CharForward", "CharBackward");
inputManager.addListener(this, "CharJump", "CharAttack");
}
public void onAnalog(String name, float value, float tpf)
{
}
public void onAction(String name, boolean value, float tpf)
{
if (name.equals("CharJump"))
{
character.jump();
}
else if (name.equals("CharLeft"))
{
if (value) left = true;
else left = false;
}
else if (name.equals("CharRight"))
{
if (value) right = true;
else right = false;
}
else if (name.equals("CharForward"))
{
if (value) up = true;
else up = false;
}
else if (name.equals("CharBackward"))
{
if (value) down = true;
else down = false;
}
if (name.equals("CharAttack"))
attack();
}
private void walk(float timePerFrame)
{
Vector3f camDir = cam.getDirection().clone().multLocal(0.25f);
Vector3f camLeft = cam.getLeft().clone().multLocal(0.25f);
camDir.y = 0;
camLeft.y = 0;
walkDirection.set(0, 0, 0);
if (left) walkDirection.addLocal(camLeft);
if (right) walkDirection.addLocal(camLeft.negate());
if (up) walkDirection.addLocal(camDir);
if (down) walkDirection.addLocal(camDir.negate());
if (!character.onGround())
{
airTime = airTime + timePerFrame;
}
else
{
airTime = 0;
}
if (walkDirection.length() == 0)
{
if (!"IdleBase".equals(animationChannel.getAnimationName()))
{
animationChannel.setAnim("IdleBase", 1f);
}
}
else
{
character.setViewDirection(walkDirection);
if (airTime > .3f)
{
if (!"IdleBase".equals(animationChannel.getAnimationName()))
{
animationChannel.setAnim("IdleBase");
}
}
else if (!"RunBase".equals(animationChannel.getAnimationName()))
{
animationChannel.setAnim("RunBase");
}
}
character.setWalkDirection(walkDirection);
}
private void attack()
{
attackChannel.setAnim("SliceVertical", 0.1f);
attackChannel.setLoopMode(LoopMode.DontLoop);
}
public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName)
{
if (channel == attackChannel) channel.setAnim("IdleBase");
}
public void onAnimChange(AnimControl control, AnimChannel channel, String animName)
{
}
}
[/java]
If you need any other information tell me!