我有一个程序在 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 中的快照已过期,但非常好:(
似乎快照检索的是前一个图像而不是当前图像:我制作了一个简单的 Quartz Composer 时钟,带有“系统时间”->“时间格式化程序(格式 = ss)”->“带字符串的图像”->“精灵”并且快照恰好晚了一秒:它们与原始时钟同时更改,但显示前一个图像...
听起来也像一个错误,但可能与导致无效图像的错误不同......