使用套接字时避免垃圾回收

时间:2011-07-30 09:32:01

标签: android performance sockets garbage-collection

在我的游戏项目中,我正在尽力避免创建对象,从而阻止垃圾收集器运行。

这是一个网络游戏,我主要发送数据的字节数组,但也有一些其他对象,如int数组。

我注意到在eclipse中分析内存分配时,我正在编写/读取套接字的方式在我的程序中创建了很多字节数组。

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

如何在不在后台创建任何对象的情况下从/向套接字读/写(主要是字节数组)?

此外,进行此网络通信的最快方式是什么?我需要从这个应用程序中挤出所有性能。

修改

我已经改变了我的代码,现在我只通过oos发送松散的字节和整数。 仍然有分配。

Allocations screenshot

阅读代码

@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 :(得分:0)

确保没有对这些数组的引用!!!

您的一些代码将有所帮助