@Dima231

Как организовать параллельную обработку пересечения нескольких Rectangle в WPF?

Здравствуйте! Пытаюсь на C# сделать что-то типа игры Жизнь. У меня на Canvas бегают много клеток (Rectangle) и я столкнулся с парой проблем.
1. Хочу обработать их пересечения. На данный момент делаю так: когда появляется новая клетка она добавляется в список всех клеток и живет своей жизнью. Каждый раз когда какая-то клетка двигается она в цикле пробегается по этому списку и сравнивает свое положение с положением клетки из списка и если совпадают, то возникает событие их пересечения. И получается, что куча клеток постоянной бегает по этому списку и мне кажется, что это очень не оптимально. Может есть какой-то более оптимальный способ отследить их пересечения?
2. Если пересеклись Cell 1 и Cell 2, то события возникают в обоих объектах, т.е. два раза и хотелось бы обработать их одновременно, т.е. чтобы возникли не два события, а одно, что столкнулись две клетки. Но не могу придумать как это обработать. Ведь таких событий одновременно могут возникать десятки. Думаю, может нужен какой-то класс, который отслеживает эти пересечения и обрабатывает события, но это должно все быть одновременно.
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
а может plinq посмотрите?
в любом случае это осмысленно только при большом количестве ядер.. и тяжелой обработке события..
а еще стоит подумать о конкурентных событиях и риске одновременных противоречивых решений..
если событий всего десятки (а не миллионы), а обработка событий не требует тяжелых вычислений, вообще не факт что стоит заморачиватся

ps вариант избежать противоречий - своего рода покадровое вычисление поколения. матричная обработка следующей версии, потом замена текущей на новую. это гарантирует НЕпротиворечия в решении. ну и при необходимости уже можно смелее пробовать методы распараллеливания - на момет даже параллельной обработки, исходное поколение гарантированно неизменно. а вот при попытке параллельно обновлять по месту это скорее гарантия ошибочных решений
.. да еще и с непредсказуемой вероятностью )))

pps если не используете биндинг, можно логику обратного времени - копируем текущее поколение в фоновый массив/матрицу, далее используем вычисление следующего поколения на основе неизменных исходных данных.
.. и еще о производительности - на сколько я помню жизнь, у вас затраты на визуализацию все равно не соизмеримо больше обсчета ;)))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы