Наша новая игра 8 сентября в раннем доступе на steam



Как работать пока идёт рендер

Обновление (26.07.2015): добавил скрипт для изменения приоритета.

Когда идёт рендер у меня две цели:

  1. Чтобы отрендерилось быстро.
  2. Чтобы я смог поделать что-то другое, пока рендерится.

Обычно, одно с другим несовместимо (ведь комп занят и всё ужасно тормозит). Но выкрутится можно.

Я не буду здесь рассматривать идеальный вариант работы на другом ("запасном") компе, как это советует делать гуру VFX - Allan McKay. Также не буду рассматривать вариант использования галочки Low thread priority в настройках V-Ray (она говорит ВиРею использовать низкий приоритет логических ядер при рендеринге).

Я расскажу о том, как забираю ядра (логические) у процесса, который рендерит (у меня это 3dsmax.exe, а у вас это может быть что-угодно - Maya, Houdini...). Таким образом, я могу спокойно работать, а комп продолжает рендерить сцену на оставшихся ядрах.

Дальше я расскажу как это можно сделать более-менее автоматически.

К примеру, поставил я анимацию на рендер. Но оперативки еще осталось достаточно, так что можно запустить еще что-то (Photoshop, движок Unreal или другой 3ds Max) и поработать параллельно с рендером.

Если нужно только посмотреть видеоуроки (чтобы повысить свою квалификацию, пока идёт рендер) или почитать их, то, зачастую, это можно делать и без отбирания ядер у Макса.

Если же FullHD видео с YouTube всё же тормозит, то я забираю одно логическое ядро. Если параллельно с рендером я работаю в другом 3ds Max или Фотошопе, то я отбираю два логических ядра.

Теперь о том как это "отбираю два ядра".

Если открыть Windows Task Manager (Диспетчер задач Windows открывается если нажать Ctrl+Shift+Esc) и кликнуть правой кнопкой мышки (ПКМ) по процессу 3dsmax.exe, то выпадет меню, где нужно нажать Set Affinity...

Set Affinity... установить количество ядер для процесса 3dsmax.exe

Откроется окошко, как на заглавной картинке, где можно снять галочки с тех логических ядер, которые вы хотите освободить. В принципе, без разницы какое именно вы освободите ядро.

Возможно, вы недоумеваете, почему я всё время говорю "логические ядра" вместо просто "ядра". Всё дело в том, что у меня всего 6 ФИЗИЧЕСКИХ ядер, но благодаря технологии Hyper-threading, каждое физическое ядро делится на 2 логических ядра (для улучшения мультипоточности).

Теперь все ядра, кроме тех, которые вы освободили будут пахать над рендером, а свободное ядро будет полностью в вашем распоряжении.

Как только вы закончили работать за компом (допустим, наступило утро и вы решили, что пора и отдохнуть), а рендер еще продолжается, то вы можете опять поставить все ядра в работу.

Так вот, чтобы не делать всё это ручками (каждый раз открывать таск менеджер, кликать ПКМ по процессу, выбирать ядро, нажимать OK, закрывать таск менеджер, а потом опять вся эта процедура, когда нужно вернуть все ядра в работу), я создал себе 3 батничка.

Батничек - это так называются исполняемые файлы винды с расширением *.bat. Это что-то типа скриптов под Windows.

Нужно лишь создать обычный текстовый файл (*.txt) и поместить туда код:

PowerShell "$Process = Get-Process 3dsmax; $Process.ProcessorAffinity=2047"

Где вы говорите оболочке PowerShell взять процесс 3dsmax и назначить ему ядра, номера которых в сумме дают 2047.

Логика здесь такая, что каждое ядро - это разряд двоичного числа (кажись правильно написал :)). А в десятичной системе это будет выглядеть так:

Core 1 = 1
Core 2 = 2
Core 3 = 4
Core 4 = 8
Core 5 = 16
Core 6 = 32
Core 7 = 64
Core 8 = 128
Core 9 = 256
Core 10 = 512
Core 11 = 1024
Core 12 = 2048

И если вам нужно включить ВСЕ 12 ядер, то нужно просуммировать все эти числа:

2048+1024+512+256+128+64+32+16+8+4+2+1=4095

Если нужно включить только 11 из них, то подставить нужно сумму в которой нет нужного слагаемого (нужного номера ядра).

К примеру, если нужно ВЫКЛЮЧИТЬ ТОЛЬКО двенадцатое ядро, то сумма будет выглядеть так:

1024+512+256+128+64+32+16+8+4+2+1=2047

Далее берём этот текстовый файл и меняем у него разрешение *.txt на *.bat.

Всё, дважды кликаем на нём, как на обычной программке, и проверяем в диспетчере задач, что всё работает.

Как изменить приоритет процесса 3dsmax через скрипт.

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

Вручную задать приоритет можно кликнув ПКМ по процессу в менеджере задач и выбрав пункт Set Priority, а внутри нужный приоритет.

Стандартным является приоритет Normal. Выше Normal я бы вообще не рекомендовал ставить (иначе система начнёт настолько сильно тормозить, что вы даже мышку не сможете подвинуть :)).

Чтобы выставить низкий приоритет (Low) нужно написать в BAT-файле:

PowerShell "$Process = Get-Process 3dsmax; $Process.PriorityClass='Idle'"

Чтобы опять вернуть нормальный приоритет (Normal), нужно заменить в скрипте выше Idle на Normal.

P.S. Что такое рендеринг



Подпишитесь на обновление блога (вот 3 причины для этого).
Введите ваш e-mail:





Вам понравилась статья? Хотите отблагодарить автора? Расскажите о ней друзьям.
Или подпишитесь на обновление блога по E-Mail.

Введите ваш e-mail (используется только для отправления обновлений блога):

комментариев 12 к статье “Как можно работать если идёт рендер”

  1. В теории, конечно, толково, но, при использовании других приложений, не всё так радужно. Например, при обработке очередного фильтра фотожопом или конвертировании видео, не получится указать им, что нужно использовать только свободные ядра. Процессы будут «тащить на себя одеяло» со всего камня. Т.е. только на первом (втором, десятом) освободяться МегаГерцы, как программа сразу же их потребит.

  2. Согласен с Noobie, возникает вопрос, что для любой нужной мне программы нужно указывать явно использовать только то ядро, которое Макс не использует?
    Я обычно просто снижаю приоритет ниже среднего у Макса и если посмотреть по нагрузке, то она максимальна, но при этом остальные преложения, имея средний приоритет, работают без запинки. И при такой ситуации получается что, если я вообще почти не использую ресурсы процессора (отошел или операция не ресурсоемкая), то он все равно максимально продолжать работать на Макс.

    • Согласен с MaxC, приоритет ниже среднего и все и так автоматом.

  3. Если 2 сцены одновременно рендряд распределяю ядра на два процесса и снижаю приоритет.

    Если 1 сцена рендрит, просто снижаю приоритет — и могу заниматься чем угодно. В игры играть, стримы на втором мониторе смотреть, а оно фоном рендрит себе и не конфликтует. Потребляет там к примеру 30% мощностей, игру закрываю или сворачиваю сразу начинает там 60% потреблять, вырубаю 720p 60FPS стрим, сразу 99% жрет. То-есть оно само себе понимает нормально сколько выделять мощностей рендеру.

    P.S.
    AMD FX-8350 / Win7

  4. Откройте для себя ГПУ-рендер (аля Octane)

    Одна видюха для вьюпорта, вторая только для рендера.

  5. есть два варианта как сделать так, чтобы постоянно не менять в диспетчере задач приоритет программы со среднего на низкий:

    1. для автоматического запуска с определённым процессом:
    при изменении приоритета через «Диспетчер задач», он сохраняется лишь до завершения процесса, потом же процесс вновь запускается с приоритетом по-умолчанию, т.е. настройки приоритетов не запоминаются.
    далее пошагово:
    1. Win+R
    2. пишем regedit и нажимаем enter
    3. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
    4. нужно в указанной выше ветке реестра создать раздел с его именем, т.е. 3dsmax.exe
    5. далее в нем создать еще один раздел, т.е. уже подраздел с названием PerfOptions
    6. уже в нем создать параметр DWORD (32бита) с названием CpuPriorityClass и задать ему одно из десятичных! значений — 1, 3, 5, 6 или 8.

    8 — приоритет Normal (средний);
    1 — приоритет Idle (низкий);
    3 — приоритет High (высокий);
    5 — приоритет BelowNormal (ниже среднего);
    6 — приоритет AboveNormal (выше среднего);

    Для того что бы ваши настройки приоритета вступили в силу, необходимо перезапустить процесс. Либо если вы внесли сразу несколько системных процессов, перезагрузите систему, так будет проще.

    2. только для ярлыка на программу:
    необходимо в свойствах ярлыка на макс изменить строку «Объект»:
    C:\Windows\System32\cmd.exe /c start /low /D «C:\Program Files\Autodesk\3ds Max 2014\» 3dsmax.exe
    тут пример 2014, поэтому напиши свой путь к максу

  6. Спасибо, Юрики, подняли важную тему! как утилизировать вcе мощности, что есть в доступе и не терять в комфорте.
    Комментарий будет длинный, поскольку есть ИМХО.

    Если речь идет о максе, то читайте документацию! Не надо костылестроения, вас преемник спасибо не скажет.
    «Get/set the 3ds Max process priority as a value. Valid priority name values are #high, #normal, and #low
    sysinfo.MAXPriority
    #normal
    sysinfo.MAXPriority = #low
    #low
    sysinfo.processAffinity
    Get/set the process affinitity (the processors the process can use) as a pointer value. Each bit in the pointer value corresponds to a processor. If the bit is set, the process can use that processor.
    Available in 3ds Max 2008 and higher. Previously available in the Avguard Extensions.»
    С 2008! А приоритет вообще черти когда.

    Пишем скриптик с проверкой на сетевой рендер (IsNetServer() Returns true if 3ds Max is operating in network rendering mode and false if operating in normal interactive mode.; даже на одном компе лучше накидать батчи и пусть себе считается через бекбернер, емнип здесь есть статья по этому поводу, Юрики добавьте пожалуйста ссылку) и время суток и пусть молотит с теми приоритетами какие нужны и когда нужны. Коллега сделал себе ограничение на ядра и на время суток (днем он отдает 2 ядра с минимальным приоритетом — отошел за чаем, у кого-то маски отмолотились быстрее). Я добавил проверку его отпуска — пусть молотит вовсю пока, но когда вернется его это не напряжет. Днём рендерить это плохо! Если надо нажечь маски, то терпимо днём, но основная масса должна считаться ночью ибо:
    стартующий макс отбирает фокус (бесит порой, особенно на мелких задачах, решением является отдельный пользователь или система (ББ сервер как сервис), память не всегда можно корректно оценить (например есть объекты с дисплейсом и они большую часть времени вне кадра и память не едят, то-то будет сюрприз когда стартанет кадр с ним/и и выестся гигов 12 из 16) и самое главное, — люди спят.

    bat устарел, стоит называть cmd — командный файл, особенно с учетом использования Power Shell и он кстати не у всех установлен (c w7 в составе системы, а многие ещё на w ХР64 сидят)

    2 Kaiwas:
    Увы рендер на видеокардах это в основном для стиллов, анимация на GPU пока не очень распространена. Хотя конечно интересно, что же будет завтра.

    2 Intel Xeon:
    Зачем рендерить в 2 потока разом? Более эффективно рендерить в активном максе с средним приоритетом напосмотреть одиночный кадр и через ББ анимацию в фоне.

    2 subfeel:
    Это будет влиять на все инстансы процесса, то есть даже когда рендерим превью в текушей программе мы тоже получим низкий приоритет. А вот этого стоило бы избежать — поскорее увидеть картинку и заслать на ночь. Если у вас нет бороды и домена, то стоит обзавестись! Вы будущий одмин 😉

  7. Зачем в два потока рендрить ? Потому-что порой это необходимо. Странный вопрос 😀 В эффективности никакой потери нету, проверено годами.

    • эффективно не в смысле кадров в час (там потери меньше, чем от того, что ОС работает), а в смысле рабочего процесса — пока считается анимация, можно отдельные кадры порендерить, чтобы убедиться, что всё ок и докинуть в очередь Backburner (или чем ещё сетевой рендер обслуживается), чем запускать в интерактивном режиме рендер. Да и блокирующие таски не просто так придуманы — часто сеть нерезиновая, да и винты не выдают космические IOPS (если кадры лёгкие, то может стать проблемой). В чём может быть необходимость не очень понимаю, разве что рендернуть 10 кадров с одного и 10 с другого, чтобы пока остальное досчитывается прекомпозить их уже? Но это без проблем и последовательным образом решается — одно на паузу, ждем досчета нужного количества, отпускаем запаузенное. Прошу пример ситуации когда очевидна выгода параллельного просчета двух сиквенсов.

  8. The selected output module will overwrite a file that alrady exists.To allow this press OK вот такую надпись мне выдает программа когда я нажимаю на начало редеринга,вроде бы все идет хорошо линия бежит рендер идет ,а в конце все подвисает

    • Даже не знаю что сказать. Обычное предупреждение о том, что файл будет перезаписан. В чём вопрос?

  9. Можно довести до максимума объем доступной памяти, выбрав для параметра оптимизации рендеринга значение «Память» вместо «Производительность». Если при рендеринге оптимизация памяти больше не потребуется, можно вернуть параметры значения «Производительность» на прежнюю величину.

Извините, в данный момент комметарии закрыты.

© 2008 - 2018 3dyuriki.com
Для связи со мной 3dyuriki@gmail.com