Четверг, 25 Апреля 2024, 06:48

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » 39DLL - Передача объектов в комнате (Передача карты.)
39DLL - Передача объектов в комнате
Quad69Дата: Воскресенье, 23 Февраля 2014, 20:47 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Всем привет.
Я тут делал передачу объектов в комнате, у меня всё получилось, но вот проблема: Карта передаётся очень долго.
Каким способом нужно передавать карту, что-бы передача шла быстрее?
Вот мой способ:


P.s Код я просто весь скопировал и вставил написал небольшие коментарии.
P.s.s Можно Уменьшить время вызова таймера, и тогда карта пойдёт быстрее, но вот у друга интернет не очень хороший, и принят скорее всего он всё не сможет.

Добавлено (23.02.2014, 20:47)
---------------------------------------------
Приходится поднимать тему...

И вот опять мой вопрос:

Цитата maksim1221232 ()
Каким способом нужно передавать карту, что-бы передача шла быстрее?


Сообщение отредактировал maksim1221232 - Воскресенье, 23 Февраля 2014, 20:43
zzzzzaДата: Воскресенье, 23 Февраля 2014, 22:38 | Сообщение # 2
участник
Сейчас нет на сайте
maksim1221232, карта постоянно передается или только один раз, когда присоединяется игрок?
Quad69Дата: Понедельник, 24 Февраля 2014, 14:44 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
Когда подключается игрок, в сервере запускается цикл который проверяет каждую позицию комнаты. Переходит к новой позиции через 12 шагов, а комната большая и проверяет долго
HSPДата: Понедельник, 24 Февраля 2014, 16:00 | Сообщение # 4
почетный гость
Сейчас нет на сайте
Тебе нужно загружать карту лишь один раз и отслеживать изменения в уже загруженной карте, ты, видимо, проверяешь все обьекты каждый шаг, вот она и грузится долго
zzzzzaДата: Понедельник, 24 Февраля 2014, 19:23 | Сообщение # 5
участник
Сейчас нет на сайте
maksim1221232, как вариант, можно сделать так:
1)Записываешь всю карту в ini файл и на протяжение всей игры дополняешь/удаляешь.(я думаю, что у тебя и так мир в ini хранится, если только он не генерируется каждый раз новый)
2)При присоединение клиента, отправляешь ему этот файл(у меня быстро файлы передаются)
3)Получив этот ini файл, клиент создает такой же мир.


Сообщение отредактировал zzzzza - Понедельник, 24 Февраля 2014, 19:24
Quad69Дата: Понедельник, 24 Февраля 2014, 20:00 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Цитата zzzzza ()
я думаю, что у тебя и так мир в ini хранится, если только он не генерируется каждый раз новый

Генерируется новый.

Записывать все объекты в файл это конечно хорошо, но друзьям он передаётся долго.(Иногда не передаётся вообще)

Цитата zzzzza ()
(у меня быстро файлы передаются)

Это у тебя. А если передавать кому по интернету, по ничего не передадится.
HSPДата: Понедельник, 24 Февраля 2014, 20:08 | Сообщение # 7
почетный гость
Сейчас нет на сайте
maksim1221232, передавай карту один раз и в следующий раз уже передавай не всю карту, а лишь тот обьект, который изменился каким-либо образом
Quad69Дата: Понедельник, 24 Февраля 2014, 23:20 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
Так не получится. У меня при каждом новом запуске сервера мир новый.
zzzzzaДата: Вторник, 25 Февраля 2014, 15:57 | Сообщение # 9
участник
Сейчас нет на сайте
maksim1221232, я имел ввиду не с моего компьютера на мой же компьютер, а с другого на мой.
То что у тебя передается не всегда - это, возможно, недоработка 39DLL. Я использую Faucet Networking и тебе советую(новее, то есть убраны недочеты 39DLL и обновляется).
Quad69Дата: Вторник, 25 Февраля 2014, 15:59 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
У меня появилась такая идея:
У меня в комнате есть ряды одинаковых объектов. Как сделать скрипт который считает сколько в ряду ОДИНАКОВЫХ объектов записывает их в переменную и отправляет её. А клиент принимает и создаёт в ряд количество объектов которые пришли? Если в например было 5 одинаковых объектов и вдруг попался другой то скрипт перестаёт считатьи отправляет.
zzzzzaДата: Вторник, 25 Февраля 2014, 21:00 | Сообщение # 11
участник
Сейчас нет на сайте
maksim1221232, мне кажется, что это не лучший способ: тебе нужно записать координаты всех этих блоков в переменную типа "string", а клиент должен принять и через цикл доставать "x-сы" и "y-ки", и может быть не один цикл, так как передаваться может максимум 255 символов за 1 раз. Ну короче, это слишком геморно.

Сообщение отредактировал zzzzza - Вторник, 25 Февраля 2014, 21:07
Quad69Дата: Среда, 26 Февраля 2014, 16:00 | Сообщение # 12
заслуженный участник
Сейчас нет на сайте
Почему?
Можно создать переменную например blc и записывать число повторяемых блоков и потом отправить
zzzzzaДата: Среда, 26 Февраля 2014, 20:21 | Сообщение # 13
участник
Сейчас нет на сайте
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 байта(так же можно без одного цикла, но придется прописывать все в ручную):
Код

k=read_ubyte(server); //read_ushort и т.д.
for(i=1;i<=k;i+=1)
   {
    in=read_ubyte(server);
    for(j=1;j<=in;j+=1)
     {
      str_l=read_ubyte(server);
      str=read_string(server,str_l);
      xx=read_short(server);
      yy=read_ushort(server);
      instance_create(xx,yy,str);
     }
   }

Вроде ничего не упустил.


Сообщение отредактировал zzzzza - Среда, 26 Февраля 2014, 20:22
XDominatorДата: Пятница, 28 Февраля 2014, 14:37 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
Все очень просто, на самом деле. У тебя есть определенный набор объектов на карте. Для каждого из этих объектов(либо с наворотами, если у них есть общий родитель) в отправителе создаешь примерно такую конструкцию:

Код

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);
}

39dll_write_short(instance_number(some_object_2), 0);
with(some_object_2)
{
   39dll_write_short(some_object_2.x, 0);
   39dll_write_short(some_object_2.y, 0);
}

...



И так для всех объектов. Само собой предполагается что карта - это текущая комната в передающем окне, со всеми инициализированными объектами. Ну а как реализовать часть для приемника, думаю, догадаешься сам smile эту конструкцию я реализовывал в своем проекте и проверял с несколькими тысячами объектов, передача карты не занимала больше пары секунд, даже с учетом времени ее построения на клиенте.


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Пятница, 28 Февраля 2014, 14:39
Quad69Дата: Пятница, 28 Февраля 2014, 14:59 | Сообщение # 15
заслуженный участник
Сейчас нет на сайте
Да, но объектов у меня очень много, и все 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

А клиент принимает, и с координат который пришли от сервера ставит определённые объекты.

XDominatorДата: Пятница, 28 Февраля 2014, 15:04 | Сообщение # 16
постоянный участник
Сейчас нет на сайте
У тебя не сами объекты отправляют координаты. Ты формируешь единый пакет вида

кол-во объектов:
x
y
x
y
x
y

кол-во объектов
x
y
x
y
x
y

...

dll39_buffer_send();

таким образом от сервера уходит 1 пакет размером 1200*4 байт, или, иначе, чуть больше 4кб.

Добавлено (28.02.2014, 15:04)
---------------------------------------------
Цитата maksim1221232 ()
Мне нужно написать цикл который делает так:
Если в координате 0 и 0 объект obj1 создаём переменную objnumb=1
если в координате 32 и 0 объект obj1 то прибавляет к objnumb+=1
если в координате 64 и 0 объект obj1 то прибавляет к objnumb+=1
и т.д
И если например в координатах 256 и 64 не попался obj1, то ничего не прибавляем а отправляем переменную objnumb и координаты которые были когда objnumb был 0

А клиент принимает, и с координат который пришли от сервера ставит определённые объекты.


Ты складываешь все в одну кучу. Как ты это вообще потом разбираешь на стороне клиента?

По моему способу, ты просто отправляешь координаты всех объектов комнаты, такой пакет имеет крайне простую и прозрачную структуру, и не нужно никаких хитрых проходов по сеткам.


Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)


Сообщение отредактировал XDominator - Пятница, 28 Февраля 2014, 15:05
Quad69Дата: Пятница, 28 Февраля 2014, 15:05 | Сообщение # 17
заслуженный участник
Сейчас нет на сайте
И сколько этот пакет будет передаваться через интернет если у меня скорость примерно 7 МБ а у друга не больше 110 КБ
XDominatorДата: Пятница, 28 Февраля 2014, 15:07 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
4/110 = 0.03 сек smile

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
Quad69Дата: Пятница, 28 Февраля 2014, 15:08 | Сообщение # 19
заслуженный участник
Сейчас нет на сайте
А почему когда я хотел передать файл(карта) весом 40КБ у него пришло только от 2 до 12 символов из 700?
XDominatorДата: Пятница, 28 Февраля 2014, 15:16 | Сообщение # 20
постоянный участник
Сейчас нет на сайте
Не знаю, возможно ты просто неправильно запрогал? Я честно в твой код не вникал, а написал свой алгоритм, проще которого придумать врядли возможно, который работал у меня без каких либо проблем в том числе с мобильным и любым другим интернетом. Пакет не может прийти неполностью, ты его мог только неправильно сформировать\прочитать. И TCP и UDP стандарты следят за целостностью пакетов.

Ghaarp

The soul lighter(Android, logic)

Zzzzombie RAGE!!!(For android)
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » 39DLL - Передача объектов в комнате (Передача карты.)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг