2012-03-29 4 views
2

私は3Dパーティクルシステムエディタとエボルバーで作業を開始しています。私は過去にOpenGLと似たようなことをしましたが、今回はMac OS Xのココアアプリケーションを作っています。私は、OpenGLをセットアップする際に実行し続けるコードに関するいくつかの質問があります。私が使用してWeb上で多くの人々を参照してくださいなぜOpenGLを使用してMac OS Xのココアアプリケーションで連続レンダリングを設定する

1)...

[self setNeedsDisplay:YES]; 

が、これはOpenGLはレンダリングするために取得するための適切な方法、私は今、それが呼び出されているのdrawRectにつながる理解しているが、それは正しい方法ですか?

2)drawRectはレンダリングフレームのメソッドをオーバーライドする適切なメソッドですか?

は、相続人は、私がウェブ上に実行し続けるコード:

-(void) prepareOpenGL { 
    [[self window] makeFirstResponder:self]; 
    glClearColor(1.0f, 1.0f, 0.0f, 10.f); 

    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0/60.0 target:self selector:@selector(idle:) userInfo:nil repeats:YES]; 
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
} 

-(void)idle:(NSTimer *)timer { 
    if(![[NSApplication sharedApplication] isHidden]) 
     [self setNeedsDisplay:YES]; 
} 
-(void) drawRect:(NSRect)dirtyRect { 
    glClear(GL_COLOR_BUFFER_BIT); 
} 

答えて

4

あなたがNSOpenGLViewかCAOpenGLLayer以内にあなたのOpenGLのコンテンツを描画するかどうかを示していません。これらの2つは、画面に表示するためにコンテンツを更新する若干異なる方法を持っています。

NSOpenGLViewの場合は、-drawRect:メソッド内のビューを更新する必要はありません。実際には、発生する可能性のあるオーバーヘッドがあるため、-setNeedsDisplay:をNSViewの更新をトリガーしたくないと思います。私のアプリケーションの1つでは、NSOpenGLViewの独自のカスタムレンダリングメソッドで、CVDisplayLinkを使用して60 FPSで更新をトリガーします。これらの接触のどれも-drawRect:。フレームは[[self openGLContext] flushBuffer]を呼び出すと画面に表示され、NSViewの再描画は強制されません。

カスタムレンダリングコードで- drawInCGLContext:pixelFormat:forLayerTime:displayTime:をオーバーライドするという点で、CAOpenGLLayersは少し異なります。このメソッドは、asynchronousプロパティがYESに設定されている場合は、マニュアル-setNeedsDisplayまたはCAOpenGLLayer自体に応答してトリガーされます。 -canDrawInCGLContext:pixelFormat:forLayerTime:displayTime:に応答して指定したブール値で新しいコンテンツを提示する準備が整ったことがわかります。

私はこれらの両方を使用しており、それぞれに利点があります。 CAOpenGLLayersを使用すると、OpenGLレンダリングで他のUI要素をオーバーレイするのがはるかに簡単になりますが、レンダリング方法はバックグラウンドスレッドから正しく機能することが難しい場合があります。 NSOpenGLViewsは、CVDisplayLinkを使用してバックグラウンドスレッドで簡単に更新できますが、コンテンツをオーバーレイするための熊です。

+0

私は現在NSOpenGLViewを拡張しています。 OpenGLのプログラム可能なパイプラインを使用して、3D空間で何千もの粒子をレンダリングすることをお勧めしますか? –

+0

@JimmyBouker - 両方とも同様にレンダリングタスクを処理します。あなたの視点の上に何かを敷くことを計画しているなら、CAOpenGLLayerはあなたの時間を節約します。マルチスレッドレンダリングが必要な場合は、NSOpenGLViewを使用すると少し楽になります。 –

+0

動物園ありがとう、私は間違いなくマルチスレッドレンダリングがあり、私は自分の表面の上に何かを敷くことはありません。ありがとうブラッド –

関連する問題