Хорошо, а как быть с тем что мне нужна ссылка на объект что то вроде hash map в котором будет "monster_ai_1" => ссылка на объект потока. который выполняет действия в бесконечном цикле? 1.Мне нужна ссылка на поток для того что бы его можно было уничтожить. По сути монстр это объект с атрибутами и методами. И бесконечным циклом логики. Тут 2 варианта реализации. 1) Отдельная карта монстров (hash map) со ссылкой на поток. Отдельная карта потоков для них. 2)Карта монстворов, при создании монстра он добавляется hash map. И запускается поток логики. Разница в том что. в первом случае работа с потоками и объектами разделена Во втором: мы можем вызвать у объекта монстра какой нибудь метод customDestroy() . и внем остановить поток. сделать объект null, выкинуть его из hash map и запусть System.gc();
1. System.gc() не гарантирует сборку мусора. Только рекомендует JVM 2.В джаве сделать хетшот потоку невозможно. Можно вызвать InterruptedException, но тоже не самый лучший способ. Мне кажется FixedThreadPool наиболее рациональным решением, несмотря на переменное количество потоков. По поводу завершения потока - лучше заведи отдельную boolean переменную и смотри на ее значение внутри потока.Или сделай так чтобы все монстры обрабатывались в одном потоке. NIO подразумевает что монстр начиниает move только тогда, когда прочитана команда, по факту из сети могут команды не успеть придти. Сделай 300 потоков, которые будут из synchronized очереди сообщений обрабатывать эти самые команды. --- Добавлено --- Я правда не настолько хорошо эту среду знаю. Не представляю что будет если один поток скажет кругу превратиться в квадрат, а второй поток скажет взорваться на хрен
Там есть множество вариантов, как обрезать количество потоков и сообщений: 1) Посылать пакеты только соседним объектам 2) Ставить и запускать монстра только когда в радиусе есть игроки а когда их нет убирать И того нам нужен поток сборки мусора и уничтожений пакетов тоже наверное в очереди. (точно такой же как gc) но не для примитивных объектов а для объектов приложения. Который будет вызывать destroy у объектов Удалять пользователей (сессии) Чистить HashMap
Зачем свой сборщик мусора изобретать? Я же написал, что джава не гарантирует что System.gc() вызовет гарбейдж коллектор. Зачем поверх стандартного что то ещё писать? --- Добавлено --- Намек простой - если собираешься намусорить -не спасет ни один гарбейдж коллектор
Что скажете вот про это раздел UDP http://www.java2s.com/Tutorial/Java/0320__Network/Catalog0320__Network.htm
А по маршрутизации что посоветуете. Я постучался на сервер. По идее нужно сохранить на сервере - соединение (in/scoket) или хост с портом где то в коллекции. Что можно было пользователю ответить.
Не тупи, первый байт команды -ид пользователя. Второй байт-сама команда. Третий байт и тд. -данные команды
Первый байт - этой ip нам нужен еще порт. Если мы сидим с одной подсети. http://cppjavabahslinux.blogspot.ru/2016/04/tcpip-udp.html
Лучше и проще по моему-через id пользователя. Первый раз как человек заходит в игру -ему присваивается однобайтовый id. Понятно что так можно написать читы, но для начала я бы этого не делал, пускай играют люди, может найдется прошаренный чувак который читы напишет но явно не скоро и не сразу
Понял: после регистрации у нас в бд появляется пользователь в строку которого мы пишем сроку сессии ip и порт на которые мы ему будем отвечать. А до того как он авторизовался должна быть какая то другая логика и ip и порт ответа всеравно нужно где то сохранять --- Добавлено --- Пока так потом детализирую и поправлю - есть над чем подумать --- Добавлено --- --- Добавлено --- Точу по онлайн рпг - тоесть под мультиплеер с 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): /* * jsock framework https://github.com/Padaboo/jsock open source * Each line should be prefixed with * */ package jsock.modules.jnet; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author padaboo I.B Aleksandrov jetananas@yandex.ru */ public class TCPReciver { /** * Run flag */ public static boolean isRunning = true; /** * server port */ private final short port; /** * pool size */ private final int poolSize; public TCPReciver(short port,int poolSize){ this.port = port; this.poolSize = poolSize; } /** * Create thread poll */ public void startPool(){ try { ServerSocket sock = new ServerSocket(port); ExecutorService executor = Executors.newFixedThreadPool(poolSize); while(isRunning){ Socket in = sock.accept(); executor.execute( new ReceiverThread(in) ); } } catch (IOException ex) { Logger.getLogger(TCPReciver.class.getName()).log(Level.SEVERE, null, ex); } } /** * Listen user sockets * send messages to message list * send connection to connection list */ class ReceiverThread implements Runnable{ /** * input data string */ String data = ""; //socket Socket sock; private ReceiverThread(Socket sock) { this.sock = sock; } @Override public void run() { try { InputStream inStream = sock.getInputStream(); Scanner scanner = new Scanner(inStream); while(scanner.hasNextLine()){ data += scanner.nextLine(); } System.out.println(data); } catch (IOException ex) { Logger.getLogger(ReceiverThread.class.getName()).log(Level.SEVERE, null, ex); } } } } --- Добавлено --- Много идеи именованные каналы очереди сообщений http://citforum.ru/operating_systems/linux_pg/lpg_02.shtml --- Добавлено --- Нашел интерфейс mysql для языка С http://www.mysql.ru/docs/pautov/c_api.htm --- Добавлено --- Разбирался с никсами потоками архитектурами нетом оптимизацией и сокетами в итоге купил книжку как программировать на С
тебе не кажется, что у тебя приход? На сях ты много времени потратишь на то же самое, что можно сделать на языке по-выше уровнем, и за меньшее время. Имеет ли это смысл? Зачем оптимизировать то, у чего пока нет вообще никакой нагрузки?
Да нет С это к слову он никсах и php: linux kernel https://github.com/torvalds/linux Сервер игры пишу на java. Почитал статей про игрыл и там все разделено на локации и инстансы - потому что если будет очень большое количество игроков - в одном месте которым, нужно с большой скоростью посылать пакеты об изменяющемся мире. Будут лаги. Посмотрел несколько фреймворков, игровых серверов, различных реализации. И пытаюсь сделать что то отказо устойчивое и неглючное и повторно используемое. --- Добавлено --- Пример: красные точки игроки, синие монстры. Одни игроки дерутся в pvp. Другие убивают босса. Третьи просто качаются. Четвертые сидят в городе. В этоге игрок должен знать об изменениях игрового мира только в пределах видимости. Не считая инстансов и пати. И чатов. если посылать изменения обо всем мире будут лаги значит нужно сделать какое то разделение. --- Добавлено --- Получается что то вроде чата с комнатами. + расчет расстояний Еще интересный момент логика монстра который с вершины трехэтажной башник пробегает несколько этажей и нападает на игрока находящегося на первом этаже. ( как он будет искать путь)