我正在尝试以NSOpenGLView
不寻常的方式设置子类,但遇到了一些问题。基本上,我正在编写一个程序来为我的博士学位执行生物工程模拟,我需要能够在 MacOSX 和 Unix 下编译它(我的机器是 Mac,但 sim 最终将在更强大的 Unix 机器上运行)。由于代码将在接下来的一年半内变得越来越长,我宁愿不必跟踪该程序的两个完全不同的版本。因此,我希望能够通过避免使用 ObjectiveC-2.0 并保持接口可选的方式在 Unix 下编译 ObjectiveC 代码(它主要用于在长时间模拟之前执行设置并在开发过程中监控短时间的事情)。
当前版本在没有接口的情况下运行良好 - 模拟正确执行,程序能够渲染 OpenGL 帧并将它们导出到图像和视频文件中,没有任何问题。因为我现在要在其上添加界面(现在只是一个带有 NSOpenGLView 子类和“开始”按钮的简单窗口)(这样我就可以在没有它的情况下使用 main() 的替代版本运行代码)我必须以一种奇怪的方式将OpenGL“连接”在一起,因为绘图代码不在drawRect函数中,甚至不在子类视图中的任何地方,而是在“基本”程序中。
到目前为止我所做的是:
主程序(使用名为“Lattice”的对象)执行所有模拟和渲染,正确地将图像和视频输出到文件中。这也包含
NSOpenGLContext
and 调用[renderContext flushBuffer];
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()
是空的。
- PottsController 是 InterfaceBuilder 中实例化的对象,它将开始按钮连接到视图。开始按钮只是告诉格子运行多个步骤。
现在,按下开始会导致模拟正确运行(即输出到文件和终端),但 PottsView 无法正常工作。它仍然是白色的,但是如果我 cmd+tab 部分更改为渲染帧的部分。如果我按 Expose (F3) 也是一样。
我尝试了几种冲洗,setNeedsDisplay
等的组合,但坦率地说,我迷路了。在今年四月之前我没有做过任何编程,并且(据我所知)这是一种使用 NSOpenGLView 的完全向后的方式,我没有想法。我希望有人可以建议我如何使当前设置工作或如何完全重新连接程序(同时仍然保持界面可选)。