На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Предназначение данного раздела
Данный раздел предназначен для публикации уроков и примеров по разработке компьютерных игр любого сорта, в том числе авторских проектов участников нашего форума. Главное условие публикации: необходимо не только выложить свое творение, но и подробно описать процесс его создания, подводные камни и прочие, интересные для собрата-разработчика, вкусности.

Если вы желаете выложить свой проект - пишите в Общеорганизационную тему. Есть какие-то другие вопросы по делу - туда же.

Модераторы: Da$aD
  
> [MMORPG своими руками] 3 Техническая демоверсия, пункты: 3, 3.1, 3.2
    3 Техническая демоверсия

    Под этим понятием понятием обычно понимается демка, которая реализует все основные (по сложности) технологические фишки игры (Технодема обычно не содержит геймплея). Этот этап позволяет оценить - потянем ли мы в технологическом плане данный проект.

    В нашем случае мы создадим основу (движок) нашего проекта.

    3.1 Архитектура системы

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

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

    Общий алгоритм работы клиента:

    1 Пользователь: жмет кнопку
    2 Клиент: проверяет корректность действия
    3 Клиент: формирует и отправляет запрос серверу
    4 Сервер: проверяет корректность входных параметров
    5 Сервер: выполняет бизнес-логику корректируя данные сессии и/или БД
    6 Сервер: формирует и отправляет ответ
    7 Клиент: парсит ответ и обновляет гуи

    3.2 Система регистрации ошибок

    Когда система уже работает у большого кол-ва пользователей, то вопрос регистрации ошибок становится критичным. С отладчиком к каждому пользователю не придешь. Да и запускать отладчик на сервере не получиться. Поэтому единственная надежда в таком случае - как можно более полные логи.
    Тем более, что самое главное качество любого клиента - это способность зарегистрировать все ошибки возникающие при его работе. Это позволит разработчику вовремя вносить исправления в клиент, чтобы конечный пользователь вовремя становился счастливым.

    3.2.1 Логи клиента

    Для регистрации ошибок в Java клиенте предусмотрен стандартный класс Logger
    Он обладает многими возможностями, но нам сейчас надо просто настроить вывод логов в файл. Это делается так
    ExpandedWrap disabled
      Logger logger = Logger.getLogger("ClientLogger");
      logger.setUseParentHandlers(false);
      logger.setLevel(Level.ALL);
      // задаем файл для логов
      FileHandler handler = new FileHandler("logs.txt");
      // задаем форматирование сообщений
      handler.setFormatter(new SimpleFormatter());
      handler.setLevel(Level.ALL);
      logger.addHandler(handler);

    Теперь в любом месте программы мы сможем им пользоваться
    ExpandedWrap disabled
      try
      {
           ...
      }
      catch(IOException ex)
      {
              Logger.getLogger("ClientLogger").log(Level.SEVERE, "error message", ex);
              ...
      }


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

    ExpandedWrap disabled
      public static void showMessage(String msg)
      {
              JOptionPane.showMessageDialog(null, msg,"Client Message",
                                                     JOptionPane.INFORMATION_MESSAGE);
      }


    3.2.2 Логи сервера

    Сервер свои логи будет записывать в специальные файлы. Файлы всегда будет располагаться в том каталоге, к котором расположен скрипт. Это позволит удобно делить логи по подсистемам.
    При логировании ошибок и любых других ненормальных ситуаций серверу необходимо не только указывать информацию о самой ошибке, но и данные пользователя, который ее совершил, т.е. ник и IP адрес. Пример:

    ExpandedWrap disabled
      function printLog($msg)
      {
          $fd = fopen("serverlog.txt", "a");
                   // точное время
          $str ="\n"."[".date("Y/m/d h:i:s",mktime())."] ";
       
          $ip = $_SERVER["HTTP_CLIENT_IP"];
          if (empty($ip))
              $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
          if (empty($ip))
              $ip = $_SERVER["REMOTE_ADDR"];
           // данные пользователя
          $str .= $_SESSION["name"]." (".$ip.")\n";
         // само сообщение
          $str .= $msg."\n";
          fwrite($fd, $str);
          fclose($fd);
      }


    Когда возникает необходимость аварийно прекратить выполнение скрипта, то надо использовать специальную функцию завершения скрипта, которая выполняет перед выходом несколько важных вещей: записывает сообщение в лог файл и отправляет клиенту ответ с указанием на ошибку, чтобы клиент мог как то уведомить об пользователя. Раскрывать детали ошибки сервера пользователю не обязательно.
    ExpandedWrap disabled
      function abortExecution($log_msg)
      {
          printLog($log_msg);
          $out = startAnswer("server_error");
          sendAnswer($out);
          exit;
      }
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script Execution time: 0,0775 ]   [ 20 queries used ]   [ Generated: 27.05.18, 23:35 GMT ]