1

誰かが私が問題を抱えている小さなプログラミング数学を手伝ってくれるかどうか疑問に思っています。

私が作成しようとしているのは、Nuke(vfx)用の送信スクリプト(pythonと.batを使用)です。私が抱えている問題は、すでに計算されたスタックに残りのフレームを追加する方法がわからないことです。

より明確にするために...

Nukeでは、20フレームをレンダリングする必要があります。私は16のスレッドを持っています。Nukeは1つのスレッドのみを使用します。フレーム数を取得してスレッド数で除算し、Pythonを使用してbatファイルを書き出すスクリプトを作成したいと思います。問題は、私が残りを持っているときです。残りを取得して、レンダリングスタックに適用し直したいと思います。

例(最初のループ)

thread1 = 1 frame
thread2 = 1 frame
thread3 = 1 frame
thread4 = 1 frame
thread5 = 1 frame
thread6 = 1 frame
...
thread16 = 1 frame

これが完了すると...残りは4になります。残りをスレッド間で分散させたいです。それで...

例(2番目のループ)

thread1 = 2 frame
thread2 = 2 frame
thread3 = 2 frame
thread4 = 2 frame
thread5 = 1 frame
thread6 = 1 frame
...
thread16 = 1 frame

4つは、合計20フレームの最初の数スレッドに追加されます。

私は誰もが提供しなければならないどんな助け、ヒント、コメントにも大いに感謝します。:)

ありがとう

4

4 に答える 4

4

これは、ブレゼンハムアルゴリズムの古典的な使用法です。

def partition(lst, n):
    increment = len(lst) / float(n)
    last = 0
    i = 1
    results = []
    while last < len(lst):
        idx = int(round(increment * i))
        results.append(lst[last:idx])
        last = idx
        i += 1
    return results


for i, frames in enumerate(partition(range(20),16)):
    if len(frames)>1:
        print 'thread'+str(i+1),'=', len(frames),'frames'
    else:
        print 'thread'+str(i+1),'=', len(frames),'frame'

パーティションビットはこの回答からのものです。

それは印刷します:

thread1 = 1 frame
thread2 = 2 frames
thread3 = 1 frame
thread4 = 1 frame
thread5 = 1 frame
thread6 = 2 frames
thread7 = 1 frame
thread8 = 1 frame
thread9 = 1 frame
thread10 = 2 frames
thread11 = 1 frame
thread12 = 1 frame
thread13 = 1 frame
thread14 = 2 frames
thread15 = 1 frame
thread16 = 1 frame

2つのフレームスレッドがフロントロードされることを気にしない場合は、MarkDickinsonのソリューションを使用することもできます。

次に、次のようになります。

def partition(lst, n):
    q, r = divmod(len(lst), n)
    indices = [q*i + min(i, r) for i in xrange(n+1)]
    return [lst[indices[i]:indices[i+1]] for i in xrange(n)]

印刷するもの:

thread1 = 2 frames
thread2 = 2 frames
thread3 = 2 frames
thread4 = 2 frames
thread5 = 1 frame
thread6 = 1 frame
thread7 = 1 frame
thread8 = 1 frame
thread9 = 1 frame
thread10 = 1 frame
thread11 = 1 frame
thread12 = 1 frame
thread13 = 1 frame
thread14 = 1 frame
thread15 = 1 frame
thread16 = 1 frame
于 2012-05-22T00:22:42.303 に答える
1

framesdictや「Frame」オブジェクトなどの任意のオブジェクトのリストにすることができます。ここで私はintを使用しました

>>> frames = range(20)
>>> threads = 16
>>> [frames[x::threads] for x in range(threads)]
[[0, 16], [1, 17], [2, 18], [3, 19], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15]]

Queue一部のフレームは他のフレームよりも速くレンダリングされる可能性があるため、フレームを配置する方が良いと思います。

于 2012-05-22T02:43:47.120 に答える
0

これは私が使用することになったものです....皆さんを助けてくれてありがとう。

frames=20 
tPos=16 
Ts=divmod(frames,tPos) 
threads=[] 
for i in range(tPos): 
    threads.append(Ts[0]+1 if i<Ts[1] else Ts[0])

start = 1
end = 0
x=1
while x <= (tPos):
    end = start +(threads[x-1]-1)
    print (start, "-", end)
    start = end + 1
    x+=1


prints:
1 - 2
3 - 4
5 - 6
7 - 8
9 - 9
10 - 10
11 - 11
12 - 12
13 - 13
14 - 14
15 - 15
16 - 16
17 - 17
18 - 18
19 - 19
20 - 20
于 2012-05-22T19:20:11.557 に答える
0
frames=20
tPos=16
Ts=divmod(frames,tPos)
threads=[Ts[0]+1 if i < Ts[1] else Ts[0] for i in range(tPos)]

>>> threads    
>>> [2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

リスト内包に問題がある場合は、同じことを次のように書くことができます。

threads=[]
for i in range(tPos):
    threads.append(Ts[0]+1 if i<Ts[1] else Ts[0])

次に、フォーマットするには、次のようにします。

for i,e in enumerate(threads):
    print 'thread{} {}frames'.format(i,e)
于 2012-05-22T01:18:34.603 に答える