Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Как работает Стратегия? (http://www.flasher.ru/forum/showthread.php?t=144412)

deman455 11.09.2010 04:03

Как работает Стратегия?
 
Вот такой вопрос. Научился работать с базой данных, сделал пару игр с использованием дб по способу "Записал уровень, деньги и.т.п". Т.е. прямая запись.
Теперь меня затронул другой вопрос. Хочу сделать стратегию, но не знаю как правильно реализовать базу данных. Т.е. к примеру, человек нажал на кнопку выучить какой то навык, который будет учиться 2 часа.
Хорошо, с этим все понятно, записать timestamp в базу, а потом при следующем входе игрока проверить прежний timestamp, если время прошло, значит навык выучен.
Вот сам вопрос, а что если этих навыков десятки?? Десятки навыков одновременно учатся (десятки таймстепов и уровней навыка находятся в бд). Не писать же все тайм степы и уровни навыков в одну строку вместе с данными игрока...

Если кто то имеет опыт в стратегиях, просьба помочь, все таки это не легко и интересно.

Psycho Tiger 11.09.2010 14:23

Ну наверняка у стратегии сервер - демон. Записать timestamp ради сохранения прокачки в случае краша сервера, а сам таймер тикает в памяти.

deman455 11.09.2010 18:01

Psycho Tiger
а сам таймер тикает в памяти
А можно поподробней об этом. Т.е. память php скрипта, или что? Скажите пожалуйста ключевое слово, по какому мне найти мануалы с использованием этого. Это снимет нагрузку на сервер? Ну на бд...

И еще, по какому принципу работает счетчик "кто онлайн", я знаю что ежесекундно подается пакет на сервер, что человек в сети. Я так понял этот тоже пхп память?

Zebestov 11.09.2010 18:39

Код:

table skills
-------------------------------------------------
sid - id навыка
title - название
period1 -сколько развивать до уровня 1
period2 -сколько развивать до уровня 2
period3 -сколько развивать до уровня 3

Код:

user_skills_progress
-------------------------------------------------
uid - id пользователя*
sid - id навыка*
tolevel - до какого уровня качаем
time - timestamp начала прокачки

*первые два поля — составной ключ

вот ты и сохранил для всех пользователей все их навыки, которые они в данный момент качают. по факту достижения уровня конкретного навыка потираешь запись о нем в user_skills_progress и делаешь запись в таблице user_skills

Код:

user_skills
-------------------------------------------------
uid - id пользователя*
sid - id навыка*
level - текущий уровень навыка
time - timestamp окончания прокачки (на усмотрение)

*первые два поля — составной ключ


deman455 11.09.2010 19:28

Zebestov
Спасибо большое.
Но вот еще по поводу правельности чтения хотел узнать.

При входе в игру, игрок, должен получить состояние всех своих навыков из user_skills_progress. Если какой то навык выучен, записать его в user_skills.

Главный вопрос заключается в том, будет ли такие постоянные обращения к базе данных нагружать сервер? Помимо этого передача результата (действия) игрока будет очень часто предаваться и записыватся в базу

Zebestov 11.09.2010 21:52

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

При входе синхронизируешь время с сервером. Также при входе клиент получает от сервера ответ, в котором содержится список текущих навыков на прокачке:
Код:

{
        skill_id : 'id навыка',
        skill_title : 'название',
        start : 'timestamp начала прокачки',
        stop : 'timestamp окончания',
        done : '0|1' — завершена ли прокачка
}

Для каждого незавершенного навыка (done == 0):
Код AS3:

// currentLocalTimestamp - текущее синхронизированное время
// PARU_SEKUNDEN - некий запас по времени в пределах пинга (max ? avg). чтобы наверняка
 
var skillTimer:Timer = new Timer(currentSkill.stop - currentLocalTimestamp + PARU_SEKUNDEN, 1);
skillTimer.addEventListener(TimerEvent.TIMER, hanlder_currentSkillComplete);
skillTimer.start();

Ну а уже в hanlder_currentSkillComplete() ты снова запрашиваешь сервер на предмет текущих прокачек (как вначале) и убеждаешься что теперь навык с нужным id пришел с флагом done == 1. В случае если нет, наверное стоит повторить операцию раз-другой с небольшим интервалом. Если так ничего и не вышло — вызывай метод shoZaDela() и формируй баг-репорт:quiet:

Следует отметить, что в запросе http://myserver.com/api/?method=getSkillsProgress следует предусмотреть необязательный "&sid=<id интересующего навыка>", чтобы по таймерам не грузить весь список, когда это не надо.

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

easy.proger 12.09.2010 00:28

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

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

Zebestov 12.09.2010 00:33

а что изменилось?

easy.proger 12.09.2010 00:41

Цитата:

Сообщение от Zebestov (Сообщение 935164)
а что изменилось?

Изменился сам подход к задаче, я предлагаю не синхронизировать время с самим флешом, а просто ставить таймер и проводить операцию только на сервере, то есть при срабатывании таймера не слать - навык "прокачан", а слать попытку установить значение навыка в прокачан.

Zebestov 12.09.2010 02:39

Цитата:

Сообщение от easy.proger (Сообщение 935167)
Изменился сам подход к задаче, я предлагаю не синхронизировать время с самим флешом, а просто ставить таймер и проводить операцию только на сервере, то есть при срабатывании таймера не слать - навык "прокачан", а слать попытку установить значение навыка в прокачан.

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

deman455 12.09.2010 13:25

Спасибо Zebestov и easy.proger

Пришел к одному выводу.
При входе игру, сервер сам проверяет все навыки, если все ок, навык выучен, сервер отправляет в клиент данные, что навык выучен. Если же не выучен, сервер отправляет время, сколько осталось (в сек.) до изучения навыка. В обшем все достаточно легко, только таких навыков могут быть сотни. Сильно ли будет грузить проверка всех навыков (когда человек вошел в игру) сервер?

Добавлено через 1 минуту
Цитата:

Я полагаю, что лучше клиент пускай отсчитывает миллисекунды и в нужный момент сдает "домашнее задание" серверу на проверку
Я тоже с тобой согласен.

Zebestov 12.09.2010 14:11

Вся эта проверка при подключении пользователя сводится к простому SELECT из бд и составлению JSON (например) ответа с проверкой на больше/меньше в одном месте. В случае чего — один DELETE и один INSERT.
Не думаю, что все это сильная нагрузка на любой даже середнячковый сервер.

easy.proger 12.09.2010 15:03

Цитата:

Сообщение от Zebestov (Сообщение 935180)
Я полагаю, что лучше клиент пускай отсчитывает миллисекунды и в нужный момент сдает "домашнее задание" серверу на проверку, нежели сервак будет трещать по швам от миллионов таймеров за каждым подключенным к нему клиентом.

Так, а причем тут сервер ? конечно клиент считает таймер )) только разница в том, что именно клиент не по времени, а по таймеру шлет обновления на сервер и шлет не - "навык прокачан", а шлет запрос, это большая разница ))

Добавлено через 4 минуты
Цитата:

Сообщение от deman455 (Сообщение 935203)
Спасибо Zebestov и easy.proger

Пришел к одному выводу.
При входе игру, сервер сам проверяет все навыки, если все ок, навык выучен, сервер отправляет в клиент данные, что навык выучен. Если же не выучен, сервер отправляет время, сколько осталось (в сек.) до изучения навыка. В обшем все достаточно легко, только таких навыков могут быть сотни. Сильно ли будет грузить проверка всех навыков (когда человек вошел в игру) сервер?

Добавлено через 1 минуту


Я тоже с тобой согласен.

Конечно сильно, НО не кто не заставляет вас ставить таймер НА ВСЕ навыки, think easy )), отсортируйте все навыки/свойста и все, что зависит от времени, поставьте таймер до БЛИЖАЙШЕГО, один таймер) если по таймеру срабатывает несколько событий, то шлите пачкой запросы, старайтесь минимизировать количество запросов !)

Zebestov 12.09.2010 16:13

Цитата:

Сообщение от easy.proger (Сообщение 935223)
Так, а причем тут сервер ? конечно клиент считает таймер )) только разница в том, что именно клиент не по времени, а по таймеру шлет обновления на сервер и шлет не - "навык прокачан", а шлет запрос, это большая разница ))

Ни малейшей разницы. Вольный пересказ, не более.

Цитата:

Сообщение от easy.proger (Сообщение 935223)
Конечно сильно

Обоснуешь?

easy.proger 12.09.2010 16:17

Цитата:

Сообщение от Zebestov (Сообщение 935247)
Ни малейшей разницы. Вольный пересказ, не более.?

Скажем так, просто более плотно раскрыл тему )
Цитата:

Сообщение от Zebestov (Сообщение 935247)


Обоснуешь?

нет ) я просто не так прочитал )


Часовой пояс GMT +4, время: 07:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.