某主管希望write节点有多线程渲染的功能,而nuke中的render in background功能恰恰可以多个渲染任务同时执行,于是我考虑使用这个方法来实现。

调 试过程中发现renderinbackground对内存的管理是堪忧的,所以我添加了控制多线程渲染时内存消耗的参数。这个功能写起来很快,写完之后还 得考虑artist的使用习惯,把这个功能做成一个单独的节点放在工具栏里实在不是一个明智之举,artist会嫌麻烦,所以我决定把这个功能集成到 write节点上。
这是最终执行结果:
write节点里多了一个分页,artist用起来很顺手,但是这个功能受限于计算机计算及内存能力,毕竟是单机执行多线程,资源是吃紧的,工程简单,这个功能非常有优势,速度快了好几倍;工程复杂,内存吃紧,这个功能就鸡肋了。
Talk is cheap,show you the code:
#####################################################################
 
 
def RenderInBackground():
    node = nuke.thisNode()
    if node.knob('User'):
        print 'exist'
    else:
        knob_tk = nuke.Tab_Knob('User','RenderInBackground')
        node.addKnob(knob_tk)
    if node.knob('information'):
        print 'exist'
    else:
        knob_tk2 = nuke.Text_Knob('information','Info:')
        knob_tk2.setValue("Please make sure your setting didn't overflow available memory,so enough memory is necessary.")
        node.addKnob(knob_tk2)
    if node.knob('firstframe_1'):
        print 'exist'
    else:
        knob_ff = nuke.Int_Knob('firstframe_1','FirstFrame')
        knob_ff.setValue(1001)
        node.addKnob(knob_ff)
        knob_ff.setTooltip('entry first frame of render range')
    if node.knob('lastframe_1'):
        print 'exist'
    else:
        knob_lf = nuke.Int_Knob('lastframe_1','LastFrame')
        knob_lf.setValue(1100)
        node.addKnob(knob_lf)
        knob_lf.setTooltip('entry last frame of render range')
    if node.knob('splitNum'):
        print 'exist'
    else:
        knob_sn = nuke.Int_Knob('splitNum','splitNum')
        knob_sn.setValue(2)
        node.addKnob(knob_sn)
        knob_sn.setTooltip('entry number of splited framerange')
    if node.knob('maxThreads'):
        print 'exist'
    else:
        knob_mt = nuke.Int_Knob('maxThreads','maxThreads')
        knob_mt.setValue(4)
        node.addKnob(knob_mt)
    if node.knob('maxCache'):
        print 'exist'
    else:
        knob_mc = nuke.Int_Knob('maxCache','maxCache')
        knob_mc.setValue(2000)
        node.addKnob(knob_mc)
    if node.knob('unnamed'):
        print 'exist'
    else:
        knob_tt = nuke.Text_Knob('unnamed','')
        node.addKnob(knob_tt)
    if node.knob('renderinbackground'):
        print 'exist'
    else:
        knob_py = nuke.PyScript_Knob('renderinbackground','RenderInBackground')
        node.addKnob(knob_py)
        knob_py.setCommand('''import time
if nuke.thisNode().knob('file').value().find(':/') == -1:
    nuke.message('file is empty')
else:
    if os.path.exists(os.path.dirname(nuke.thisNode().knob('file').value()))==True:
        print nuke.thisNode().knob('file').value()
    else:
        os.makedirs(os.path.dirname(nuke.thisNode().knob('file').value()))

firstframe_2 = int(nuke.thisNode().knob('firstframe_1').value())
    lastframe_2 = int(nuke.thisNode().knob('lastframe_1').value())
    splitnum_2 = int(nuke.thisNode().knob('splitNum').value())

subrange = int((lastframe_2 + 1 - firstframe_2)/splitnum_2)

maxthreads = nuke.thisNode().knob('maxThreads').value()
    maxcache = nuke.thisNode().knob('maxCache').value()
    view = nuke.views()
    limits = {'maxThreads':maxthreads,'maxCache':'%dM'%maxcache}

for i in range(splitnum_2+1):
        framerange = nuke.FrameRange()
        frameranges = nuke.FrameRanges()

if firstframe_2 - 1 + subrange * (i+1) >= lastframe_2:
            framerange.setLast(lastframe_2)
        else:
            framerange.setLast(firstframe_2 - 1 + subrange * (i+1))
        if lastframe_2 >= firstframe_2 + subrange * i:
            framerange.setFirst(firstframe_2 + subrange * i)
            framerange.setIncrement(1)
            frameranges.add(framerange)
            time.sleep(0.1)
            print frameranges
            nuke.executeBackgroundNuke(nuke.EXE_PATH,[nuke.thisNode()],frameranges,view,limits)
        else:
            pass

inputx = nuke.thisNode()['xpos'].value()
    inputy = nuke.thisNode()['ypos'].value()
    newnode = nuke.nodes.Read(file=nuke.thisNode().knob('file').value(),first=firstframe_2,last=lastframe_2,)
    newnode.setXYpos(int(inputx),int(inputy)+50)'''
    )

nuke.addOnCreate(RenderInBackground,nodeClass = 'Write')

写了一个RenderInBackground的脚本的更多相关文章

  1. 自己写的一个tomcat发布脚本

    闲来无事,就自己写一个shell脚本,方便自己以后在服务器上部署tomcat下的项目.我本地用maven打包,然后每次都要人工去切换一堆堆目录,有点繁琐,所以我写了下面的shell脚本. #! /bi ...

  2. 基于七牛Python SDK写的一个批量下载脚本

    前言 上一篇基于七牛Python SDK写的一个同步脚本所写的脚本只支持上传,不支持文件下载. 虽然这个需求不太强烈,但有可能有人(在备份.迁移时)需要,而官方有没提供对应的工具,所以我就把这个功能也 ...

  3. 把登录和退出功能单独写到一个公共.py脚本,其它用例test1,test2调用公共登录,退出函数

    公共登录/退出函数模块(login_exit.py): #coding:utf-8import timedef login(driver, username, password):#此处的driver ...

  4. python3 写的一个压测脚本(有待开发)

    import requests import queue import threading import time status_code_list = [] exec_time = 0 class ...

  5. python+imageMagick写的一个压缩图片脚本

    !/usr/bin/python import os import cPickle as p import re import Image def imageCompre(imagedir = '.' ...

  6. 写了一个常规性生成merge 的小脚本

    现在使用数据库来写存储过程,动不动参数就会用到xml ,当然罗,优势也很明显,参数相对固定,而且灵活,如果要修改或者什么的,中间接口层也不需要做变化,只需要修改封装的存储过程以及程序传参就ok了. 随 ...

  7. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助

    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...

  8. 手把手用Monkey写一个压测脚本

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 允许有条件转载,转载请附带底部二维码. 一.为什么需要一个测试脚本? 昨天讲解了Android Monkey命 ...

  9. 写了一个hiero中添加自定义Token的脚本

    Hiero自带Token往往不够用,shotname中自带版本号的情况下要升级版本会很麻烦,比如Shot_0001_v001这样一个序列名,要升级为Shot_0001_v002就必须把_v001之前的 ...

随机推荐

  1. 微信小程序--扫描二维码

    场景---在微信中扫描朋友发来的二维码后进入小程序,其实那个地址是带有参数的,那么如何接收那个参数呢,其实就是进入小程序页面的onLoad生命周期行数的options参数里面.

  2. fatal: unable to access 'https://xxxxx': SSL connect error

    /********************************************************************** * fatal: unable to access 'h ...

  3. dubbo AdaptiveExtension

    AdaptiveExtension 自适应Extension,作者其实在使用Extension方和Extension之间插入AdaptiveExtension用来自适应,也可以说是适配. 所以,我们发 ...

  4. Gym - 101889D:Daunting device (老司机树)

    题意:N个格子排出一排,开始格子颜色都是1:现在有M个操作: 或,把区间[L,R]颜色改为c: 或,查询一共有多少格子颜色为c. 最后求颜色最多的数量. 数据是随机的,且强制在线. 思路:ODT裸题. ...

  5. Node.js内置的文件系统模块(fs)

    异步读取文件 按照js的标准,异步读取一个文本文件的格式如下: 'use strict' const fs = require('fs') fs.readFile('test.txt', 'utf-8 ...

  6. linux简单快速启用web

    ================= jser.me/2013/11/22/快速启动web服务的两种方式.html Python的SimpleHTTPServer需要先安装python,然后执行 pyt ...

  7. Python学习之---Python中的内置函数(方法)(更新中。。。)

    add(item)   #将item添加到s中,如果item已经在s中,则无任何效果 break        #退出循环,不会再运行循环中余下的代码 bool()     #将参数转换为布尔型 by ...

  8. LeetCode – Smallest Rotation with Highest Score

    Given an array A, we may rotate it by a non-negative integer K so that the array becomes A[K], A[K+1 ...

  9. 【mybatis源码学习】mybtias一级,二级缓存

    转载:https://www.cnblogs.com/ysocean/p/7342498.html mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSessi ...

  10. 给网卡设备添加两个IP别名(一个网卡绑定多个ip)

    首先执行ifconfig,查看网卡设备名称 [root@localhost conf]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULT ...