12

tkinter を使用して一連の PIL イメージをアニメーション化しようとしています。フレーム期間 (ミリ秒) のグラフは次のようになります。 のこぎり歯フレームの長さ

このとがった鋸歯状のパターンの原因は何か分かりますか?

再現するスクリプトは次のとおりです。

from PIL import Image, ImageTk
import Tkinter

import time
import sys

def generate_frames(n):
    """
    keep n under 101 * 101
    """
    out = []
    last_pil = None
    for i in range(n):
        if last_pil:
            pil_image = last_pil.copy()
        else:
            pil_image = Image.new('L', (101, 101), 255)   
        x = i / 101
        y = i % 101
        pil_image.load()[x, y] = 0
        out.append(ImageTk.PhotoImage(pil_image))
        last_pil = pil_image

    return out

def draw():
    FRAME_COUNT =5000

    master = Tkinter.Tk()

    w = Tkinter.Canvas(master, width=302, height=302)
    w.create_rectangle(49, 49, 252, 252)
    w.pack()

    frames = generate_frames(FRAME_COUNT)

    def draw_frame(f, canvas_image):
        print repr(time.time())
        frame = frames[f]
        if canvas_image is None:
            canvas_image = w.create_image((151, 151), image=frame, anchor='center')
        else:
            w.itemconfigure(canvas_image, image=frame)

        w.current_frame = frame  # save a reference
        next_frame = f + 1
        if next_frame < FRAME_COUNT:
            master.after(1, draw_frame, next_frame, canvas_image)
        else:
            sys.exit(0)

    master.after(10, draw_frame, 0, None)
    master.mainloop()


draw()

プロットを表示するには、出力を次のようにパイプします。

import sys

last = None
for line in sys.stdin:
    value = float(line.strip()) * 1000
    if last is None:
        pass
    else:
        print (value - last)
    last = value

それから

from matplotlib import pyplot
import sys

X = []
Y = []

for index, line in enumerate(sys.stdin):
    line = line.strip()
    X.append(index)
    Y.append(float(line))

pyplot.plot(X, Y, '-')
pyplot.show()

マルチスレッド化しても役に立ちません。

ここに画像の説明を入力

class AnimationThread(threading.Thread):

    FRAME_COUNT = 5000

    def __init__(self, canvas):
        threading.Thread.__init__(self)
        self.canvas = canvas
        self.frames = generate_frames(self.FRAME_COUNT)

    def run(self):
        w = self.canvas
        frames = self.frames
        canvas_image = None
        for i in range(self.FRAME_COUNT):
            print repr(time.time())
            frame = frames[i]
            if canvas_image is None:
                canvas_image = w.create_image((151, 151), image=frame, anchor='center')
            else:
                w.itemconfigure(canvas_image, image=frame)
            w.current_frame = frame
            time.sleep(1 * .001)

def draw_threaded():
    FRAME_COUNT = 5000
    master = Tkinter.Tk()

    w = Tkinter.Canvas(master, width=302, height=302)
    w.create_rectangle(49, 49, 252, 252)
    w.pack()

    animation_thread = AnimationThread(w)
    animation_thread.start()

    master.mainloop()

    animation_thread.join()

draw_threaded()
4

1 に答える 1

2

これは、競合する 60 Hz と 50 Hz のサンプルが混ざり合ったときのこの種の干渉パターンによく似ています。

競合する 60 Hz および 50 Hz サンプルの干渉パターン

(元の Wolfram|アルファ プロット)

これは、異なる (しかし近い) リフレッシュ レートの 2 つのものが原因である可能性があります。これは、テレビ画面を撮影しようとして黒いバーが画像を下に移動し続けているように見える場合や、車のコマーシャルで車の車輪が車軸の周りを逆回転しているように見える場合と同じタイプの現象です。これは本質的にモアレ効果の拡張です。

ビデオ ドライバやハードウェアが原因かどうかはわかりませんが、周期的なパターンの干渉が原因であることはほぼ確実です。GCサイクルがループに干渉しているように見えforます(したがって、メモリが解放されて割り当てられると、のこぎりのような波が突然低下します)

于 2013-03-24T14:17:02.943 に答える