2016-08-17 14 views
-2

У меня проблема с моей игрой, и я не могу найти проблему, мой FPS падает от 300 до 1, каждую секунду, как 5 до 10 FPS ниже, пока она не будет воспроизведена. Сначала он вызывает ошибку при запуске wave.myFirstGame.Handler.removeObject (Handler.java:31), но сбой. но когда я удаляю код, который дает мне эту ошибку, игра работает, но FPS падает и все еще не воспроизводится.Java-игра, FPS падает с 300 до 1

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Rectangle; 

public class BasicEnemy extends GameObject { 

private Handler handler; 


public BasicEnemy(int x, int y, ID id, Handler handler) { 
    super(x, y, id); 

    this.handler = handler; 

    velX = 5; 
    velY = 5; 

} 

public Rectangle getBounds() { //for collision 

    return new Rectangle(x, y, 16, 16); 
} 

public void tick() { 
    x += velX; 
    y += velY; 
    if (y <= 0 || y >= Game.HEIGHT - 32) 
     velY *= -1; // limits of the screen for the enemy 

    if (x <= 0 || x >= Game.WIDTH - 16) 
     velX *= -1; 

    handler.addObject(new Trail(x, y,ID.Trail, Color.red, 16, 16, 0.02f, handler)); 
} 

public void render(Graphics g) { 
    g.setColor(Color.red); 
    g.fillRect(x, y, 16, 16); 
} 

это класс Handler, где я получаю сообщение об ошибке, в последней строке пакет wave.myFirstGame;

import java.awt.Graphics; 
import java.util.LinkedList; 

public class Handler { 

    LinkedList<GameObject> object = new LinkedList<GameObject>(); 

    public void tick() { 
     for (int i = 0; i < object.size(); i++) { 
      GameObject tempObject = object.get(i); 
      tempObject.tick(); 
     } 
    } 

    public void render(Graphics g) { 
     for (int i = 0; i < object.size(); i++) { 
      GameObject tempObject = object.get(i); 
      tempObject.render(g); 

     } 

    } 

    public void addObject(GameObject object) { 
     this.object.add(object); 
    } 

    public void removeObject(GameObject object) { 
     this.removeObject(object); //this is the error and the game craches after 1 sec, if i remove it, it works but FPS drops 
    } 
} 

и вот Трейл и проблемы начались, когда я это сделал.

import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 

public class Trail extends GameObject { 

    private float alpha = 1; 

    private float life; 
    private Handler handler; 
    private Color color; 
    private int width, height; 

    //life value between 0.001 - 0.1 

    public Trail(int x, int y, ID id , Color color, int width, int height, float life, Handler handler) { // constructor 
     super(x, y, id); 
     this.handler = handler; 
     this.color = color; 
     this.width = width; 
     this.height = height; 
     this.life = life; 
    } 


    public void tick() { 
     if(alpha > life){ 
      alpha -= (life - 0.001f); 
     } 
     else handler.removeObject(this); 

    } 

    public void render(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setComposite(makeTransparent(alpha)); 
     g.setColor(color); 
     g.fillRect(x, y, width, height); 
     g2d.setComposite(makeTransparent(1)); // we wanna sandwitch our alpha and 1 

    } 

    private AlphaComposite makeTransparent(float alpha){ 

     int type = AlphaComposite.SRC_OVER; 
     return(AlphaComposite.getInstance(type, alpha)); 
    } 

    public Rectangle getBounds() { 

     return null; 
    } 



} 

Это много кода я знаю, но я не могу найти проблему, поэтому если у вас есть какие-либо предложения или идеи, было бы здорово услышать их. Спасибо!

+0

Это какой-то произвольный код, который не имеет ничего общего ни с чем связанным с fps. Где ваш код что-то делает? Где ваш '' главный''? Сколько объектов в вашем списке? – f1sh

+0

Сторона примечания: вы можете узнать о написании «разумного» Java-кода. Например, вы можете переписать тело вашего метода тика на 'for (GameObject game: object) {game.tick(); } '. Нет необходимости в счетчике и временном объекте. И: ** улучшить ** ваше именование. Используйте имена, которые говорят, что это за вещь.Вы знаете, как вызов вашего 'List ' gameObjects вместо «object». Можете ли вы определить разницу, которая могла бы сделать ?! И вы знаете: факт, что вы используете ** то же ** имя «объект» повсюду, это ** крайне ** плохая практика. – GhostCat

+4

** Наконец: нет необходимости использовать жирный шрифт по всему вашему вопросу. Мы можем читать без вашей смелой поддержки. ** – GhostCat

ответ

4
public void removeObject(GameObject object) { 
    this.removeObject(object); //this is the error and the game craches after 1 sec, if i remove it, it works but FPS drops 
} 

Вы вызываете метод внутри метода ->StackOverflowError

Оно должно быть:

public void removeObject(GameObject object) { 
    this.object.remove(object); //this is the error and the game craches after 1 sec, if i remove it, it works but FPS drops 
} 

Кроме того, вы добавляете новый Trail объект каждый тик, и никогда не удалить его, так что вы может закончиться нехватка памяти. Попробуйте добавить его один раз, в конструктор, а затем измените его x и y с помощью геттеров и сеттеров.

+0

О, никогда бы не заметил этого, огромное спасибо, он работает сейчас! FPS стабилен без капель. –

+1

Я отвечу на ваш ответ через 10 минут, потому что я еще не могу. слишком рано, хаха –

0

Я думаю, что эта линия является потенциальной утечки:

handler.addObject(new Trail(x, y,ID.Trail, Color.red, 16, 16, 0.02f, handler));

Вы создаете новый объект типа Trail на каждом тике. Это может привести к медлительности .. и позже к сбою.

Вы уверены, что не можете повторно использовать объект?

+0

@ Насо получилось, это было this.removeObject (объект); должен быть this.object.remove (объект); Спасибо –

2

Вы не говорите нам, что такое ошибка, но я подозреваю, что это переполнение стека. Это потому, что вы вызываете removeObject() от себя многократно и навсегда.

Изменить

this.removeObject(object); 

в

this.object.remove(object); 

Я бы также рекомендовал изменить название LinkedList<GameObject> object к LinkedList<GameObject> objects, поскольку она представляет собой набор из нескольких объектов, и это поможет избежать путаницы в вашем addObject() и removeObject() Функции, где параметр имеет то же имя.

+0

Спасибо, в этом была проблема. –