0

NSOpenGLViewサブクラスを異常な方法で設定しようとしていますが、いくつかの問題が発生しています。基本的に、私は博士課程の生物工学シミュレーションを実行するプログラムを書いており、MacOSX と Unix の両方でコンパイルできる必要があります (私のマシンは Mac ですが、sim は最終的により強力な Unix マシンで実行されます)。コードは今後 1 年半にわたってどんどん長くなっていくので、プログラムの 2 つの完全に異なるバージョンを追跡する必要はありません。そのため、ObjectiveC-2.0 を回避し、インターフェイスをオプションのままにすることで、Unix で ObjectiveC コードをコンパイルできるようにしたいと考えています (ほとんどの場合、長いシミュレーションの前にセットアップを実行し、開発中に短いシミュレーションを監視します)。

現在のバージョンは、インターフェイスがなくても問題なく動作します。シミュレーションは正しく実行され、プログラムは OpenGL フレームをレンダリングし、問題なく画像やビデオ ファイルにエクスポートできます。その上にインターフェイス(現在はNSOpenGLViewサブクラスと「開始」ボタンを備えた単純なウィンドウ)を追加しているので(それなしでmain()の代替バージョンでコードを実行できるように)私は描画コードは drawRect 関数になく、サブクラス化されたビューのどこにもないため、奇妙な方法で OpenGL を「配線」する必要がありますが、代わりに「基本」プログラムにあります。

私がこれまでに行ったことは次のとおりです。

  1. メイン プログラム (「Lattice」と呼ばれるオブジェクトを使用) は、すべてのシミュレーションとレンダリングを実行し、画像とビデオをファイルに正しく出力します。これにはNSOpenGLContextと の呼び出しも含まれます[renderContext flushBuffer];

  2. PottsView と呼ばれる NSOpenGLView のサブクラスには、次のようにビューと共に初期化されるラティスのインスタンスが含まれています。

    - (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たが、率直に言って、私は迷っています。私はこの 4 月より前にプログラミングを行ったことがなく、これは (私が知る限り) NSOpenGLView を使用する完全に逆の方法であるため、アイデアがありません。現在のセットアップを機能させる方法、またはプログラムを完全に再配線する方法を誰かが提案してくれることを願っています (インターフェースはオプションのままです)。

4

1 に答える 1

0

コンテキストとビューを「結び付けた」とどのように考えるかは明確ではありません。openglContextはいくつでも持つことができます。1つに描画するだけでは、そのコンテンツがランダムな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 に答える