Pull to refresh

Comments 25

я не программист, но «потери» у локалхоста !? как так ???? я понимаю если там по Wi-F сигналы чем то заглушить можно но в самом то компьютере куда?
Это из — за рекурсии, производительность резко падает, а там уже происходят потери
эм… если я открою паинт и сделаю скриншот, вставлю в паинт, сделаю сного скриншот, вставлю этот новый скриншот с паинтом в паин, будет разница по производительности между отображением этой картинкой и картинкой с кошечками? сделаю ещё скриншот и анологично вставлю, то этот скриншот не будет ни чем не отличатся в принцепе от первоначального скриншота -> таже бмп-шка только в ней будет нарисова паин в паинте в паинте, на ресурсы компьютера чисто теоретически это не как не повлияет, или я чегото недопонимаю?…
Дело в том, что запустив одновременно Передатчик и одновременно Отправитель на одном компьютере ЦП компьютера очень сильно падает и из — за моего костыля происходят потери
значит всё таки дело не в рекурсии а в том что запушены сразу 2 приложения, а не одно как в случае когда отправитель на одном а получатель на другом… и серовно до меня не доходит, у вас такой слабый компьютер, что не может записывать и проигрывать?? эм… а сейчас точно 2012 год? или это норма когда Core 2 Duo 2.66 GHz, Nvidia GeForce 9600 GT не могут выполнять казалось бы простые вещи?
Угу, с учётом того, что там всё делается без прерываний + асинхронно, конечно загрузка будет 100%
Ага, ещё и как. А если делать много соединений по TCP, то в какой-то момент теряется SYN пакет и соединение устанавливается не за доли секунды, а за 3 секунды. Очень внезапно так выглядит.
Поменяйте на remote, а то вообще не понятно о чем.
Нда…
Receive_GetData и ConvertToTexture2D это нечто.

1. Преобразуем byte[] в Bitmap.
2. Сохраняем Bitmap в PNG.
3. Загружаем Texture2D из PNG.

… и всё это вместо одного вызова Texture2D.SetData().

Не за что :)

В конкретно этом случае (т.к. передаёте JPEG), лучше просто использовать Texture2D.FromStream().
Он вообще-то понимает и .jpg и .png.

А вообще лучший (из простых) вариант разбить всю картинку по сетке и передавать только изменившиеся куски.
А с некоторой задержкой (раз N секунд) передавать все.
Ну или (при двустороннем общении), по запросу клиента.
Оптимизирую программу и код в следующей статье. На счёт .jpg — у меня вылетают исключения при попытке его преобразовать в Texture2D
var texture = new Texture2D(g, 1366, 768);
texture.SetData(buffer);

И, пожалуйста, не надо больше статей.
Можно еще попробоват прикрутить технику прогрессивного джипега :) Чтобы при потери пакетов не было половины картинки. Так хоть будет одна часть плохая, а вторая нормальная.
//Ответ прост- UDP сообщение не может превысить размер в 65 507 байт.
Открою вам секрет, максимальный размер пакета TCP = 64k. Просто по тсп можно передавать несколько пакетов в одной сессии, но вы наверное об этом и не слышали?

Посмотрел профиль автора. Учитывая возраст, автор — молодец.
ахахаха, спасибо) Я учусь на своих ошибках
можно отнять (либо XOR) побайтово из полученной картинки предыдущую и сжать разность, в которой большая часть чисел будет равна 0 из за одинаковых пикселей что даст очень хорошую степень сжатия. на клиенте распаковать и добавить (либо XOR) к тому что есть. правда потеря пакета испортит картинку.
  • можно заюзать enet для .NET — reliable UDP. или другую имплементацию RUDP
  • говорили: можно передавать только изменения
  • не знаю как в XNA. кадры на sender-е можно забирать через DirectX — создать offscreen-поверхность и туда device.GetFrontBufferData(...). требует 2-5мс. Через HDC(Graphics) 20-50мс
PS. что-то не смог отредактировать то сообщение, добавлю ссылки так:
http://www.codeproject.com/Articles/274461/Very-fast-screen-capture-using-DirectX-in-Csharp
http://enet.bespin.org/

добавки:
бывает, что экран на 6 FullHD моников. экран можно бить на тайлы 512х512 и отправлять изменения только по изменившимся тайлам. на viewer-е обновлять и показывать текстуры тайлами
Можно кучу вещей сделать и изменить, но это всё будет в следующей статье.
int countMsg = bytes[0] - 1;
                    if (countMsg > 10)
                        throw new Exception("Потеря первого пакета");


Так делать не правильно, у вас нет никаких гарантий, что при потере хидера, в этом байте будет значение больше 10. Кстати, 10 это магическое число, его лучше убрать под осмысленную константу. Для проверки целостности кладите в хидер контрольную сумму пакета. И уберите падение с ошибкой, не пришел пакет — ждем следующего. В CutMsg мемори стрим излишен, вы расходуете лишнюю память. Оперируйте просто массивами. И используйте png вместо jpeg — он лучше подходит для отображения текстов.

UFO just landed and posted this here
Sign up to leave a comment.

Articles