2009-06-26 4 views
2

저는 온라인 게임을하고 있는데 서버 측에서 작업하면서 약간의 걸림돌을 쳤습니다.가장 큰 데이터 세트에 맞게 JAVA NIO ByteBuffer 할당?

Java에서 논 블로킹 소켓을 사용할 때 모든 데이터를 사용할 수있을 때까지 처리 할 수없는 완전한 패킷 데이터 세트를 처리하는 가장 좋은 방법은 무엇입니까? 예를 들어, 소켓을 통해 큰 2D 타일 맵을 전송합니다.

나는 그것을 처리하는 두 가지 방법을 생각할 수 있습니다

  1. 내 예에서 큰 2D 타일 맵을 처리하는 데 필요한 전체 데이터 세트를 처리 할 수있을만큼 크게의 ByteBuffer를 할당합니다. 모든 데이터가 수신 될 때까지 버퍼에 읽기 데이터를 계속 추가하고 처리하십시오.

  2. ByteBuffer가 더 작은 크기 (아마 1500)이면 파일에서 완전히 처리 될 때까지 후속 읽기를 수행하고 파일에 출력 할 수 있습니다. 이렇게하면 큰 ByteBuffer를 가질 필요가 없지만 디스크 I/O로 인해 성능이 저하됩니다.

모든 SocketChannel에 전용 ByteBuffer를 사용하므로 처리가 완료 될 때까지 데이터를 계속 읽을 수 있습니다. 문제는 2D Tiled Map의 크기가 2MB인데 1000MB의 ByteBuffers를 사용하는 것이 현명한가 (1000 개는 클라이언트 연결 제한이라고 가정하고 모두 사용 중임)? 내가 생각하지 않는 더 좋은 방법이 있어야합니다.

나는 물건을 간단하게 유지하고 싶지만 어떤 제안이든 열어두고 도움을 주시면 감사하겠습니다. 감사!

답변

1

아마도 지금 가장 좋은 해결책은 전체 2MB ByteBuffer를 사용하고 필요할 경우 운영 체제에서 디스크 (가상 메모리)로 페이징하는 것입니다. 1000 명의 동시 사용자가 없을 것이며, 그렇게하면 최적화 할 수 있습니다. 실제 성능 문제가 무엇인지 놀라실 수 있습니다.

+0

Java 힙 크기를 이와 같이 큰 크기로 조정해도됩니까? 심지어 100 개의 연결도 쉽게 기본 제한을 날려 버릴 것이고 내 서버는 OutOfMemory 예외로 인해 충돌 할 것입니다. – user126368

+0

정말 100 개의 동시 연결이 있습니까? 그렇다면 더 나은 해결책은 타일 맵 형식/프로토콜을 최적화하여 더 간결하게 만드는 것입니다. 그렇지 않으면, 힙 크기를 늘리는 실험을 해보지 않겠습니까? –

0

최상의 조치는 내 대규모 데이터 세트의 크기를 줄이고 전체지도 업데이트 대신 타일 업데이트를 보내는 것입니다. 그렇게하면 전체지도 대신지도에서 변경된 타일 목록을 다시 보낼 수 있습니다. 이렇게하면 큰 버퍼를 사용할 필요가 없어지고 다시 정상적으로 돌아옵니다. 감사.

관련 문제