저는 온라인 게임을하고 있는데 서버 측에서 작업하면서 약간의 걸림돌을 쳤습니다.가장 큰 데이터 세트에 맞게 JAVA NIO ByteBuffer 할당?
Java에서 논 블로킹 소켓을 사용할 때 모든 데이터를 사용할 수있을 때까지 처리 할 수없는 완전한 패킷 데이터 세트를 처리하는 가장 좋은 방법은 무엇입니까? 예를 들어, 소켓을 통해 큰 2D 타일 맵을 전송합니다.
나는 그것을 처리하는 두 가지 방법을 생각할 수 있습니다
- 내 예에서 큰 2D 타일 맵을 처리하는 데 필요한 전체 데이터 세트를 처리 할 수있을만큼 크게의 ByteBuffer를 할당합니다. 모든 데이터가 수신 될 때까지 버퍼에 읽기 데이터를 계속 추가하고 처리하십시오.
ByteBuffer가 더 작은 크기 (아마 1500)이면 파일에서 완전히 처리 될 때까지 후속 읽기를 수행하고 파일에 출력 할 수 있습니다. 이렇게하면 큰 ByteBuffer를 가질 필요가 없지만 디스크 I/O로 인해 성능이 저하됩니다.
모든 SocketChannel에 전용 ByteBuffer를 사용하므로 처리가 완료 될 때까지 데이터를 계속 읽을 수 있습니다. 문제는 2D Tiled Map의 크기가 2MB인데 1000MB의 ByteBuffers를 사용하는 것이 현명한가 (1000 개는 클라이언트 연결 제한이라고 가정하고 모두 사용 중임)? 내가 생각하지 않는 더 좋은 방법이 있어야합니다.
나는 물건을 간단하게 유지하고 싶지만 어떤 제안이든 열어두고 도움을 주시면 감사하겠습니다. 감사!
Java 힙 크기를 이와 같이 큰 크기로 조정해도됩니까? 심지어 100 개의 연결도 쉽게 기본 제한을 날려 버릴 것이고 내 서버는 OutOfMemory 예외로 인해 충돌 할 것입니다. – user126368
정말 100 개의 동시 연결이 있습니까? 그렇다면 더 나은 해결책은 타일 맵 형식/프로토콜을 최적화하여 더 간결하게 만드는 것입니다. 그렇지 않으면, 힙 크기를 늘리는 실험을 해보지 않겠습니까? –