2010-09-24 17 views
0

我试图设置一个子类别NSOpenGLView在一个不寻常的方式,我遇到了一些问题。基本上,我正在编写一个程序来为我的博士进行生物工程仿真,我需要能够在MacOSX和Unix下编译它(我的机器是Mac,但最终将在更强大的Unix机器上运行该仿真器)。由于代码在未来一年半会变得越来越长,我宁愿不必跟踪两个完全不同的程序版本。因此,我希望能够通过避免使用ObjectiveC-2.0并保持接口可选(在长时间模拟之前执行设置并在开发过程中监视短期内的事情)来编译Unix下的ObjectiveC代码。与一个不寻常的NSOpenGLView设置的问题

当前版本在没有界面的情况下运行良好 - 模拟执行正确,程序能够渲染OpenGL帧并将它们导出到图像和视频文件中,没有任何问题。由于我现在添加接口(现在只是一个带有NSOpenGLView子类和一个“开始”按钮的简单窗口)(以便我可以在没有它的情况下使用main()的备用版本运行代码)必须以一种奇怪的方式将OpenGL“连线”在一起,因为绘图代码不在drawRect函数中,甚至在子类视图中的任何位置,而是在“基本”程序中的任何地方。

我做了什么到目前为止是这样的:

  1. 主要程序(使用对象称为“格子”)执行所有的模拟和渲染,正确outputing图像和视频文件,这也包含了NSOpenGLContext并调用[renderContext flushBuffer];

  2. NSOpenGLView的子类称为PottsView含有一种晶格,这是与这样的观点一起初始化的一个实例:

    - (id)initWithFrame:(NSRect)frame { 
        if(![super initWithFrame:frame]) 
         return nil; 
    
        // code 
        frameSize.width = WIN_WIDTH; 
        frameSize.height = WIN_HEIGHT; 
        [self setFrameSize:frameSize]; 
    
        init_genrand64(time(0)); 
    
        latt = [Lattice alloc]; 
    
        if (SEED_TYPE) { 
         [latt initWithRandomSites]; 
        } else { 
         [latt initWithEllipse]; 
        } 
    
        [[latt context] makeCurrentContext]; 
    
        return self; 
    } 
    

drawRect()是空的。

  1. PottsController是在InterfaceBuilder中实例化的对象,它将启动按钮连接到视图。开始按钮只是简单地告诉网格运行几个步骤。

现在,按启动会导致模拟运行正常(即输出到文件和终端),但PottsView工作不正常。它仍然是白色的,但如果我更改为选项卡部分,如果它更改为渲染帧的部分。如果按下公开(F3),则相同。

我试过冲洗的几种组合,setNeedsDisplay等,但坦白说我迷路了。在4月份之前,我还没有做过任何编程,而且这种存在(据我所知),使用NSOpenGLView的一种完全倒退的方式让我不再有想法。我希望有人可以建议我如何使当前的设置工作或如何完全重新连接程序(同时仍然保持界面可选)。

回答

0

目前尚不清楚您如何认为自己已将上下文和视图“连线”在一起。你可以拥有任意数量的openglContexts - 只需绘制成一个就不会让它的内容出现在随机的NSOpenGLView中。道歉,如果我错过了什么。

NSOpenGLView是NSView的一个相当简单的子类,它创建上下文和像素格式。正如你已经有了那些,你可以使用NSOpenGLView并使用自定义的NSView子类。

你应该看看这个指令.. http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_drawing/opengl_drawing.html

绘制到屏幕上,你必须刷新从-drawRect图形上下文:

这将阻止主线程而GPU处理您的指示,这如果您有很多说明,可能会成为问题。它也不会发生超过50fps。

如果您已经将帧渲染为文件,那么每次添加新文件时都不要更好地观察输出目录并绘制图像,那么不需要使用opengl?