在我的游戏项目中,我正在尽力避免创建对象,从而阻止垃圾收集器运行。
这是一个网络游戏,我主要发送数据的字节数组,但也有一些其他对象,如int数组。
我注意到在eclipse中分析内存分配时,我正在编写/读取套接字的方式在我的程序中创建了很多字节数组。
oos=new ObjectOutputStream(new BufferedOutputStream(link.getOutputStream()));
ois=new ObjectInputStream(new BufferedInputStream(link.getInputStream()));
如何在不在后台创建任何对象的情况下从/向套接字读/写(主要是字节数组)?
此外,进行此网络通信的最快方式是什么?我需要从这个应用程序中挤出所有性能。
修改
我已经改变了我的代码,现在我只通过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();
}
}
答案 0 :(得分:0)
确保没有对这些数组的引用!!!
您的一些代码将有所帮助