Всем привет. Я тут делал передачу объектов в комнате, у меня всё получилось, но вот проблема: Карта передаётся очень долго. Каким способом нужно передавать карту, что-бы передача шла быстрее? Вот мой способ:
Принимаем var blc,xx,yy; blc = readushort(); xx=readshort(); yy=readshort(); if blc = 1 {instance_create(xx,yy,obj_bl_Grass)} if blc = 2 {instance_create(xx,yy,obj_bl_Dirt)} if blc = 3 {instance_create(xx,yy,obj_bl_Stone)}
P.s Код я просто весь скопировал и вставил написал небольшие коментарии. P.s.s Можно Уменьшить время вызова таймера, и тогда карта пойдёт быстрее, но вот у друга интернет не очень хороший, и принят скорее всего он всё не сможет.
Добавлено (23.02.2014, 20:47) --------------------------------------------- Приходится поднимать тему...
И вот опять мой вопрос:
Цитатаmaksim1221232 ()
Каким способом нужно передавать карту, что-бы передача шла быстрее?
Сообщение отредактировал maksim1221232 - Воскресенье, 23 Февраля 2014, 20:43
Когда подключается игрок, в сервере запускается цикл который проверяет каждую позицию комнаты. Переходит к новой позиции через 12 шагов, а комната большая и проверяет долго
Тебе нужно загружать карту лишь один раз и отслеживать изменения в уже загруженной карте, ты, видимо, проверяешь все обьекты каждый шаг, вот она и грузится долго
maksim1221232, как вариант, можно сделать так: 1)Записываешь всю карту в ini файл и на протяжение всей игры дополняешь/удаляешь.(я думаю, что у тебя и так мир в ini хранится, если только он не генерируется каждый раз новый) 2)При присоединение клиента, отправляешь ему этот файл(у меня быстро файлы передаются) 3)Получив этот ini файл, клиент создает такой же мир.
Сообщение отредактировал zzzzza - Понедельник, 24 Февраля 2014, 19:24
maksim1221232, я имел ввиду не с моего компьютера на мой же компьютер, а с другого на мой. То что у тебя передается не всегда - это, возможно, недоработка 39DLL. Я использую Faucet Networking и тебе советую(новее, то есть убраны недочеты 39DLL и обновляется).
У меня появилась такая идея: У меня в комнате есть ряды одинаковых объектов. Как сделать скрипт который считает сколько в ряду ОДИНАКОВЫХ объектов записывает их в переменную и отправляет её. А клиент принимает и создаёт в ряд количество объектов которые пришли? Если в например было 5 одинаковых объектов и вдруг попался другой то скрипт перестаёт считатьи отправляет.
maksim1221232, мне кажется, что это не лучший способ: тебе нужно записать координаты всех этих блоков в переменную типа "string", а клиент должен принять и через цикл доставать "x-сы" и "y-ки", и может быть не один цикл, так как передаваться может максимум 255 символов за 1 раз. Ну короче, это слишком геморно.
Сообщение отредактировал zzzzza - Вторник, 25 Февраля 2014, 21:07
maksim1221232, тебе нужно отправить название этого блока, с какой координаты начинать создание, количество таких блоков - ну это фигня, обычный пакет данных. Зная, что такое minecraft и сколько там блоков, тебе придется перебрать циклом ВСЮ карту и все это передать. Хотя мне пришел в голову самый оптимальный, как я думаю, вариант передачи координат каждого объекта в комнате c 1-им циклом отправки и 2-мя циклами принятия(хотя я бы использовал мой первый вариант с файлом). Буду писать, как в FN, так как 39DLL не особо хорошо помню. Сервер. Create.
Код
globalvar obj; obj[1]='obj_1'; obj[2]='obj_2'; k=2; //количество элементов массива.
Сервер. Когда клиент присоединился(можно и без цикла, но тогда придется в ручную вписывать в код with с каждым объектом и все, что в create можно удалить):
Код
var i; write_ubyte(client,0); write_ubyte(client,k); //Если блоков больше 255, то write_ushort и т.д. for(i=1;i<=k;i+=1) { in=instance_number(obj[i]); write_ubyte(client,in); with (obj[i]) { write_ubyte(client,string_length(obj[i])); //В FN в read_string нужно указывать сколько символов нужно принять. write_string(client,obj[i]); write_ushort(client,x); write_ushort(client,y); } }
Клиент. Принятие 0 байта(так же можно без одного цикла, но придется прописывать все в ручную):
Все очень просто, на самом деле. У тебя есть определенный набор объектов на карте. Для каждого из этих объектов(либо с наворотами, если у них есть общий родитель) в отправителе создаешь примерно такую конструкцию:
Код
39dll_buffer_clear(0); 39dll_write_byte(pack_id, 0); //идентификатор типа пакета
39dll_write_short(instance_number(some_object), 0); - количество передаваемых объектов нашего типа with(some_object) { 39dll_write_short(some_object.x, 0); 39dll_write_short(some_object.y, 0); }
И так для всех объектов. Само собой предполагается что карта - это текущая комната в передающем окне, со всеми инициализированными объектами. Ну а как реализовать часть для приемника, думаю, догадаешься сам эту конструкцию я реализовывал в своем проекте и проверял с несколькими тысячами объектов, передача карты не занимала больше пары секунд, даже с учетом времени ее построения на клиенте. Ghaarp
Да, но объектов у меня очень много, и все 1200 объектов одновременно отправят свои координаты, и что получится?
Добавлено (28.02.2014, 14:59) --------------------------------------------- Мне нужно написать цикл который делает так: Если в координате 0 и 0 объект obj1 создаём переменную objnumb=1 если в координате 32 и 0 объект obj1 то прибавляет к objnumb+=1 если в координате 64 и 0 объект obj1 то прибавляет к objnumb+=1 и т.д И если например в координатах 256 и 64 не попался obj1, то ничего не прибавляем а отправляем переменную objnumb и координаты которые были когда objnumb был 0
А клиент принимает, и с координат который пришли от сервера ставит определённые объекты.
Мне нужно написать цикл который делает так: Если в координате 0 и 0 объект obj1 создаём переменную objnumb=1 если в координате 32 и 0 объект obj1 то прибавляет к objnumb+=1 если в координате 64 и 0 объект obj1 то прибавляет к objnumb+=1 и т.д И если например в координатах 256 и 64 не попался obj1, то ничего не прибавляем а отправляем переменную objnumb и координаты которые были когда objnumb был 0
А клиент принимает, и с координат который пришли от сервера ставит определённые объекты.
Ты складываешь все в одну кучу. Как ты это вообще потом разбираешь на стороне клиента?
По моему способу, ты просто отправляешь координаты всех объектов комнаты, такой пакет имеет крайне простую и прозрачную структуру, и не нужно никаких хитрых проходов по сеткам. Ghaarp
Не знаю, возможно ты просто неправильно запрогал? Я честно в твой код не вникал, а написал свой алгоритм, проще которого придумать врядли возможно, который работал у меня без каких либо проблем в том числе с мобильным и любым другим интернетом. Пакет не может прийти неполностью, ты его мог только неправильно сформировать\прочитать. И TCP и UDP стандарты следят за целостностью пакетов. Ghaarp