![]() |
![]() |
![]() |
#1 |
Матёрый пользователь
Регистрация: 18.02.2008
Сообщений: 8,751
Вы сказали Спасибо: 1,426
Поблагодарили 2,399 раз(а) в 1,349 сообщениях
![]() |
![]()
Блог Combine'а полугодовой давности, думаю, многие знают. http://www.railunion.net/blog/AlexanderG/1_b-56.html
И то, что там дело стало, все тоже знают. Хочу также сообщить, что у меня на данный момент дело тоже встало. Но на несколько другой ноте. Итак, просматривая который раз МСТСовский раздел о новых возможностях ленты, Вовчик подумал - а у нас-то почему не получается? Ведь "ленту" (т.е. прогу-чит, получающую информацию из определённых адресов памяти, как правило для ж-д симов) для ТРС ещё некто ИА-ИА пытался делать. Но у него не удалось организовать запись информации вовнутрь трс. Следующей была попытка Combine'a, но в его алгоритме почему-то не удалось достичь высоких скоростей передачи. Обсуждение подробно описано в вышеприведённом блоге, так что при задании вопросов настоятельно советую проверить наличие ответов там. Ну Вовчик и решил написать прогу, в дальней перспективе делающую то же самое, что прога Combine'а, т.е. обеспечивающую связь клиентского/серверного приложения с ТРС через некие адреса памяти. Аналогов в сети довольно много, алгоритм обнаружения всех страниц памяти был скопирован на одном из программистских форумов (и затем немного подправлен), а затем алгоритм поиска всех имеющихся строк с заданным содержимым. Так как Вовчик на тот момент забыл ассемблер почти полностью, оставил эту часть кода на Си. Поэтому сканирование 600Мб виртуальной памяти (всего 512 Мб ОЗУ ![]() В результате 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
__________________
местный зомбяк |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|
|
![]() Что это? |