Можно ли использовать функцию `рендеринг` для ускорения рендеринга?

Я разрабатываю умеренно сложную часть в OpenSCAD.

Он достаточно быстро рендерится в режиме предварительного просмотра (1 с). Но когда я делаю полный рендеринг, чтобы экспортировать его в STL, это занимает целую вечность (в течение 10 минут).

Я читал, что иногда функция рендеринга полезна для ускорения общего рендеринга.

  • Это правильно, или я неправильно понял?
    • Если я неправильно понял, для чего полезна функция рендеринга?
  • Как это работает?
  • В каких обстоятельствах я могу его применить?

, 👍7

Обсуждение

Какой процессорный чип находится в вашем компьютере? Как вы думаете, почему именно эти функции (объединение, различие) являются проблемой? Есть ли причина, по которой вы не можете завершить логические значения в один объект перед рендерингом?, @Carl Witthoft

Что значит "объединить логические значения в один объект"? (Я вроде как подумал, что рендеринг может быть командой для этого, если это то, что я думаю) PC Proc-это Core2 Duo E6750 2,66 ГГц на одном компьютере и i5-6400 2,70 ГГц на другом. Я думаю, что bools-это проблема, потому что они хорошо известны как медленные, они появляются почти в каждом результате Google о скорости рендеринга в каждой программе CAD., @Lyndon White

Хотя, честно говоря, я предполагаю, что логические значения, вероятно, появляются в каждом нетривиальном примере OpenSCAD, они полезны, я изменю вопрос, @Lyndon White

Честно говоря, я думал в терминах Meshmixer, где слияние двух объектов может быть сделано в любое время, до окончательной очистки или рендеринга деталей., @Carl Witthoft

@CarlWitthoft - Булевы операции в САПР *чрезвычайно* дороги, особенно когда поверхности, которые необходимо обрезать, изогнуты. На самом деле такие операции настолько сложны, что не могут быть решены за разумное время, и по этой причине пакеты САПР используют аппроксимации, которые, в свою очередь, делают большинство 3D-моделей сломанными (и иногда приводят к сбоям). Google "Проблема пересечения поверхности с поверхностью", если вы хотите узнать больше об этом! :), @mac


1 ответ


7

Во-первых, отказ от ответственности: я далек от эксперта по этому вопросу, я просто обычный Джо, который случайно использует OpenSCAD и провел с ним некоторые эксперименты. Я считаю, что приведенный ниже ответ верен, но буду очень благодарен, если в комментариях мне будут доведены до сведения ошибки или заблуждения. :)

Я читал, что иногда функция рендеринга полезна для ускорения общего рендеринга. Это правильно, или я неправильно понял?

Я не знаю, можно ли использовать render() для ускорения "общего рендеринга", но я довольно уверен, что предполагаемая цель render ()-упростить представление модели в памяти и, следовательно, отзывчивость окна предварительногопросмотра, а не ускорить его окончательный рендеринг.

Как это работает?

Чтобы понять, как это работает, нужно понять, как работает Конструктивная геометрия твердого тела (CSG).

Вся предпосылка CSG заключается в том, что, используя булевы операции между примитивными сплошными формами, можно представлять сложные фигуры.

Однако в то время как оператор-человек может рассматривать вычитающие операции, такие как разность и пересечение, как нечто, что делает модель меньше по объему и, следовательно, возможно, проще в обращении, компьютер видит каждую операцию как добавление геометрии и сложности к детали, как хорошо иллюстрирует следующее изображение:

visuals vs in-memory model

При манипулировании моделью в CAD Viewer OpenSCAD находится в режиме предварительного просмотра, и вся эта "невидимая геометрия" должна обрабатываться для каждой настройки видового экрана. Легко достичь уровня, при котором просмотрщик OpenSCAD станет нервным или невосприимчивым.

То, что делает функция render (), говорит OpenSCAD вычислить сетку, полученную в результате логических операций, заключенных в вызове render (), и использовать эту единственную сетку вместо базовых примитивов boolean-combined при обработке модели в средстве просмотра. OpenSCAD (F6), а не в предварительном просмотре, но здесь их преимущество заключается не в лучшем визуальном качестве, а в том, что OpenSCAD должен обрабатывать гораздо меньше геометрии.

В каких обстоятельствах я могу его применить?

На самом деле вы можете применить его в любое удобное для вас время, но это компромисс: модели, которая использует внутреннюю функцию render (), потребуется больше времени для отображения ее первоначального предварительного просмотра (потому что генерация сетки-дорогостоящая операция), но она будет вести себя очень хорошо в средстве просмотра. И наоборот, большая модель, которая не использует функцию render (), будет дрожать в средстве просмотра, но она будет отображаться на экране за долю времени. Следует отметить, что OpenSCAD активно использует кэширование, поэтому первый предварительный просмотр займет больше всего времени, в то время как последующие могут быть намного быстрее.

small test

Для справки, код в нижней части этого ответа (который генерирует изображение выше) вел себя следующим образом:

  • С render(): 15 секунд для предварительного просмотра, еще 1m29s для правильного рендеринга (ВСЕГО: 1m44s).
  • Без render(): 0s для предварительного просмотра, еще 1m45s для правильного рендеринга (ВСЕГО: 1m45s).

Я не знаю, является ли тот факт,что итоги похожи друг на друга, совпадением, характерным для моей модели, или общим эмпирическим правилом (функция render() эффективно создает часть окончательного рендеринга во время предварительного просмотра), но вы можете играть с кодом, и если вы обнаружите шаблон, пожалуйста, оставьте комментарий.

В следующем коде вам может потребоваться увеличить размер сетки до 20x20, если вы хотите увидеть разницу в отзывчивости между ванильным кодом и функцией render ().

Кроме того, не забудьте закрыть и снова открыть OpenSCAD между тестами, чтобы очистить кэш.


$fn = 30;

module shape() {
    render() difference() {
        sphere();
        cylinder(r=0.3, h=3, center=true);
        rotate([90, 0, 0]) cylinder(r=0.3, h=3, center=true);
        rotate([0, 90, 0]) cylinder(r=0.3, h=3, center=true);
        rotate([45, 0, 0]) cylinder(r=0.3, h=3, center=true);
        rotate([-45, 0, 0]) cylinder(r=0.3, h=3, center=true);
        rotate([0, 45, 0]) cylinder(r=0.3, h=3, center=true);
        rotate([0, -45, 0]) cylinder(r=0.3, h=3, center=true);
        rotate([90, 0, 45]) cylinder(r=0.3, h=3, center=true);
        rotate([90, 0, -45]) cylinder(r=0.3, h=3, center=true);
    }
}

module line(x, y) {
    translate([x * 2, y, 0]) shape();
    if (x > 0) line(x - 1, y);
}    

module grid(x, y) {
    line(x, y * 2);
    if (y > 0) grid(x, y - 1);
}

grid(3, 3);

,

Спасибо за такую подробную запись. Через пять лет это помогло мне понять, почему моя модель так нервничает при предварительном просмотре и так плавна после рендеринга., @David L