JAVA NIO Распределение байтов в буфере для соответствия наибольшему набору данных? - PullRequest
2 голосов
/ 26 июня 2009

Я работаю над онлайн-игрой, и я столкнулся с небольшим затруднением, работая над серверной стороной.

При использовании неблокирующих сокетов в Java, как лучше всего обрабатывать полные наборы пакетных данных, которые невозможно обработать, пока не будут доступны все данные? Например, отправка большой двумерной мозаичной карты через сокет.

Я могу придумать два способа справиться с этим:

  1. Выделите ByteBuffer, достаточно большой, чтобы обработать полный набор данных, необходимый для обработки большой двумерной мозаичной карты из моего примера. Продолжайте добавлять прочитанные данные в буфер, пока все они не будут получены и обработаны оттуда.

  2. Если ByteBuffer имеет меньший размер (возможно, 1500), последующие чтения могут быть выполнены и помещены в файл, пока он не будет полностью обработан из файла. Это исключает необходимость иметь большие байтовые буферы, но снижает производительность из-за дискового ввода-вывода.

Я использую выделенный ByteBuffer для каждого SocketChannel, чтобы я мог продолжать считывать данные, пока они не будут завершены для обработки. Проблема в том, что если моя 2D Tiled Map имеет размер 2 МБ, то действительно ли целесообразно использовать 1000 2 МБ байтовых буферов (при условии, что 1000 - это ограничение клиентского подключения, и все они используются)? Должен быть лучший способ, о котором я не думаю.

Я бы предпочел, чтобы все было просто, но я открыт для любых предложений и ценю помощь. Спасибо!

Ответы [ 2 ]

1 голос
/ 26 июня 2009

Вероятно, лучшее решение на данный момент - использовать полный 2-мегабайтный байтовый буфер и позволить ОС позаботиться о подкачке на диск (виртуальную память), если это необходимо. Вероятно, у вас не будет сразу 1000 одновременно работающих пользователей, а когда вы это сделаете, вы сможете оптимизировать. Вы можете быть удивлены, каковы ваши реальные проблемы с производительностью.

0 голосов
/ 30 июня 2009

Я решил, что лучшим способом действий было бы просто уменьшить размер моего массивного набора данных и отправлять обновления листов вместо полного обновления карты. Таким образом, я могу просто отправить список плиток, которые изменились на карте, вместо всей карты снова. Это уменьшает потребность в таком большом буфере, и я снова на ходу. Спасибо.

...