• Лови промокод з яким знижка 50 грн - promo50grn

таймер на сервере в браузерной игре

Статус: Offline
Реєстрація: 14.03.2007
Повідом.: 308
таймер на сервере в браузерной игре

Добрый день.
Делаю браузерную онлайн игру : php + MySql + js
Хочу что бы в игре были некоторые события которыя совершаются по времени.
Например:
Персонаж отравлен на 8 секунд.
На определенной странице должна отображаться информация о том
сколько секунд осталось до исчезновения эффекта
и причем хочу что бы тикал таймер.
На стороне клиента это одно,
но нужно что бы учет времени и отработки шел на строне сервера.
По истечении времени страница перегружается.

То есть:
Персонажа отравил на 8 секунд
при заходе на страницу показывается запись - персонаж отравлен, рядом тикает таймер 7 6 5 ... и.т.д
когда дойдет до нуля - на странице исчезнет запись об этом эффекте.
Если игрок не заходил на страницу то все равно через 8 секунд эффект пропадет
Отсчет времени должен быть первичный на сервере.

Как можно такое реализовать?
 
Добрый день.
Делаю браузерную онлайн игру : php + MySql + js
Хочу что бы в игре были некоторые события которыя совершаются по времени.
Например:
Персонаж отравлен на 8 секунд.
На определенной странице должна отображаться информация о том
сколько секунд осталось до исчезновения эффекта
и причем хочу что бы тикал таймер.
На стороне клиента это одно,
но нужно что бы учет времени и отработки шел на строне сервера.
По истечении времени страница перегружается.

То есть:
Персонажа отравил на 8 секунд
при заходе на страницу показывается запись - персонаж отравлен, рядом тикает таймер 7 6 5 ... и.т.д
когда дойдет до нуля - на странице исчезнет запись об этом эффекте.
Если игрок не заходил на страницу то все равно через 8 секунд эффект пропадет
Отсчет времени должен быть первичный на сервере.

Как можно такое реализовать?


сначала пишем в базу время (timestamp) начала отравления
при последующих запросах сравниваешь текущее время с временем начала отравления. если разница больше 8 - отравление прошло.
таймер - тока на стороне клиента джаваскриптом + редирект.
и никаких потоков

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

а какие варианты все же на сервере выполнять запланированные задачи?
 
да не надо тебе запланировано выполнять задачи.
все задачи можно выполнять при запросах к серверу
 
а если некому отправлять запросы на сервер?
Если никто не отправляет запросы в эту секунду а именно в эту секунду нужно обработать данные на сервере?
 
вот поэтому учите потоки
 
а если некому отправлять запросы на сервер?
Если никто не отправляет запросы в эту секунду а именно в эту секунду нужно обработать данные на сервере?

определись сначала, для чего именно в эту секунду нужно обработать данные?

вот поэтому учите потоки

да шо ты заладил со своими потоками?
 

потоки тут нахуй не нужны.

На стороне клиента на javascript вешаешь обработчик таймера, который обновляет счетчик секунд, по достижении нуля отправляешь запрос на сервер. Для защиты от читеров на стороне сервера хранишь структурку по каждому клиенту, в которую записываешь время когда персонаж разотравится, если от клиента пришел запрос раньше чем записано, отправляешь ему еще раз страницу с ожидающим таймером, но уже передав не 8 секунд, а сколько там осталось...

а если некому отправлять запросы на сервер?
Если никто не отправляет запросы в эту секунду а именно в эту секунду нужно обработать данные на сервере?

возникает вопрос - зачем их обрабатывать если никто об этом не узнает? ;)
Когда клиент обратится, тогда и обработаешь.
 
потоки тут нахуй не нужны. На стороне клиента на javascript вешаешь обработчик таймера, который обновляет счетчик секунд, по достижении нуля отправляешь запрос на сервер. Для защиты от читеров на стороне сервера хранишь структурку по каждому клиенту, в которую записываешь время когда персонаж разотравится, если от клиента пришел запрос раньше чем записано, отправляешь ему еще раз страницу с ожидающим таймером, но уже передав не 8 секунд, а сколько там осталось...

ну про это я и говорил, по сути.

по поводу потоков - к примеру, будет 1000 человек онлайн. и на каждый чих заводить поток? серверу будет пизда
 
по поводу потоков - к примеру, будет 1000 человек онлайн. и на каждый чих заводить поток? серверу будет пизда

это точно, достатончо одного клиента чтоб завалить нах сервер... :D причем это еще не говоря о том что потоки еще синхронизировать нужно. А вот нафига тут потоки нужны - сложно даже представить, "абы було"... :D

вот поэтому учите потоки

Для того чтобы правильно и по делу использовать потоки, нужно для начала научиться решать ту-же самую задачу не используя потоков. Как бы это ни казалось по началу странным, но без потоков задачу решить проще, работать она будет надежнее и при этом будет легкочитаема. Для игр потоки вообще практически не используются.

В данном случае использование потоков неправильное решение. Потоки тут совершенно ни к чему
 
Останнє редагування:
Простой пример:
1 У игрока стоит автоматом атака в бою.
Атака занимает 8 секунд (по истечении 8 секунд он автоматически атакует)
Игрок вывалился из браузера во время боя.
Как в этом случае обрабатывать его автоматическую атаку?

2 Игрок отравлен на 9 секунд. Он вывалился из браузера во время боя.
При этом он автоматом атакует в бою. И при этом его отравление должно
действовать по расписанию, так как это имеет значение в бою для других игроков.
Как организовать адекватно начало и конец воздейсвия яда по расписанию?

3 Игрок начал кастовать замедление на другого игрока. Это заклинание
требует от него 3 часа каста, заклинание удаленного действия. Начал кастовать и вышел из браузера.
Но каст должен продолжаться.
Когда оно будет завершено (через 3 часа, если конечно его не прервут) то тот,
на кого оно сделано, должен подвергнуться его воздействию:
его скорость будет уменьшена,
у кастующего же каждый ход будет отниматься определенное количество маны.
 
Простой пример:
1 У игрока стоит автоматом атака в бою.
Атака занимает 8 секунд (по истечении 8 секунд он автоматически атакует)
Игрок вывалился из браузера во время боя.
Как в этом случае обрабатывать его автоматическую атаку?

Если суть в том что персонаж должен действовать сам даже без управления со стороны клиента, тогда при каждом обращении любого из клиентов ты можешь проверить прошел ли минимальный квант времени (например 1 секунда). Если прошел, вызвать UpdateState с текущим временем для всех серверных энтитей персонажей и обновить их состояние.


2 Игрок отравлен на 9 секунд. Он вывалился из браузера во время боя.
При этом он автоматом атакует в бою. И при этом его отравление должно
действовать по расписанию, так как это имеет значение в бою для других игроков.
Как организовать адекватно начало и конец воздейсвия яда по расписанию?

аналогично предыдущему

3 Игрок начал кастовать замедление на другого игрока. Это заклинание
требует от него 3 часа каста, заклинание удаленного действия. Начал кастовать и вышел из браузера.
Но каст должен продолжаться.
Когда оно будет завершено (через 3 часа, если конечно его не прервут) то тот,
на кого оно сделано, должен подвергнуться его воздействию:
его скорость будет уменьшена,
у кастующего же каждый ход будет отниматься определенное количество маны.

аналогично предыдущему, если так уж необходимо обрабатывать интервалы времени, то при каждом действии требующем ожидания, можно добавлять в выделенную очередь время когда необходимо проверить состояние объектов. Перед очередным вызовом UpdateState проверить очередь на наличие записей с временем лежащим в интервале между последним вызвовом UpdateState и текущим временем. Если такие записи есть, то вызвать для каждой из них UpdateState. После чего вызвать UpdateState для текущего времени.

При таком подходе конечно уже можно рассмотреть и добавление фонового потока который будет вызывать UpdateState всех персонажей с минимальным квантом времени, независимо от обращения клиентов.
Но тут нужно смотреть какой вариант будет более эффективен для сервера и выбрать оптимальный. Если персонажей много и очень много различных интервалов, это будет создавать излишнюю нагрузку на сервер после длительного отсутствия обращений от клиентов. С другой стороны добавление фонового потока создаст дополнительную постоянную нагрузку на сервер даже при отсутствии клиентов
 
Останнє редагування:
езык, кстати, какой?
 
а. не заметил чето сначала
 
Спасибо всем.
В данный момент остановились с программистом на обработке на стороне клиента,
обработчик будет обрабатывать самого клиента и всех персов которые в бою с персом юзера или рядом. Короче пока на стороне клиента по таймеру.
Параллельно думаем над демоном.
Одни раз в несколькло минут на глобальные события и другой на более мелки.
 
Вы случайно не из Эстонии?
 
Подумайте насчет использования или готовой job queue, или простейшей реализации хранения событий с запланированным временем выполнения в БД и загрузку их оттуда для выполения через заданный интервал cron-скриптом или демоном.

PS: Не думали использовать js+mysql+js (в смысле, node.js на сервере)? Ваше приложение будет как один "демон": постоянно в памяти, всякие плюшки типа таймаутов, повторное использование кода в браузере и на сервере.
 
Назад
Зверху Знизу