Просмотр полной версии : Продуманная синхронизация времени в онлайн играх.
PEPSICOLA
29.09.2008, 23:58
Кто знает - SOS! :confused:
Допустим расчитано что виртуальный день - четыре реальных минуты.
Как, определяясь этой формулой - создать пассивный скрипт выполнения заданного пользователем действия? Причем не однократно.
Для обработки данных в mysql с помощью функий действия, написанные в php.
astrologer
30.09.2008, 00:16
Недостаточно исходных данных.
Берешь точку отсчета и сопоставляешь ее с реальной датой. далее тупо мат. операции.
PEPSICOLA
30.09.2008, 00:22
Берешь точку отсчета и сопоставляешь ее с реальной датой. далее тупо мат. операции.
Ну так это понятно. А как технически, этот процесс более лучше проработать?
В плане что бы меньше нагрузки на скрипты и базу.
PEPSICOLA
30.09.2008, 00:40
Берешь точку отсчета и сопоставляешь ее с реальной датой. далее тупо мат. операции.
И надо что бы скрипт выполнялся пассивно, вне зависимости от пользователя.
то есть то что он нажимает - должно выполняться вне зависимости от виртуального дня, а какие то параметры, должны восстанавливаться, автоматически высчитываясь от других параметров ( то есть без вмешательство на это действие, пользователя, например заданный период ежедневно должен выполняться сам и постоянно изменять какое то значение, за которое отвечает этот скрипт )
PEPSICOLA
30.09.2008, 01:16
Вот, отличный пример для реализации синхронизации виртуального времени:
С аккаунта игрока, каждые 4-е минуты, должны вычитаться и добавляться определённые значения для параметров.
Например надо сделать, что бы с аккаунта каждый виртуальный день, надо переводить деньги на другой аккаунт.
А кроме того, если функция выбрана, то к аккаунту должен прибавляться параметр здоровья по +5 в один виртуальный день, пока не достигнет максимального значения, заданное для этого параметра здоровья.
Вот еси кому не трудно - подкиньте ссылок по этому вопросу, или может кто скажет что то из личного опыта.
PEPSICOLA
30.09.2008, 01:21
Получается что скрипту придётся пробегать каждую учётную запись в базе данных каждые 4-е минуты?
Это ведь большая нагрузка на сервер.
Вот придумаешь же всякую х**ню ;)
PEPSICOLA
30.09.2008, 02:17
Вот придумаешь же всякую х**ню ;)
Это серьёзно. К примеру, limpompo, знает о чём я. :p :D
PEPSICOLA
30.09.2008, 02:38
Помню были архивы сайтов целиком, такие как территория, комбатс и подобные - сейчас бы достать пару движков - посмотреть систему временной работы каждой, отметить плюсы и минусы в каждой системе и сравнить.
Может у кого есть движки? Кто может зальет на rapidshare?
1 UPDATE запрос и БД каждые 4 минуты при pconnect'e займет меньше времени, чем перезагрузка странички игрока :)
имхо это самый быстрый и простой способ.
Ajax, PEPSI, ajax
Какой нафиг аякс? Причем тут исполнение у клиента, когда время должно идти на серванте?
С аккаунта игрока, каждые 4-е минуты, должны вычитаться и добавляться определённые значения для параметров.
Т.е. насколько я понимаю, все-равно в базе будет какая-то запись о снятии/пополнении параметров, не от балды же они пополняются, либо, если они глобально у всех пополняются, бери, как я говорил, точку отсчета и просто дели количество прошедшего времени на 4 - получишь столько единиц пополнения/вычитания параметров. Либо от времени записи данных в базе. Можно так-же актуальность действия прописать, т.е., например:
timestamp - с какого времени будет действовать правило
pid (playerid) - для какого пользователя
endtimestamp - до какого времени (по time(), скажем) будет действовать правило.
Тут от задачи, для каждого отдельного элемента в игре нужно по разному брать исходные данные и применять результат вычислений.
Отпиши аську, чем смогу, помогу, сам кодил раньше броузерку :)
PEPSICOLA, а если так
@set_time_limit(0);
@ini_set("max_execution_time", 0);
@ini_set("mysql.connect_timeout", -1);
@ignore_user_abort(1);
$link=mysql_pconnect('server','user',password);
while (mysql_ping($link))
{
sleep(240);
mysql_query('UPDATE characters SET characters.hp=characters.hp+characters.hp_tick WHERE characters.incombat=0 AND characters.online>0');
// Раз в 240 секунд увеличиваем всем персонажам ХП на величину hp_tick (которая может быть и отрицательная), если они не в бое и онлайн
}
mysql_close($link);
Скрипт запускаем на серве и он будет висеть и обновлять пока есть соединение с сервером
astrologer
30.09.2008, 13:02
Имеет смысл обновлять данные не каждые n минут, а только тогда, когда они понадобятся - в этом случае нужно хранить время последнего обновления. У такого метода есть преимущество - будет довольно просто организовать кеш.
ChaaK, когда конечный ответ в теме будет, я тебе матом скажу, ок?Умник :)
Помню были архивы сайтов целиком, такие как территория, комбатс и подобные - сейчас бы достать пару движков - посмотреть систему временной работы каждой, отметить плюсы и минусы в каждой системе и сравнить.
Может у кого есть движки? Кто может зальет на rapidshare?
https://forum.antichat.ru/threadnav37239-1-40.html
astrologer
30.09.2008, 13:33
Ajax, PEPSI, ajax При чём тут Ajax?
PEPSICOLA
30.09.2008, 17:42
Вот именно - будет присутствовать база актуальности действия.
То есть там всё строго со временем, карта перемещения, распределение свободного времени и т.п.
Сама проблема в том - что я не знаю как заставить скрипт работать самому и к тому же управлять базой данных, в зависимости от этих временных едениц. :rolleyes:
Я так - более глобально подумал, неужели база данных, на обычном хостинге, выдержит такую нагрузку? То есть каждые 1-3-5 секунд, выполнять такой тяжелый механизм просчёта для каждого пользователя?
Представьте что их около 1000 (для начала) это надо пробежать по всей таблице действий из базы данных и ориентируясь на них - изменять значения из других таблиц.
поэтому браузерные игры ставят на выделеный серв ...
PEPSICOLA
30.09.2008, 18:05
Блин... что ж у меня не получается нормально выразиться то :))) Как дерьмово когда не знаешь что хочешь :)))
Эммм.. как создать этот ориентир времени, относительно которого, будут производиться зависящие от него действия? :)
Этот таймер, должен каждую секунду (в лучшем случае), пробежать всю таблицу "действий", найти уже просроченное действие, а именно, то что сказал постом выше etc:
endtimestamp - до какого времени (по time(), скажем) будет действовать правило.
И соответственно что либо выполнить.
Пришел в голову анальный вариант:
При каждом обновлении страницы у юзера обновляюца, например, кукисы, а точнее timestamp в них. Сравнивать timestamp юзера со stamp'ом в момент подгрузки страницы и мат. формулой рассчитывать тот же рост хп или что там нужно :)
И, между прочим, это можно реализовать на том же аяксе, как мне думаеца)
upd:
Ещё можно в кроне или любом другом менеджере задач запускать скриптец, который прогоняет бд и изменяет заданные параметры (ну т.е. восстановление хп, например)
PEPSICOLA
30.09.2008, 18:56
n0ne, так куки смогут подделывать. Это ещё хуже, что бы какие то значения переменных напрямую брались из кук :)
имхо
PEPSICOLA, смотри, скажем, есть таблица, в которой это все содержиться. В нее пишутся, скажем, эффекты воздействия над тем или иным параметром, как я уже писал - время начала и конца действия + привязка к игроку.
date - тек. дата
start - начало действия
end - конец действия
time - число, соотв. игровому времени (соотношение игрового времени с реальным).
eff - единица эффекта, на 1 ед. time
:D
1. Извелкаем данные
2.1. Смотрим дату начала действия
2.2. Смотрим текущую дату, если она превышает конец действия то нам нужно вычислить результат воздействия следующим образом:
((end-start)/time)*eff
2.3. если текущая дата не превышает конец действия,то
((date-start)/time)*eff
правда тут нужно смотреть, чтобы была кратность в вычислениях, т.е. чтобы в базе не получилось остатка, не кратному единице времени))) (этого можно достич путем доп. вычислений при записи времени end,start в таблицу, либо просто округлением, хотя оно не всегда есть гуд)
2.3.1. обновляем timestamp с целью того, чтобы после обновления страницы эффект добавился с последнего обновления, а не с первой записи.
2.4. добавляем полученные единицы к статам (скажем, просто обновляем таблицу)..
ппц нах)
пепсик, не надо каждые 4 минуы обновлять - храни последнюю дату обновления, а когда инфа потребуется - по запросу обновляй у данного как выполненное (t2-t1)/4 раз.
Pepsicola, а не надо в открытом виде хранить :) Это всё можно грамотно закриптовать)) И ещё есть вариант с кроном, он, имхо, лучше)
Buffalon
30.09.2008, 20:53
А во ,создай отдельную таблицу где будешь отсчитывать время , и ориентируйся на эту таблицу(допустим
если время там по 0 то когда пользователь забросит её то выполняется какой то код
else
ещо непрошло определённое кол-во времени)
PEPSICOLA
30.09.2008, 20:55
PEPSICOLA, смотри, скажем, есть таблица, в которой это все содержиться. В нее пишутся, скажем, эффекты воздействия над тем или иным параметром, как я уже писал - время начала и конца действия + привязка к игроку.....
Блин! Спасибо! :) Прояснил! :)))
Buffalon
30.09.2008, 21:13
1 UPDATE запрос и БД каждые 4 минуты при pconnect'e займет меньше времени, чем перезагрузка странички игрока :)
имхо это самый быстрый и простой способ.
Неа ,
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot