В моем игровом проекте я стараюсь изо всех сил избегать создания объектов и, таким образом, препятствовать запуску сборщика мусора.
Это сетевая игра, и я в основном посылаю байтовые массивы данных, но также и некоторые другие объекты, такие как массивы 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();
}
}