NSOpenGLView - 在移动窗口之前查看不刷新

时间:2014-11-16 08:46:21

标签: view nsopenglview

我真的在这个上偷偷摸摸了!

我将NSOpenGLView子类化为在视图上做一些动画。 当我说动画时,我的意思是从视图的左侧到右侧移动一些图像,依此类推。

这就是我做的事情

a)初始化OpenGL系统 代码:

- (id)initWithFrame:(NSRect)frame
{
    NSOpenGLPixelFormatAttribute attrs[] = {

    NSOpenGLPFANoRecovery, // Enable automatic use of OpenGL "share" contexts.
    NSOpenGLPFAColorSize, 24,
    NSOpenGLPFAAlphaSize, 8,
    NSOpenGLPFADepthSize, 16,
    NSOpenGLPFADoubleBuffer,
    NSOpenGLPFAAccelerated,
    0
};
// Create our pixel format.
NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc]        initWithAttributes:attrs];
self = [super initWithFrame:frame pixelFormat:pixelFormat];


return self;
}

// Synchronize buffer swaps with vertical refresh rate
- (void)prepareOpenGL
{
    GLint swapInt = 1;
   [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];
}

b)在开始时设置定时器

   Code:
   // Put our timer in -awakeFromNib, so it can start up right from the beginning
  -(void)awakeFromNib
  {
   if( gameTimer != nil )
     [gameTimer invalidate];

   gameTimer = [NSTimer timerWithTimeInterval:0.02   //time interval
                                    target:self
                                  selector:@selector(timerFired:)
                                  userInfo:nil
                                   repeats:YES];

   [[NSRunLoop currentRunLoop] addTimer:gameTimer
                             forMode:NSDefaultRunLoopMode];
   [[NSRunLoop currentRunLoop] addTimer:gameTimer
                             forMode:NSEventTrackingRunLoopMode]; //Ensure timer fires   during resize*/
   }


   // Timer callback method
  - (void)timerFired:(id)sender
 {
    //The timer fires this method every second
    currentTime ++;

    // All we do here is tell the display it needs a refresh
   [self setNeedsDisplay:YES];
 }

c)在drawRect

中动画我的东西
 Code:
 - (void)drawRect:(NSRect)rect
{
   [self animateFrame:rect];

  // the correct way to do double buffering is this:
  [[self openGLContext] flushBuffer];
}

d)animateFrame方法只是在各种矩形位置绘制图像

 Code:
 [curImage drawInRect:targetRect
            fromRect:sourceRect
           operation:NSCompositeSourceOver
            fraction:1.0f];

所以这就是问题

当我启动应用程序时 - 我可以看到时间计时器被触发,正在调用drawRect并且正在绘制图像。

然而,当我拖动窗口并移动窗口时,我只能看到图像的动画。 当窗口仍然是图像时,只是保持冻结状态。 当我移动窗口时 - 我看到图像正在移动...... 或者即使我让窗口失焦并重新聚焦 - 我可以看到图像改变位置......

我觉得OpenGLView在静态时不会自己绘画...... 我不知道还有什么要做......

我必须调用 - [[self openGLContext] flushBuffer]; 我如何确保View始终被绘制?

有人能否了解这里发生的事情或我错过了什么?

感谢一些帮助。 提前致谢! KamyFC

1 个答案:

答案 0 :(得分:0)

好的,我开始看动画 - 一旦我用NSView替换了NSOpenGLView。

也许绘制图像不是OpenGL任务,可以通过更简单的NSView来完成。