2010년 8월 1일 일요일

리니지 쓰레드 정리(튜닝)

더많은 자료는 http://www.sofree.co.kr/



Client가 패킷을 보내면 ClientThread에서 패킷을 받아서 HCPacket에게 전달 합니다.


HCPacket은 전달받은 패킷을 PacketHandler를 이용하여 처리 합니다.

그런데 HCPacket은 ClientThread에서 패킷이 올때만 동작하면 되는데 현재는 ClientThread에서 패킷이 왔는지를 1초에 100번씩 체크 합니다. 이것만 줄여줘도 부하가 많이 해결될 것 같습니다.



ClientThread.java

파란 부분을 찾아서 빨간부분을 추가 합니다.

public void requestWork(byte data[]) {

_queue.offer(data);

// 처리할 데이터가 왔으므로 대기모드인 스레드에게 신호를 준다.

synchronized (_queue) {

_queue.notify();

}

}



ClientThread.java

HCPacket의 run() 메소드 내부의 모든 내용을 지우고 아래 내용을 넣습니다.



@Override

public void run() {



byte[] data;



while (_csocket != null) {



// 처리할 데이터가 없다면 대기모드로 전환

if (_queue.isEmpty()) {

try {

synchronized (_queue) {

_queue.wait();

}

} catch (Exception e) {

e.printStackTrace();

}

}





// 처리할 데이터를 모두 처리할 때 까지 반복

while (!_queue.isEmpty()) {



// 처리할 데이터 얻기

data = _queue.poll();

if (data == null) {

break;

}



// 데이터 처리

try {

_handler.handlePacket(data, _activeChar);

} catch (Exception e) {

e.printStackTrace();

break;

}

}

}

}











ClientThread.java

파란 부분을 찾아서 빨간부분을 추가 합니다.

_csocket = null;

hcPacket.requestWork(null);

movePacket.requestWork(null);

 
 
더많은 자료는 http://www.sofree.co.kr

댓글 없음:

댓글 쓰기