Как правильно написать программу по вычислению координат нескольких объектов в окне и выводу объектов на экран?
Хочу написать программу которая должна вычислять координаты нескольких объектов в окне и выводить объекты на экран. Сейчас я пытаюсь понять, как сделать это правильно. Я хочу сделать это так:
один класс рассчитывает все изменения координат всех объектов и других атрибутов.
второй класс запустить в ОТДЕЛЬНЫЙ поток. Он берёт готовые координаты объектов (и их атрибуты) и, не обращая внимания на первый поток перерисовывает экран с определённой частотой.
Мне кажется, что это логичная структура. Подскажите, стоит ли так делать. Или появятся проблемы. В таком случае, какой способ использовать для решения этой задачи?
Ответы (2 шт):
В целом подход правильный. Будет вопрос с синхронизацией - когда в момент отрисовки объект меняет свои координаты, или, хуже того, пропадает или появляется новый (вызывая перестроение коллекции). Тут или использовать какие-то способы синхронизации доступа (пока рисуем, не обновляем) или какую-нибудь двойную буферизацию (обновляем и откладываем результаты для отрисовки).
В вашем случае, может быть проще гарантировать неизменный массив объектов. Т.е. выделить вначале, например, 10000 элементов, отметить их все "выключенными". Далее обновлять объекты, добалять путем "включения" объекта, а удалять - "выключением". При таком подходе, вы можете стабильно рисовать из этого массива. В отрисовке просто пропускайте "выключенные" объекты. Даже если отрисовка совпадет по времени с обновлением, максимум, что вы получите - отрисовку объекта с несовпадающими компонентами (при частом обновлении и небольших дельтах, это будет незаметно).
Если у вас не слишком большое количество объектов, я бы не советовал использовать многопоточность. Только в крайнем случае, если у вас не получится оптимизировать отрисовку и лаги будут сохраняться, то имеет смысл попробовать.
В таком случае подумайте о использовании метода wait() у потока, чтобы синхронизировать изменения и отрисовку (чтобы отрисовка начиналась только после завершения цикла изменения).
Без многопоточности просто храните все объекты в каком-нибудь контейнере, в зависимости от структуры ( ArrayList<> — классика), пробегайтесь по нему, изменяя всё, что надо, потом вторым пробегом - отрисовка. Играясь с фпс можно уменьшить лаги.