Как правильно написать программу по вычислению координат нескольких объектов в окне и выводу объектов на экран?

Хочу написать программу которая должна вычислять координаты нескольких объектов в окне и выводить объекты на экран. Сейчас я пытаюсь понять, как сделать это правильно. Я хочу сделать это так:

  1. один класс рассчитывает все изменения координат всех объектов и других атрибутов.

  2. второй класс запустить в ОТДЕЛЬНЫЙ поток. Он берёт готовые координаты объектов (и их атрибуты) и, не обращая внимания на первый поток перерисовывает экран с определённой частотой.

Мне кажется, что это логичная структура. Подскажите, стоит ли так делать. Или появятся проблемы. В таком случае, какой способ использовать для решения этой задачи?


Ответы (2 шт):

Автор решения: Kromster

В целом подход правильный. Будет вопрос с синхронизацией - когда в момент отрисовки объект меняет свои координаты, или, хуже того, пропадает или появляется новый (вызывая перестроение коллекции). Тут или использовать какие-то способы синхронизации доступа (пока рисуем, не обновляем) или какую-нибудь двойную буферизацию (обновляем и откладываем результаты для отрисовки).

В вашем случае, может быть проще гарантировать неизменный массив объектов. Т.е. выделить вначале, например, 10000 элементов, отметить их все "выключенными". Далее обновлять объекты, добалять путем "включения" объекта, а удалять - "выключением". При таком подходе, вы можете стабильно рисовать из этого массива. В отрисовке просто пропускайте "выключенные" объекты. Даже если отрисовка совпадет по времени с обновлением, максимум, что вы получите - отрисовку объекта с несовпадающими компонентами (при частом обновлении и небольших дельтах, это будет незаметно).

→ Ссылка
Автор решения: Mark Tiukov

Если у вас не слишком большое количество объектов, я бы не советовал использовать многопоточность. Только в крайнем случае, если у вас не получится оптимизировать отрисовку и лаги будут сохраняться, то имеет смысл попробовать.

В таком случае подумайте о использовании метода wait() у потока, чтобы синхронизировать изменения и отрисовку (чтобы отрисовка начиналась только после завершения цикла изменения).

Без многопоточности просто храните все объекты в каком-нибудь контейнере, в зависимости от структуры ( ArrayList<> — классика), пробегайтесь по нему, изменяя всё, что надо, потом вторым пробегом - отрисовка. Играясь с фпс можно уменьшить лаги.

→ Ссылка