Четверг, 18 Апреля 2024, 23:19

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [355]
Статьи об общих понятиях связанных с созданием игр.
Программирование [82]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [145]
Статьи о программах для создания игр, уроки и описания.
Софт [43]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [16]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [161]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [129]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Какой ЯП вы знаете?
Всего ответов: 27890
Главная » Статьи » Создание игр

MMORPG на PHP: ООП и кэширование
В последнее время появилось очень много юных талантов, желающих создать собственную MMORPG-игру. Что они делают в первую очередь? Естественно, берут первую-лучшую книжечку по PHP + MySQL. Это в принципе неплохой выбор, но неужели это всё, что нужно для создания отличной игры?

Ответ предсказуем - нет, и сегодня мы рассмотрим на теории и практике всё, что пригодится для создания приличного отказоустойчивого приложения.

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

Давайте вскроем среднестатистический исходник WAP-игры на PHP (кроме WAP мало что можно найти). Что мы там видим?

Код

$handle = mysql_query($conn, "SELECT * FROM `chars` WHERE `name` = '". $_POST['login'] ."' LIMIT 0,1");
$data = mysql_fetch_array($handle);
echo "Level: ". $data['lvl'] ." \n дальше мне было лень писать, сами поймёте ";


"Что здесь плохого, кроме твоего комментария?", - спросит среднестатистический кодер. А я вам объясню, даже по пунктам.

  • Не проводится проверка данных, подставляется прямо в запрос (спокойно можно сделать иъекцию, введя логин ' OR '1' = '1)
  • Устаревшие функции MySQL
  • Вывод прямо на страницу. Иногда это не лучший вариант, особенно при использовании шаблонизатора
  • Без ООП. Это необязательно, но лучше с ним


Запомните первое - необходимо объект-ориентированное программирование. Что вы сделаете одними запросами и функциями? Мало чего стоящего. Уверяю вас - надо использовать классы. Учите ООП, оно вам пригодится не только здесь, в php, но и в других ЯП, если вы будете их изучать.

Главная ошибка при использовании ООП - это постоянный include всех необходимых классов. Запомните раз и навсегда - необходимо загружать лишь те классы, которые точно будут использоваться. Для этого создана автозагрузка классов. Пример загрузчика:

Код


function autoload($class)
{
  include_once(__DIR__ . "/classes/" . $class . ".php");
}

spl_autoload_register("autoload");



Вряд ли следует объяснять смысл данного когда. Функцией spl_autoload_register регистрируется автозагрузчик классов. Выбранная функция вызывается тогда, когда создаётся экземпляр класса (new ClassName), который не был объявлен. Так что теперь вы можете спокойно помещать каждый класс в отдельный файл папки classes. Можно регистрировать и несколько таких функций, но желательно обойтись одной, ибо смысл множить их? Засоряют.

Второе, что вам обязательно нужно знать - запросы надо кэшировать. Если у вас онлайн в дюжину игроков, и каждое действие игрока провоцирует 50 запросов к БД, рано или поздно сервер заплачет и упадёт. Поэтому часто выполняемые запросы надо кэшировать. Один из хороших примеров расширений для кэша - Memcache. Он хранит данные на уровне оперативной памяти в виде таблицы ключ-значение. Это удобно.

Код

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Не могу подключиться");

$version = $memcache->getVersion();
echo "Версия сервера: ".$version."<br/>\n";

$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;

$memcache->set('key', $tmp_object, false, 10) or die ("Ошибка при сохранении данных на сервере");
echo "Данные сохранены в кеше. (время жизни данных 10 секунд)<br/>\n";

$get_result = $memcache->get('key');
echo "Данные из кеша:<br/>\n";

var_dump($get_result);

// пример кода взят с официальной документации


Смысл этого кода также понятен интуитивно. Мы сохраняем данные на 10 секунд в память memcache. Естественно, на практике надо ставить срок побольше. Теперь мы можем кэшировать даже запросы.

Код

$query = "SELECT * FROM `config` WHERE `type` = 'main'";
if( $memcache->get( md5($query) ) )  
{
  $data = $memcache->get( md5($query) );  
}
else  
{
  $data = mysql_fetch_array( mysql_query($query) );
  $memcache->set(md5($query), $data, false, 3600)
}


В данном примере мы сохраняем текст запроса. Потом шифруем его в md5 и полученный ключ ищем в памяти. Нет - делаем запрос к БД и сохраняем в кэш, есть - просто возвращаем. Итог - вместо 100500 запросов каждую минуту от кучи пользователей он производится лишь раз в час.

Даже это избавит вашу игру от многих вылетов и падений. Достаточно ли этого? Нет. Игру можно оптимизировать хоть до конца жизни, используя всё новые и новые технологии. Следующее, о чём вам надо знать - это веб-сокеты, которые создают непрерывное соединение клиента и сервера. В php для развёртывания такого сервера используется функция stream_socket_server, однако об этом мы поговорим в следующей статье (можно было вложиться и в одну, но хорошего должно быть понемногу).

До скорого!
Категория: Создание игр | Добавил: JackNazaryan (29 Июля 2015) | Автор: Дмитрий
Просмотров: 8992 | Комментарии: 1 | Рейтинг: 5.0/2 |
Теги: Онлайн, код, PHP, оптимизация, MySQL, memcache, программирование, нагрузки, игра, MMORPG
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «MMORPG на PHP: ООП и кэширование», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 1
+0-
1 dima9595   (02 Августа 2015 21:30) [Материал]
dima9595Данная статья почти ни коем образом не затрагивает тему MMORPG. ООП и кэширование, в частности ООП, используется почти всеми хорошими PHP программистами. Кэширование желательно использовать для нагруженных систем, а не только в MMO.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • AppSalute Creator
  • Orx
  • Enigma
  • GINCS Studio
  • Crystal Space
  • Odamex
  • Virtools
  • VCMI
  • Genesis3D
  • Android FPS Maker
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг