За последние 24 часа нас посетили 18366 программистов и 1637 роботов. Сейчас ищут 1805 программистов ...

Разработка серверного приложения для игры

Тема в разделе "Прочее", создана пользователем Padaboo, 1 апр 2016.

  1. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Хорошо, а как быть с тем что мне нужна ссылка на объект что то вроде hash map в котором будет

    "monster_ai_1" => ссылка на объект потока. который выполняет действия в бесконечном цикле?

    1.Мне нужна ссылка на поток для того что бы его можно было уничтожить.

    По сути монстр это объект с атрибутами и методами.
    И бесконечным циклом логики.

    Тут 2 варианта реализации.
    1)
    Отдельная карта монстров (hash map) со ссылкой на поток.
    Отдельная карта потоков для них.

    2)Карта монстворов, при создании монстра он добавляется hash map. И запускается поток логики.

    Разница в том что. в первом случае работа с потоками и объектами разделена

    Во втором: мы можем вызвать у объекта монстра какой нибудь метод customDestroy() . и внем остановить поток. сделать объект null, выкинуть его из hash map и запусть System.gc();
     
  2. bimply

    bimply Активный пользователь

    С нами с:
    13 авг 2012
    Сообщения:
    449
    Симпатии:
    13
    1. System.gc() не гарантирует сборку мусора. Только рекомендует JVM
    2.В джаве сделать хетшот потоку невозможно. Можно вызвать InterruptedException, но тоже не самый лучший способ. Мне кажется FixedThreadPool наиболее рациональным решением, несмотря на переменное количество потоков. По поводу завершения потока - лучше заведи отдельную boolean переменную и смотри на ее значение внутри потока.Или сделай так чтобы все монстры обрабатывались в одном потоке. NIO подразумевает что монстр начиниает move только тогда, когда прочитана команда, по факту из сети могут команды не успеть придти.
    Сделай 300 потоков, которые будут из synchronized очереди сообщений обрабатывать эти самые команды.
    --- Добавлено ---
    Я правда не настолько хорошо эту среду знаю.

    Не представляю что будет если один поток скажет кругу превратиться в квадрат, а второй поток скажет взорваться на хрен
     
  3. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Там есть множество вариантов, как обрезать количество потоков и сообщений:
    1) Посылать пакеты только соседним объектам
    2) Ставить и запускать монстра только когда в радиусе есть игроки а когда их нет убирать

    И того нам нужен поток сборки мусора и уничтожений пакетов тоже наверное в очереди. (точно такой же как gc) но не для примитивных объектов а для объектов приложения.

    Который будет вызывать destroy у объектов
    Удалять пользователей (сессии)
    Чистить HashMap
     
  4. bimply

    bimply Активный пользователь

    С нами с:
    13 авг 2012
    Сообщения:
    449
    Симпатии:
    13
    Зачем свой сборщик мусора изобретать?
    Я же написал, что джава не гарантирует что System.gc() вызовет гарбейдж коллектор.
    Зачем поверх стандартного что то ещё писать?
    --- Добавлено ---
    Намек простой - если собираешься намусорить -не спасет ни один гарбейдж коллектор :)
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
  6. bimply

    bimply Активный пользователь

    С нами с:
    13 авг 2012
    Сообщения:
    449
    Симпатии:
    13
  7. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    А по маршрутизации что посоветуете. Я постучался на сервер. По идее нужно сохранить на сервере - соединение (in/scoket) или хост с портом где то в коллекции. Что можно было пользователю ответить.
     
  8. bimply

    bimply Активный пользователь

    С нами с:
    13 авг 2012
    Сообщения:
    449
    Симпатии:
    13
    Не тупи, первый байт команды -ид пользователя.
    Второй байт-сама команда.
    Третий байт и тд. -данные команды
     
  9. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Первый байт - этой ip нам нужен еще порт.
    Если мы сидим с одной подсети.
    http://cppjavabahslinux.blogspot.ru/2016/04/tcpip-udp.html
     
  10. bimply

    bimply Активный пользователь

    С нами с:
    13 авг 2012
    Сообщения:
    449
    Симпатии:
    13
    Лучше и проще по моему-через id пользователя.
    Первый раз как человек заходит в игру -ему присваивается однобайтовый id.
    Понятно что так можно написать читы, но для начала я бы этого не делал, пускай играют люди, может найдется прошаренный чувак который читы напишет но явно не скоро и не сразу
     
  11. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Понял: после регистрации у нас в бд появляется пользователь в строку которого мы пишем сроку сессии ip и порт на которые мы ему будем отвечать.
    А до того как он авторизовался должна быть какая то другая логика и ip и порт ответа всеравно нужно где то сохранять
    --- Добавлено ---
    Пока так потом детализирую и поправлю - есть над чем подумать
    [​IMG]
    --- Добавлено ---
    --- Добавлено ---

    Точу по онлайн рпг - тоесть под мультиплеер с AI монстров и нпц.
    Но сначала нужен фреймворк. максимально упрощающий работу. сверху уже приложение.
    --- Добавлено ---
    Подборка потоки
    https://yadi.sk/d/ZFKNnLI0qXZAe
    подборка сети https://yadi.sk/d/jU5aoWbIqyLAx

    Это вынос мозга
    --- Добавлено ---
    Забыл как называетс шаблон проектирования тут наверное подойдет для удобстава:
    Если коллекция облектов hash map - внутри объекты и у каждого из них есть ссылка на коллекцию.
    Объект уничтожается или сбрасывается в базу и удаляет себя из коллекции
    --- Добавлено ---
    registry http://cppjavabahslinux.blogspot.ru/2016/04/registry-pattern.html
    --- Добавлено ---
    --- Добавлено ---
    TCP чтение
    Код (Text):
    1. /*
    2. * jsock framework https://github.com/Padaboo/jsock open source
    3. * Each line should be prefixed with  *
    4. */
    5.  
    6. package jsock.modules.jnet;
    7.  
    8. import java.io.IOException;
    9. import java.io.InputStream;
    10. import java.net.ServerSocket;
    11. import java.net.Socket;
    12. import java.util.Scanner;
    13. import java.util.concurrent.ExecutorService;
    14. import java.util.concurrent.Executors;
    15. import java.util.logging.Level;
    16. import java.util.logging.Logger;
    17.  
    18. /**
    19. *
    20. * @author padaboo I.B Aleksandrov jetananas@yandex.ru
    21. */
    22. public class TCPReciver {
    23.     /**
    24.      * Run flag
    25.      */
    26.     public static boolean isRunning = true;
    27.  
    28.     /**
    29.      * server port
    30.      */
    31.     private final short port;
    32.     /**
    33.      * pool size
    34.      */
    35.     private final int poolSize;
    36.    
    37.     public TCPReciver(short port,int poolSize){
    38.         this.port     = port;
    39.         this.poolSize = poolSize;
    40.     }
    41.    
    42.     /**
    43.      * Create thread poll
    44.      */
    45.     public void startPool(){
    46.         try {
    47.             ServerSocket    sock     = new ServerSocket(port);
    48.             ExecutorService executor = Executors.newFixedThreadPool(poolSize);
    49.             while(isRunning){
    50.                 Socket   in  = sock.accept();
    51.                 executor.execute(
    52.                         new ReceiverThread(in)
    53.                 );
    54.             }
    55.         } catch (IOException ex) {
    56.             Logger.getLogger(TCPReciver.class.getName()).log(Level.SEVERE, null, ex);
    57.         }
    58.     }
    59.     /**
    60.      * Listen user sockets
    61.      * send messages to message list
    62.      * send connection to connection list
    63.      */
    64.     class ReceiverThread implements Runnable{
    65.          /**
    66.          * input data string
    67.          */
    68.         String data = "";
    69.         //socket
    70.         Socket sock;
    71.        
    72.         private ReceiverThread(Socket sock) {
    73.             this.sock = sock;
    74.         }
    75.        
    76.         @Override
    77.         public void run() {
    78.  
    79.             try {
    80.                 InputStream inStream = sock.getInputStream();
    81.                
    82.                 Scanner scanner = new Scanner(inStream);
    83.                
    84.                 while(scanner.hasNextLine()){
    85.                     data += scanner.nextLine();
    86.                    
    87.                 }
    88.                 System.out.println(data);
    89.             } catch (IOException ex) {
    90.                 Logger.getLogger(ReceiverThread.class.getName()).log(Level.SEVERE, null, ex);
    91.             }
    92.         }
    93.     }
    94. }
    --- Добавлено ---
    Много идеи именованные каналы очереди сообщений
    http://citforum.ru/operating_systems/linux_pg/lpg_02.shtml
    --- Добавлено ---
    Нашел интерфейс mysql для языка С http://www.mysql.ru/docs/pautov/c_api.htm
    --- Добавлено ---
    Разбирался с никсами потоками архитектурами нетом оптимизацией и сокетами в итоге купил книжку как программировать на С
     
    #86 Padaboo, 18 апр 2016
    Последнее редактирование: 15 апр 2016
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    тебе не кажется, что у тебя приход? На сях ты много времени потратишь на то же самое, что можно сделать на языке по-выше уровнем, и за меньшее время. Имеет ли это смысл? Зачем оптимизировать то, у чего пока нет вообще никакой нагрузки?
     
    runcore и mr.akv нравится это.
  13. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Да нет С это к слову он никсах и php:
    linux kernel
    https://github.com/torvalds/linux

    Сервер игры пишу на java. Почитал статей про игрыл и там все разделено на локации и инстансы - потому что если будет очень большое количество игроков - в одном месте которым, нужно с большой скоростью посылать пакеты об изменяющемся мире. Будут лаги.
    Посмотрел несколько фреймворков, игровых серверов, различных реализации. И пытаюсь сделать что то отказо устойчивое и неглючное и повторно используемое.
    --- Добавлено ---
    [​IMG]
    Пример: красные точки игроки, синие монстры.
    Одни игроки дерутся в pvp. Другие убивают босса. Третьи просто качаются. Четвертые сидят в городе.
    В этоге игрок должен знать об изменениях игрового мира только в пределах видимости.
    Не считая инстансов и пати. И чатов.

    если посылать изменения обо всем мире будут лаги
    значит нужно сделать какое то разделение.
    --- Добавлено ---
    Получается что то вроде чата с комнатами. + расчет расстояний

    Еще интересный момент логика монстра который с вершины трехэтажной башник пробегает несколько этажей и нападает на игрока находящегося на первом этаже. ( как он будет искать путь)
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    на боссе и будет основное пвп
    --- Добавлено ---
    не делай так и не будет нужды так делать :D
     
  15. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Это будет веб сервер на основе поговорок "в одно ухо влетело из другого вылетело"