PDA

Просмотр полной версии : Продуманная синхронизация времени в онлайн играх.


PEPSICOLA
29.09.2008, 23:58
Кто знает - SOS! :confused:

Допустим расчитано что виртуальный день - четыре реальных минуты.

Как, определяясь этой формулой - создать пассивный скрипт выполнения заданного пользователем действия? Причем не однократно.

Для обработки данных в mysql с помощью функий действия, написанные в php.

astrologer
30.09.2008, 00:16
Недостаточно исходных данных.

etc
30.09.2008, 00:18
Берешь точку отсчета и сопоставляешь ее с реальной датой. далее тупо мат. операции.

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-е минуты?

Это ведь большая нагрузка на сервер.

Ch3ck
30.09.2008, 01:36
Вот придумаешь же всякую х**ню ;)

PEPSICOLA
30.09.2008, 02:17
Вот придумаешь же всякую х**ню ;)
Это серьёзно. К примеру, limpompo, знает о чём я. :p :D

PEPSICOLA
30.09.2008, 02:38
Помню были архивы сайтов целиком, такие как территория, комбатс и подобные - сейчас бы достать пару движков - посмотреть систему временной работы каждой, отметить плюсы и минусы в каждой системе и сравнить.

Может у кого есть движки? Кто может зальет на rapidshare?

Chaak
30.09.2008, 08:33
1 UPDATE запрос и БД каждые 4 минуты при pconnect'e займет меньше времени, чем перезагрузка странички игрока :)

имхо это самый быстрый и простой способ.

Isis
30.09.2008, 10:37
Ajax, PEPSI, ajax

Chaak
30.09.2008, 11:35
Ajax, PEPSI, ajax
Какой нафиг аякс? Причем тут исполнение у клиента, когда время должно идти на серванте?

etc
30.09.2008, 12:52
С аккаунта игрока, каждые 4-е минуты, должны вычитаться и добавляться определённые значения для параметров.
Т.е. насколько я понимаю, все-равно в базе будет какая-то запись о снятии/пополнении параметров, не от балды же они пополняются, либо, если они глобально у всех пополняются, бери, как я говорил, точку отсчета и просто дели количество прошедшего времени на 4 - получишь столько единиц пополнения/вычитания параметров. Либо от времени записи данных в базе. Можно так-же актуальность действия прописать, т.е., например:

timestamp - с какого времени будет действовать правило
pid (playerid) - для какого пользователя
endtimestamp - до какого времени (по time(), скажем) будет действовать правило.

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

Отпиши аську, чем смогу, помогу, сам кодил раньше броузерку :)

Gifts
30.09.2008, 12:58
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 минут, а только тогда, когда они понадобятся - в этом случае нужно хранить время последнего обновления. У такого метода есть преимущество - будет довольно просто организовать кеш.

Isis
30.09.2008, 13:16
ChaaK, когда конечный ответ в теме будет, я тебе матом скажу, ок?Умник :)

Isis
30.09.2008, 13:18
Помню были архивы сайтов целиком, такие как территория, комбатс и подобные - сейчас бы достать пару движков - посмотреть систему временной работы каждой, отметить плюсы и минусы в каждой системе и сравнить.

Может у кого есть движки? Кто может зальет на 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 (для начала) это надо пробежать по всей таблице действий из базы данных и ориентируясь на них - изменять значения из других таблиц.

Doom123
30.09.2008, 17:49
поэтому браузерные игры ставят на выделеный серв ...

PEPSICOLA
30.09.2008, 18:05
Блин... что ж у меня не получается нормально выразиться то :))) Как дерьмово когда не знаешь что хочешь :)))

Эммм.. как создать этот ориентир времени, относительно которого, будут производиться зависящие от него действия? :)

Этот таймер, должен каждую секунду (в лучшем случае), пробежать всю таблицу "действий", найти уже просроченное действие, а именно, то что сказал постом выше etc:
endtimestamp - до какого времени (по time(), скажем) будет действовать правило.
И соответственно что либо выполнить.

n0ne
30.09.2008, 18:22
Пришел в голову анальный вариант:

При каждом обновлении страницы у юзера обновляюца, например, кукисы, а точнее timestamp в них. Сравнивать timestamp юзера со stamp'ом в момент подгрузки страницы и мат. формулой рассчитывать тот же рост хп или что там нужно :)

И, между прочим, это можно реализовать на том же аяксе, как мне думаеца)

upd:

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

PEPSICOLA
30.09.2008, 18:56
n0ne, так куки смогут подделывать. Это ещё хуже, что бы какие то значения переменных напрямую брались из кук :)
имхо

etc
30.09.2008, 19:07
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. добавляем полученные единицы к статам (скажем, просто обновляем таблицу)..

ппц нах)

desTiny
30.09.2008, 19:51
пепсик, не надо каждые 4 минуы обновлять - храни последнюю дату обновления, а когда инфа потребуется - по запросу обновляй у данного как выполненное (t2-t1)/4 раз.

n0ne
30.09.2008, 20:31
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 займет меньше времени, чем перезагрузка странички игрока :)

имхо это самый быстрый и простой способ.
Неа ,