Доброго времени, посетители.
Сегодня я дам вам небольшой, но достаточно важный совет - совет по снижению нагрузки в online-играх.
Часто скачивая очередной freeware продукт я заинтересовываюсь принципами построения того или иного модуля.
Расскажу вам об основной ошибке (хотя нет, даже не ошибке, а невнимательности) программистов - о системе регенерации.
В 90% случаев используется cron-job, выполнение сценария php-файла по времени (1 раз в 5 минут, а то и намного быстрее) аля \"такая каша\":
mysql_query(\"UPDATE `usr` SET `hp` = `hp` + \'1\'\"
В принципе, на первых парах это довольно приемлимый вариант - обновляется все само, работает, и слава Богу.
Такой способ регенерации приемлим лишь в том случае, если мы создали сайт для двух друзей и себя - т.к можно подсчитать примерное кол-во запросов.
Представим:
Допустим, у нас 1.000.000 игроков, из них активных - 10.000 (т.е играющие люди).
Каждые пять минут MySQL будет обрабатывать 1.000.000 запросов (!), и не нужно говорить про циклы - результат будет аналогичным.
Взамен этому бесполезному занятию (курочанье сервера SQL) я предлагаю более рациональное решение - регенерировать лишь тех, кто активно играет и лишь в том случае, если игрок зашел в сеть.
Составим условие:
При переходе на страницы обновляем время последнего действия пользователя в базе данных. Текущее время минус время последнего обновления игрока, деленное на количество минут для регенерации 1 HP, округленное в меньшую сторону/большую сторону.
Нагрузка в таком случае будет уменьшена в десятки, а то и сотни раз.
И напоследок - чуть реализации:
[code]if ($user[hp] != $user[hp2s]){
$time = time();
$hp = round(($time-$user[\'date_last\'])/30);
$ne = $user[hp] + $hp;
if($hp >= $user[\'hp2s\'] or $ne >= $user[hp2s])
{ mysql_query(\"UPDATE `user` SET `hp` = `hp2s` WHERE `nick` = \'$user[nick]\'\"
; }
else { mysql_query(\"UPDATE `user` SET `hp` = `hp`+\'$hp\' WHERE `nick` = \'$user[nick]\'\"
; }
}[/code]