Показать сообщение отдельно
Старый 15.05.2010, 00:06   #1
TRam_
Матёрый пользователь
 
Аватар для TRam_
 
Регистрация: 18.02.2008
Сообщений: 8,713
Вы сказали Спасибо: 1,424
Поблагодарили 2,374 раз(а) в 1,327 сообщениях
TRam_ стоит на развилке (репутация по умолчанию)
По умолчанию Вопросы, касающиеся создания мультиплеера с синхронизацией поездов

Блог Combine'а полугодовой давности, думаю, многие знают. http://www.railunion.net/blog/AlexanderG/1_b-56.html

И то, что там дело стало, все тоже знают. Хочу также сообщить, что у меня на данный момент дело тоже встало. Но на несколько другой ноте.

Итак, просматривая который раз МСТСовский раздел о новых возможностях ленты, Вовчик подумал - а у нас-то почему не получается?

Ведь "ленту" (т.е. прогу-чит, получающую информацию из определённых адресов памяти, как правило для ж-д симов) для ТРС ещё некто ИА-ИА пытался делать. Но у него не удалось организовать запись информации вовнутрь трс.

Следующей была попытка Combine'a, но в его алгоритме почему-то не удалось достичь высоких скоростей передачи. Обсуждение подробно описано в вышеприведённом блоге, так что при задании вопросов настоятельно советую проверить наличие ответов там.

Ну Вовчик и решил написать прогу, в дальней перспективе делающую то же самое, что прога Combine'а, т.е. обеспечивающую связь клиентского/серверного приложения с ТРС через некие адреса памяти. Аналогов в сети довольно много, алгоритм обнаружения всех страниц памяти был скопирован на одном из программистских форумов (и затем немного подправлен), а затем алгоритм поиска всех имеющихся строк с заданным содержимым. Так как Вовчик на тот момент забыл ассемблер почти полностью, оставил эту часть кода на Си. Поэтому сканирование 600Мб виртуальной памяти (всего 512 Мб ОЗУ ) для поиска 29-знаковой строки "49994999499949994999499949994" проходило где-то минуты 1-2.

В результате 10 мая была получена прога, получающая адреса переменных, совпадающие с именами из найденных куда более совершенной прогой ArtMoney


Затем Вовчик принялся за главное - сделал интерфейс между трс и прогой. Для этого в ТРС, после запуска сессии со специальным вагоном в одном из поездов, скриптом этого вагона создавались 2 строки, с тем самым содержимым ("499949...949994"). Затем по нажатию кнопки пользователем начиналось сканирование памяти на наличие этих строк. В результате получался массив из 2-36 адресов, среди которых 2 были вагона. Процесс продолжался от 40 до 90 секунд, ИМХО из-за кривизны рук Вовчика и неиспользования ассемблера.

Далее нажатие по одной из ссылок "в свойствах"(в браузере view detailes), благодаря которому обе подчинённые вагону строки изменяли 5й символ. Одна из них - на "I", другая - на "O" (input-output), причём оба понятия относятся к ТРС, а не к проге. Далее нажималась кнопка в проге, обработка нажатия которой находила эти самые нужные буквы, и сохраняла адреса этих двух строк. В результате мы получили то же самое, что создатели лентописцев в МСТС - нашли нужные нам отверстия для управления игрой.

А далее Вовчик подсоединил строку "output" из трс к генератору случайных чисел (внутри скрипта), а в проге - закоротил выход и вход (правда, там предварительный сдвиг фаз делается )

Поиск новых значений организован в ТРС на двух thread'ах, в проге - на одном таймере. Алгоритм подтверждения работает примерно так (показано начало строки, * - любые символы)

для строки output

400***** - скрипту вагона разрешено писать; если прога увидела в 3 символе '0', то чтения не делает

Когда вагон дописывает строку до конца, он меняет 3 символ на 'W', и получается строка

40W**** - здесь W означает не "запись", а "запись закончилась"; если прога нашла такой символ, то она считывает строку, по окончании меняя W обратно на 0. Скрипт ничего при этом не пишет.

для строки input - аналогично

400***** - проге запрещено писать, скрипт строку ещё считывает (потом меняет на R)
4R0**** - прога пишет, скрипт ничего не читает


В результате 14 мая почти ровно в 18-00 эта конструкция успешно заработала. Затем длина кодируемых строк была увеличена до 2001 символа, и было проведено несколько тестов на акелловской 2009, на карте tidewater, где были проложены комбайновские рельсы.

Перед одним из тестов


В проге перед этим сделал дополнительный таймер, чтоб считал число переданных строк в секунду. Эти числа (левое - для отданных трсом, правое - для полученных трсом данных) видно на скрине. Заметте,

7 строк по 2001 символу по 1 байту в секунду = 7 строк по 2001 символу по 8 бит в секунду ~ 110 кБит/секунду. В обе стороны. Одновременно. Для мульта хватит? Мне кажется что да. Учитывая что Conter-Strike требует около 16-32 кБит/секунду.

Хотя конечно процессе игры производительность падала, но, замечу, число переданных строк в секунду никогда не было меньше 3 (40-50кБит/с) в обе стороны (несмотря на fps 3 на некоторых участках (а вообще 6-10), как-никак комп одноядерка на 2ГГц и памяти 512 Мб)

Ну и оставлю я этот вариант опенсорс (под visual studio 8) + вагон со скриптом. Думаю, другим авторам паровозных примочек к компу и мультиплееров для изучения подойдёт, хотя пока это прога "г* на палочке с хвостиком".
http://ifolder.ru/17712909
__________________
местный зомбяк
TRam_ вне форума   Ответить с цитированием
Старый 01.01.2007, 12:00  
Яndex
Спонсор
 
 
Регистрация: 01.01.2007
Сообщения: 500


Реклама показывается изредка по случайному принципу
По умолчанию РЕКЛАМА