Как стать автором
Обновить

Комментарии 23

Если вам это поможет в вашей деятельности, то могу предоставить исходные коды игры
Конечно! Хоть конкретно эту проблему я и решил, в будущем исходники могут очень пригодиться. Буду очень признателен, если скинете в личку ссылку.
Может на github их залить, а?
Жаль что этого не будет. Хотя древняя версия игры на продажи новой версии вряд ли повлияет.
Исходники xRay :) движка же выложили, а он поновее «Казаков»
К моему сожалению не видел ссылочку. Поделитесь ;)
Исходники X-Ray Engine официально на гитхабе, и даже Григорович дал «добро» использовать некоммерчески.
Ссылку выше дал.
Смотря какой источник )
Поддержу просьбу про гитхаб.
Гитхаб!
Спасибо вам большое!
Какой ад… Простите, не удержался. Снимаю шляпу перед отчаянными людьми, которые поддерживали этот код.
Да, по всему проекту около 250 ассемблерных вставок. Суровая оптимизация из 2000-ых. А ещё некоторые статические библиотеки ссылаются на канувшие в лету функции стандартных библиотек. Так, например, пришлось переписать отрывок в IChat/Chat/chatSocket.c и заменить в Peer.lib объект chatSocket.obj, чтобы убрать из линковки ссылку на устаревшую vsprintf() и хотя бы собрать этого динозавра в VS2015 :)
Вообще, с асм-вставки в реализации понятно. В 2000-ом году не было восьмиядерных компов. Но, с другой стороны, интерфейс-то тут тоже жутковат. Или это код, полученные реверс-инжениренгом?
НЛО прилетело и опубликовало эту надпись здесь
C исходными кодами это ведь уже совсей другой род деятельности! Другие позы, так сказать.
Т.е. проблема в том что в многопоточном приложении пренебрегли синхроназиацией при доступе к общим данным?
Всё указывает на это. Сложно сказать, где собака зарыта, т.к. DirectPlay сам по себе многопоточен, а помимо него используется и свой протокол на основе UDP. Может, мне просто «повезло» наткнуться на эту ошибку, т.к. в сети описание именно такого поведения я не нашёл.
Описанная в конце статьи функция определена в Mplayer.cpp:3106.

Тело функции
int PingSumm::CheckPlayer(DWORD DPID){
	for(int i=0;i<NPL;i++){
		if(PSET[i].DPID==DPID)return PSET[i].NPings;
	};
	return 0;
};

При этом, например, grep PSET | grep free показывает, что кроме деструктора этот регион памяти освобождается и в функции ClearPingInfo() в Mplayer.cpp:3124. Также есть и несколько вызовов realloc(). А какой-либо синхронизации я нигде не увидел…
Да, там много интересного можно увидеть. Вот, например, совершенно фантастическое:
		DWORD lp[6];
		lp[0]='PING';
Год-полтора назад я попытался поиграть с моим другом по интернету, но мы никак не могли соединиться. Выбирали прямое соединение по IP, но зачастую игру друга просто не было видно. А если видно, то не удается соединиться. Порты точно были открыты, поэтому все подозрения пали на то, что игра делалась еще для Win98 / Win2000, а у нас был Windows 7.
Сейчас еще подумал, что проблема могла быть в пиратской версии казаков.
Может, есть еще возможные причины?
Через Hamachi без проблем игралась на Win7 пару лет назад.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории