我正试图以不寻常的方式设置子类NSOpenGLView
,我遇到了一些问题。基本上,我正在编写一个程序来为我的博士执行生物工程模拟,我需要能够在MacOSX和Unix下编译它(我的机器是Mac,但是sim最终会在更强大的Unix机器上运行)。由于代码将在未来一年半中变得越来越长,我宁愿不必跟踪两个完全不同版本的程序。因此,我希望能够通过避免使用ObjectiveC-2.0并保持接口可选来在Unix下编译ObjectiveC代码(它主要用于在长时间模拟之前执行设置并在开发期间监视短模板的内容)。
当前版本在没有界面的情况下运行良好 - 模拟正确执行,程序能够渲染OpenGL帧并将其导出到图像和视频文件中而没有任何问题。因为我现在正在添加界面(现在只是一个带有NSOpenGLView子类的简单窗口和一个“开始”按钮“)(这样我可以使用备用版本的main()运行代码而不用它)我因为绘图代码不在drawRect函数中,甚至在子类视图中的任何地方,而是在“基本”程序中,所以必须以一种奇怪的方式“连接”OpenGL。
到目前为止,我所做的是:
主程序(使用名为“Lattice”的对象)执行所有模拟和渲染,正确地将图像和视频输出到文件。这也包含NSOpenGLContext
并调用[renderContext flushBuffer];
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()
为空。
现在,按下启动会导致模拟正常运行(即输出到文件和终端),但PottsView无法正常工作。它仍然是白色的,但如果我cmd + tab部分,如果它改变为渲染帧的部分。如果按下Expose(F3),则相同。
我尝试了几种潮红,setNeedsDisplay
等组合,但坦率地说我迷路了。我没有在今年四月之前做过任何编程,并且这是(据我所知)一个完全倒退的方式使用NSOpenGLView我没有想法。我希望有人可以建议我如何使当前设置工作或如何完全重新连接程序(同时仍然保持接口可选)。
答案 0 :(得分:0)
目前尚不清楚您是如何认为已将上下文和视图“连接”起来的。你可以拥有尽可能多的openglContexts - 只需绘制成一个就不会让它的内容显示在一个随机的NSOpenGLView中。如果我遗漏了某些东西,请道歉。
NSOpenGLView是NSView的一个相当简单的子类,它创建了上下文和像素格式。正如您已经拥有的那样,您可以取消使用NSOpenGLView并使用自定义NSView子类。
要绘制到屏幕,您必须从-drawRect:
刷新图形上下文这会在gpu处理你的指令时阻塞主线程,如果你有很多指令,这可能是个问题。它也不会超过50fps。
如果您已经将帧渲染到文件中,那么每次添加新目录时,您是否更好地观察输出目录并绘制图像,不需要opengl?