在我的一个游戏项目中,我尽力避免创建对象,从而阻止垃圾收集器运行。
这是一个网络游戏,我主要发送数据的字节数组,但也发送一些其他对象,例如 int 数组。
我在分析 Eclipse 中的内存分配时注意到,通过我向套接字写入/读取的方式,在我的程序中创建了很多字节数组。
oos=new ObjectOutputStream(new BufferedOutputStream(link.getOutputStream()));
ois=new ObjectInputStream(new BufferedInputStream(link.getInputStream()));
如何从套接字读取/写入(主要是字节数组)而不在后台创建更多对象?
另外,进行这种网络通信的最快方法是什么?我需要充分利用这个应用程序的每一点性能。
EDIT
我稍微改变了我的代码,现在我只通过 oos 发送松散的字节和整数。
仍然有分配完成。
分配截图 http://data.fuskbugg.se/skalman02/4e393ac8c61f6_allocations.jpg
读代码
@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;
}
}
Writing
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();
}
}