QCViews でクオーツ コンポジションを再生するプログラムがあります。QCViews はセカンダリ スクリーンにあるため、メイン スクリーン (一種のコントロール スクリーン) に (小さい) コピーを表示する必要があります。
そのため、0.1 秒ごとにタイマーを起動し、QCView のスナップショットを取得して、結果の画像を NSImageView に設定します。
私の問題:
スナップショットは約 90% の確率で正確ですが、空白になることがあります。これが発生すると、この QCView から取得されたすべてのスナップショットは、stopRendering / startRendering が発生するまで空白になります。これは、まったく同じ構成の別の QCView が実行され、適切なスナップショットが提供されている場合でも発生します。
スナップショットが QCView と同期していないようです。より高い頻度でタイマーを起動しようとしましたが、何も変わりませんでした(空白の画像の主な問題に関連している可能性がある場合に備えて、これについて言及します)。
アイデアや指針はありますか?
編集:
私は再現しようとしました:最小限のプロジェクトを作成し、コードをコピーして貼り付けました:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSRect r = NSMakeRect(0, 0, nb * 101, 101 );
feedbackwindow = [[[NSWindow alloc] initWithContentRect: r
styleMask: NSResizableWindowMask
backing: NSBackingStoreBuffered
defer: NO ] retain ];
for ( int n = 0; n < nb; n++ )
{
v[n] = [[[QCView alloc] init] autorelease];
[v[n] setFrame: NSMakeRect( 101 * n, 0, 100, 100 ) ];
[[window contentView] addSubview: v[n]];
if(![v[n] loadCompositionFromFile:[[NSBundle mainBundle] pathForResource:@"clock" ofType:@"qtz"]]) {
NSLog(@"Could not load composition");
}
[v[n] startRendering];
img[n] = [[[NSImageView alloc] init] autorelease];
[img[n] setFrame: NSMakeRect(101 * n, 0, 100, 100 ) ];
[[feedbackwindow contentView] addSubview: img[n]];
}
[feedbackwindow orderFront:nil];
[window orderFront:nil];
[self setFeedbackTimer: [NSTimer scheduledTimerWithTimeInterval: ( 0.01 )
target: self
selector: @selector(updateImage)
userInfo: nil
repeats: YES ]];
}
- (void) updateImage
{
for ( int n = 0; n < nb; n++ )
{
NSImage* snapshot = [v[n] snapshotImage];
[img[n] setImage: snapshot];
}
}
ああ、私は問題を理解していません...
スナップショットは QCViews からは古くなっていますが、完全に良好です:(
スナップショットは現在の画像ではなく前の画像を取得しているようです:「システム時刻」->「時刻フォーマッター (format = ss)」->「文字列付きの画像」->「スプライト」を使用して単純な Quartz Composer クロックを作成しましたスナップショットは正確に 1 秒遅れています: 元の時計と同時に変更されますが、前の画像が表示されます ...
バグのようにも聞こえますが、無効な画像を引き起こすバグとはおそらく同じではありません...