Страница 1 из 1

Синхронизация потоков Smartfox

СообщениеДобавлено: 20 апр 2018, 14:52
AlexStudenkov
Здравствуйте уважаемые форумчане.

В данный момент веду работу над небольшой онлайн стратегией. В качестве сервера был выбран smartfox. Столкнулся с такой проблемой: Когда несколько юнитов атакуют один, то у него может неправильно считаться здоровье. То есть из за того что они ударили одновременно, они одновременно получили доступ к объекту и одновременно отняли у текущего значения здоровья свой урон. Поэтому урон для юнита высчитывается только один раз. Я думаю, что нужно как-то синхронизировать потоки, но как сделать пока не понял.

Кто разрабатывал что-то на Smartfox подскажите пожалуйста, как это можно исправить.

Re: Синхронизация потоков Smartfox

СообщениеДобавлено: 20 апр 2018, 16:27
IDoNotExist
А зачем вы разносите логику взаимодействия юнитов по потокам? По ним нужно разносить тяжелые операции, наподобие поиска пути.
Но если уж на то пошло, сделай в объекте юнита защищённую очередь в которой складируй операции взаимодействия с ним из других потоков, а в основном потоке вынимай операции из очереди, и применяй к юниту.

Re: Синхронизация потоков Smartfox

СообщениеДобавлено: 20 апр 2018, 17:19
AlexStudenkov
Спасибо за ответ.

Специально я ничего не разношу. Для объектов юнитов я создаю объекты заданий которые наследуются от TimerTask. У них есть метод run. И при помощи таймера я задаю периодичность, с которой этот метод должен выполняться. Если принято делать по другому, опишите пожалуйста. Я просто другого варианта не нашёл. И к сожалению не знаю как создать очередь. Возможно описать немного подробнее?

Re: Синхронизация потоков Smartfox

СообщениеДобавлено: 20 апр 2018, 18:45
Shekn
Твой вопрос не по SmartFox-у, а по Java. IDoNotExist правильно сказал: чтобы не получать ошибки при доступе к данным и их модификации из разных потоков - надо либо использовать структуры данных, которые сами следят за очередностью доступа (гуглить по словам java и concurrency), либо блокировать данные самостоятельно, изменять их, а потом обратно разблокировать. Кстати, если несколько потоков создаются вручную, то здесь это не нужно. Вполне можно все периодические действия делать в одном потоке, просто перебирая в цикле объекты и вызывая у них по порядку метод run. За многопоточным доступом с необходимостью придётся следить, когда от клиентов будут приходить какие-то действия и сервер должен будет их обрабатывать. Эти запросы приходят асинхронно, поэтому и должно начинаться вот это вот всё.

Re: Синхронизация потоков Smartfox

СообщениеДобавлено: 20 апр 2018, 19:02
AlexStudenkov
А. Кажется понял. Мне не понравился этот вариант, потому что посчитал его слишком неоптимальным, ведь получается, что придётся каждый раз обходить все объекты независимо от того, делают они сейчас что-то или нет.