Хотел еще добавить к возможностям кода.
Из кода мы имеем доступ к потокам приложения. Это значит, что какие-то действия мы можем выполнять параллельно с обработкой пакетов. Стандартный цикл в RunUO (подозреваю, что в другом эмуляторе будет приблизительно то же самое) заключается в следующем:
- Таймеры. Взять таймер из очереди. Проверить пора ему выполняться или нет. Если пора, то выполнить. Если нет, то перейти к следующему таймеру; - Пакеты. Взять пакет из очереди. Посмотреть от кого и что за пакет, выполнить необходимые действия, отправить ответный пакет клиенту. Взять следующий пакет из очереди. - Повторить (вернуться к таймерам).
Это значит, что пока выполняется код одного таймера, весь сервер стоит и ждет. То же самое с пакетами от игроков. Пока обрабатывается пакет одного игрока, другие ждут. В основном это не проблема, потому что код выполняется достаточно быстро и задержки незаметны. Но бывают задачи, которые могут выполняться долго и не зависят от скорости работы сервера. Такие задачи должны выполняться в отдельном потоке и не тормозить работу сервера.
Реальный пример. Сервер расположен на одной машине, сайт хостится на другой. На машине с RunUO нужно формировать стандартную страничку со статусом (например, сколько людей в игре, сколько памяти использует сервер, какая нагрузка на ЦПУ) и отправлять по FTP на машину где крутится сайт. Страничка может отправляться как очень быстро, так и очень медленно (например проблемы с сетью, долго устанавливается FTP соединение и т.д.). В этом случае сервер заморозится, для всех будет большой лаг пока не закончится передача файла. В случае с C# мы порождаем другой поток, говорим ему передать файл и он делает это не тормозя основного потока, который продолжает обслуживать игроков. Как эта проблема будет решена на сфере или POL я не знаю, возможно там есть какие-то похожие механизмы, но в C# это выглядит просто и понятно.
|