Избегайте сбора мусора при использовании сокетов - PullRequest
3 голосов
/ 30 июля 2011

В моем игровом проекте я стараюсь изо всех сил избегать создания объектов и, таким образом, препятствовать запуску сборщика мусора.

Это сетевая игра, и я в основном посылаю байтовые массивы данных, но также и некоторые другие объекты, такие как массивы int.

Я заметил, анализируя распределение памяти в Eclipse, что в моей программе создано много байтовых массивов, когда я пишу / читаю / из сокетов.

oos=new ObjectOutputStream(new BufferedOutputStream(link.getOutputStream()));
ois=new ObjectInputStream(new BufferedInputStream(link.getInputStream()));

Как я могу читать / записывать (в основном, байтовые массивы) из / в сокеты, не создавая больше объектов в фоновом режиме?

Кроме того, какой самый быстрый способ сделать это сетевое общение? Мне нужно выжать из этого приложения каждый бит производительности.

EDIT

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

Скриншот размещения

Чтение кода

@Override
public void run() {
    super.run();
    byte packet = -1;
    while(connected){
        try {
            packet = ois.readByte();
            handlePacket(packet);
        } catch (OptionalDataException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            connected=false;
        }
    }

}

@Override
public void handlePacket(byte b) throws OptionalDataException, ClassNotFoundException, IOException {
    super.handlePacket(b);
    //TODO add more packets 
    switch(b){
    case Packet.SERVER_SEND_PLAYER_LOCATIONS:
        this.locations=(int[]) ois.readObject();
        break;
    case Packet.SERVER_SEND_PLAYER_COLORS:
        this.colors= (int[]) ois.readObject();
        break;
    case Packet.SERVER_SEND_WORM_WIDTH:
        wormWidth = ois.read();
        break;
    case Packet.SERVER_SEND_PLAYER_NUMBER:
        numberOfPlayers = ois.read();
        break;
    case Packet.CS_SEND_TURN:
        gp.addTurn(ois.read(),ois.read(),ois.readByte());
        break;
    }
}

Запись

    public void send(byte value){
    try {
        oos.write(value);
        oos.flush();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
public void send(int value){
    try {
        oos.write(value);
        oos.flush();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

1 Ответ

0 голосов
/ 30 июля 2011

просто убедитесь, что нет ссылок на эти массивы !!!

часть вашего кода поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...