Суббота, 23 Ноября 2024, 13:47

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Сжатие массива байтов и оптимизация синхронизации
robertonoДата: Суббота, 21 Июня 2014, 02:02 | Сообщение # 1
Чокнутый Кот
Сейчас нет на сайте
Как сжать массив байтов?
На моем любимом сайте по C# программированию я нашел сжатие байтов
http://www.dotnetperls.com/compress
после того как я это попробовал это сделать оказалось что в юнитевском MonoDevelop C# языке нету такой штуки!
А мне это очень надо..
http://forum.unity3d.com/threads....s.33973
Здесь, да и не только здесь люди столкнулись с такой же проблемой.
Может есть другой способ как сжать байты?
Нет, я не могу сжимать в .zip файл!
Я хочу сжимать байты, что бы сильно не нагружать трафик передаваемый на сервер (и обратно клиенту).

У меня на сцене нужно синхронизировать много объектов у всех одинаково, поэтому один клиент может передавать до 50 - 100 новых позиций.
Как это дело можно оптимизировать? Просто блоки, когда они разлетаются после взрыва клиент, который сделал взрыв передает каждую новую координату блока (с определенным временем, стандартная задержка между передачей пакетов передвижения (не помню сколько милисекунд) ). Это передается на сервер и за тем пересылается всем игрокам.
Как это оптимизировать? Это и так передается с протоколом без гарантированной доставки, это отправляется вроде как одним пакетом (один тяжелый пакет новых координат). Нельзя отправлять каждую новую координату отдельным пакетом (пробовал, результаты были плачевными - сервер крашился из за того что очень много пакетов в очереди).

Я использую Photon Server.

Может есть у кого идеи по оптимизации?
allodsДата: Суббота, 21 Июня 2014, 06:35 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
по идеи, если будет взрыв то у всех игроков кубы разлетятся одинаково , если взрыв будет у всех в одной и той же точке, ведь у всех одинаковая физика. Ты просто синхронизируешь сам взрыв , а если есть взаимодействие с игроком то синхронизируешь уже куб .
falcowareДата: Суббота, 21 Июня 2014, 07:17 | Сообщение # 3
старожил
Сейчас нет на сайте
robertono, ты можешь пропустить простую оптимизацию.

Такую как:
1. Ищем повтряющиеся байты.
2. Заменяем цепочку на специальный байт, сам байт и количество их.

Уловил принцип? surprised
systemДата: Суббота, 21 Июня 2014, 10:31 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
По-моему, синхронизировать абсолютно все это безсмысленная трата ресурсов. Ищи те элементы которые без синхронизации не обойдтся, а остальное оставляй клиенту. Даже тот же взрыв не обязательно чтобы он выглядел одинаково на всех подключенных клиентах. Достаточно чтобы он произошел, а вот координаты физических обьектов разлетающихся от взрыва уже передаются пакетами. Насчет сжатия ничего не скажу...
robertonoДата: Суббота, 21 Июня 2014, 12:07 | Сообщение # 5
Чокнутый Кот
Сейчас нет на сайте
falcoware, это же просто принцип работы самого простого сжатия. Только вот я не знаю как технически это реализовать
seamanДата: Суббота, 21 Июня 2014, 13:31 | Сообщение # 6
старожил
Сейчас нет на сайте
Используем сторонние библиотеки:
http://dotnetzip.codeplex.com/
Или прямо из моно:
ICSharpCode.SharpZipLib
robertonoДата: Суббота, 21 Июня 2014, 21:09 | Сообщение # 7
Чокнутый Кот
Сейчас нет на сайте
seaman, ониж ведь тупо сожмут это в .zip файл. А мне нужно отправить байты на сервер. Мне архив что ли как байты передавать? Это тоже самое?
Типо GZipStream это тоже самое что и .zip сжатие, только без сохранения и придачи формата?

system, не очень понял вас. Принцип такой же как и у allods ?

allods, оо спасибо! Это действительно очень хорошее решение. Я уже продумал новую систему синхронизации разрушения. Чуть улучшил твою идею и получилось идеальное решение) Пойду писать)
Не знаю чего я раньше не додумался, мне не хватало зацепки за идею. Спасибо smile

Может кто ещё чего может предложить или улучшить вариант allods ?
systemДата: Суббота, 21 Июня 2014, 22:17 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
Цитата robertono ()
system, не очень понял вас. Принцип такой же как и у allods ?

я имел в виду что если взрыв у тебя рандомный, т.е. каждый раз физическая модель его разная, то не обязательно все показатели взрыва чтобы совпали... главное чтобы передались пакеты с инфой о координатах физ. обьектов
robertonoДата: Суббота, 21 Июня 2014, 22:22 | Сообщение # 9
Чокнутый Кот
Сейчас нет на сайте
Цитата system ()
главное чтобы передались пакеты с инфой о координатах физ. обьектов

И в чем заключается оптимизация? У меня сейчас так и есть. Я передаю все новые координаты блоков разлетевшихся от взрыва.
Вот эти пакеты новых координат и портят всё. allods уже решил проблему, но хотелось бы услышать её улучшение (если мало ли у кого то есть идеи).
seamanДата: Воскресенье, 22 Июня 2014, 17:02 | Сообщение # 10
старожил
Сейчас нет на сайте
Цитата
ониж ведь тупо сожмут это в .zip файл

Эта библиотека может сжимать в поток (MemoryStream). А как уж ты потом его используешь - запишешь в файл, или пошлеш по сети - твое дело.
SaiteiДата: Воскресенье, 22 Июня 2014, 17:23 | Сообщение # 11
старожил
Сейчас нет на сайте
Алгоритм Хаффмана?
robertonoДата: Воскресенье, 22 Июня 2014, 19:38 | Сообщение # 12
Чокнутый Кот
Сейчас нет на сайте
seaman, ну тогда спасибо, я так и думал что наверно там в поток сначала, но не решался попробовать)

Добавлено (22.06.2014, 19:38)
---------------------------------------------
Saitei, а есть готовая библиотека для сжатия байтов где используется этот алгоритм?

Storm54Дата: Воскресенье, 22 Июня 2014, 19:49 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
Photon Server не крашится, даже если отправить пару гигабайт. Не понимаю, как ты довел его до такого.

Сообщение отредактировал Storm54 - Воскресенье, 22 Июня 2014, 19:49
robertonoДата: Воскресенье, 22 Июня 2014, 20:38 | Сообщение # 14
Чокнутый Кот
Сейчас нет на сайте
Storm54, дело было не в размере) Просто было очень (очень) много пакетов. И вроде в информации о краше было написано что то про очередь и пакеты, не помню уже. Это давно было, больше я такого не встречал) Но уже тогда я понял что система синхронизации, то что у меня стоит сейчас, полная хрень) Вот я и полез на форум для решения.
SaiteiДата: Воскресенье, 22 Июня 2014, 22:52 | Сообщение # 15
старожил
Сейчас нет на сайте
robertono, такие библиотеки однозначно есть, но лично я не могу ничего посоветовать :(
Вообще ты можешь глянуть видеоурок и код перевести на С#... Но если не хочешь париться, можно порыскать по msdn - я уверен, что дяди из Microsoft всё уже реализовали для пересылки сетевых пакетов :)
Успехов!

Добавлено (22.06.2014, 22:52)
---------------------------------------------
robertono, а вообще вот ещё инфа

  • Страница 1 из 1
  • 1
Поиск:

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