0

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

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

到目前为止我所做的是:

  1. 主程序(使用名为“Lattice”的对象)执行所有模拟和渲染,正确地将图像和视频输出到文件中。这也包含NSOpenGLContextand 调用[renderContext flushBuffer];

  2. NSOpenGLView 的一个名为 PottsView 的子类包含一个 lattice 的实例,它与视图一起初始化,如下所示:

    - (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 无法正常工作。它仍然是白色的,但是如果我 cmd+tab 部分更改为渲染帧的部分。如果我按 Expose (F3) 也是一样。

我尝试了几种冲洗,setNeedsDisplay等的组合,但坦率地说,我迷路了。在今年四月之前我没有做过任何编程,并且(据我所知)这是一种使用 NSOpenGLView 的完全向后的方式,我没有想法。我希望有人可以建议我如何使当前设置工作或如何完全重新连接程序(同时仍然保持界面可选)。

4

1 回答 1

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?

于 2010-09-26T16:48:18.967 回答