Здравствуйте, Went, Вы писали:
W>Здравствуйте, samius, Вы писали: S>>Если кому-то хватило ума засунуть координаты в пулю, то, конечно, в рамках функционального подхода придется клонировать пулю, что бы поменять координату. Но в рендеринге обычно ровно наоборот. Пуля/елка одна, а координат миллион. W>А можно чуточку конкретнее? В функциональном подходе пуля не хранит свои координаты? А кто их хранит? И при чем тут рендеринг?
Здесь дело не в функциональном подходе. Просто увидел упоминание рендеринга, а я с ним имел дело давным-давно. Безотносительно подхода речь лишь о здравом смысле. Если нужно нарисовать 1000000 елок или пуль, то при засовывании координаты внутрь объекта потребуется создать (и удалить потом) 1000000 объектов, которые будут отличаться лишь координатой, т.е. одним атрибутом. В ситуации, когда координату суют не в объект, то объект нужен лишь один.
W>Да, движение материальной точки в вакууме без посторонних тел отлично записывается простейшей функцией. Но, ведь, в реальном приложении все иначе. Говоря просто (опуская оптимизации) каждый кадр мы должны проверить коллизию каждой частицы с каждой. То есть каждый кадр мы запрашиваем положение каждой частицы, и в самом лобовом случае мы запрашиваем это положение (коллизию каждой частицы с каждой) квадрат количества частиц раз пополам. То есть каждый раз рассчитывать это положение явно избыточно, его проще просчитать один раз. Получается, нам нужен некоторый кэш на каждую подобную функцию? Но в императивный подход этот кэш встроен "из коробки" и никаких дополнительных функций хранить не нужно.
Если опустить оптимизации (типа предварительной проверки пересечения траекторий или сегментации сцены), то в ФП нет никакой проблемы построить коллекцию вычисленных координат для данного кадра и сделать проверку в рамках полученной коллекции координат.
S>>Повторюсь, если не запихивать координату в пулю/атом, то может оказаться что не нужно ее быстро-быстро менять. W>А куда их запихнуть?
Это зависит от задачи прежде всего. Для расчета тех же коллизий можно же не вписывать координату в объект, а наоборот, к вычисленной координате добавить ссылку на объект, либо находить объект по индексу координаты в массиве ссылок. Так процесс проверки координат на коллизии даст меньше промахов кэша при проверке всех со всеми (с большим кол-вом объектов), чем если в кэше будут большие объекты с маленькой координатой, которую надо проверить.
S>>Однако, моделирование столкновений частиц с помощью ООП (да и ФП, что говорить) — то еще садо-мазо и оверхед. Такие вещи делают на Си/Фортранах, объекты там обычно избыточны. W>Я сейчас не сравниваю ФП с ООП. Я сравниваю ФП с императивным программированием.
Рендеринг, как и моделирование физпроцессов — это категория числодробилок, т.е. чем больше размерность задачи и чем быстрее она выполнена — тем круче. На этом поле императивное программирование побеждает безоговорочно, т.к. позволяет деструктивные изменения, следовательно позволяет выбирать лучшую асимпотику для алгоритмов, дружелюбнее к железу. ФП по производительности результата в таких задачах сможет конкурировать лишь с топорными и неоптимизированными императивными решениями.