2012-07-16 4 views
1

Я начинаю делать свою 2D-игру/движок, но понятия не имею о лучшей архитектуре потоков для работы с клиентами на стороне сервера.Архитектура Threading для Gameserver

Первоначально, я думал о проекте «Нить за карту», ​​а не о потоке за пользователя. Но есть еще один идеальный метод?

В моей концепции для нарезки карт поток будет создан только у входа игрока на карте и будет уничтожен вскоре после его опустошения. Но с этой концепцией карта со слишком большим количеством игроков (например, магазинов игроков) может вызвать сильное отставание.

С пользовательским подходом к потоку было бы большое количество потоков - и, следовательно, высокое выделение памяти.

Итак, есть еще один лучший способ сделать это?

+1

Возможно, серверный пул потоков, с большим количеством пользователей, использует больше потоков, чем карты с несколькими. – lesderid

+3

Попытайтесь переделать свою логику игры в какой-то конечный автомат, где вы можете просто вызвать 'map.Step()', чтобы продвинуть его из любого потока. Тогда вы можете легко переключаться между пулом потоков, небольшим фиксированным числом потоков или даже одним потоком. –

+0

+1 для Кори «переделайте свою логику игры в нечто государственную машину» - немного сложнее, но вам нужна эта гибкость для сложного приложения. –

ответ

1

Ответ на ваш вопрос - просто используйте один поток, чтобы имитировать многие игровые экземпляры. Очень мало случаев, когда игры выигрывают от многопоточности из-за сложностей игрового программирования и сложности в разделении доступа к памяти любым значимым/безопасным/полезным способом. Даже серверы для самых больших игр, о которых вы слышали, являются однопоточными для всей логики игры. Например, игра в стиле Diablo будет иметь 1 нить на ядро, и каждая из них будет отвечать за сотни игр с крошечной крошечной кроссовой логикой для перекручивания игр.

1

У вас будет несколько преимуществ от многоуровневой арки, когда ваш сервер имеет несколько ядер процессора. Поэтому, если ваша арка игр - это чистое событие (вы никогда ничего не ждете в обработчике событий), лучшая производительность будет равна числу потоков, равному номеру ядра процессора.

Смежные вопросы