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

Сеть в Unity3D

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

Сообщение AlexStudenkov 20 апр 2018, 14:52

Здравствуйте уважаемые форумчане.

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

Кто разрабатывал что-то на Smartfox подскажите пожалуйста, как это можно исправить.
AlexStudenkov
UNец
 
Сообщения: 3
Зарегистрирован: 20 апр 2018, 14:36

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

Сообщение IDoNotExist 20 апр 2018, 16:27

А зачем вы разносите логику взаимодействия юнитов по потокам? По ним нужно разносить тяжелые операции, наподобие поиска пути.
Но если уж на то пошло, сделай в объекте юнита защищённую очередь в которой складируй операции взаимодействия с ним из других потоков, а в основном потоке вынимай операции из очереди, и применяй к юниту.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

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

Сообщение AlexStudenkov 20 апр 2018, 17:19

Спасибо за ответ.

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

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

Сообщение Shekn 20 апр 2018, 18:45

Твой вопрос не по SmartFox-у, а по Java. IDoNotExist правильно сказал: чтобы не получать ошибки при доступе к данным и их модификации из разных потоков - надо либо использовать структуры данных, которые сами следят за очередностью доступа (гуглить по словам java и concurrency), либо блокировать данные самостоятельно, изменять их, а потом обратно разблокировать. Кстати, если несколько потоков создаются вручную, то здесь это не нужно. Вполне можно все периодические действия делать в одном потоке, просто перебирая в цикле объекты и вызывая у них по порядку метод run. За многопоточным доступом с необходимостью придётся следить, когда от клиентов будут приходить какие-то действия и сервер должен будет их обрабатывать. Эти запросы приходят асинхронно, поэтому и должно начинаться вот это вот всё.
https://tugcga.github.io/
Аватара пользователя
Shekn
UNIт
 
Сообщения: 95
Зарегистрирован: 05 фев 2016, 14:20

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

Сообщение AlexStudenkov 20 апр 2018, 19:02

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


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1