NSOpenGLView
サブクラスを異常な方法で設定しようとしていますが、いくつかの問題が発生しています。基本的に、私は博士課程の生物工学シミュレーションを実行するプログラムを書いており、MacOSX と Unix の両方でコンパイルできる必要があります (私のマシンは Mac ですが、sim は最終的により強力な Unix マシンで実行されます)。コードは今後 1 年半にわたってどんどん長くなっていくので、プログラムの 2 つの完全に異なるバージョンを追跡する必要はありません。そのため、ObjectiveC-2.0 を回避し、インターフェイスをオプションのままにすることで、Unix で ObjectiveC コードをコンパイルできるようにしたいと考えています (ほとんどの場合、長いシミュレーションの前にセットアップを実行し、開発中に短いシミュレーションを監視します)。
現在のバージョンは、インターフェイスがなくても問題なく動作します。シミュレーションは正しく実行され、プログラムは OpenGL フレームをレンダリングし、問題なく画像やビデオ ファイルにエクスポートできます。その上にインターフェイス(現在はNSOpenGLViewサブクラスと「開始」ボタンを備えた単純なウィンドウ)を追加しているので(それなしでmain()の代替バージョンでコードを実行できるように)私は描画コードは drawRect 関数になく、サブクラス化されたビューのどこにもないため、奇妙な方法で OpenGL を「配線」する必要がありますが、代わりに「基本」プログラムにあります。
私がこれまでに行ったことは次のとおりです。
メイン プログラム (「Lattice」と呼ばれるオブジェクトを使用) は、すべてのシミュレーションとレンダリングを実行し、画像とビデオをファイルに正しく出力します。これには
NSOpenGLContext
と の呼び出しも含まれます[renderContext flushBuffer];
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()
空です。
- PottsController は、開始ボタンをビューに接続する InterfaceBuilder でインスタンス化されたオブジェクトです。開始ボタンは、ラティスにいくつかのステップを実行するように指示するだけです。
ここで、[開始] を押すと、シミュレーションが正しく実行されます (つまり、ファイルとターミナルに出力されます) が、PottsView は正しく機能しません。白いままですが、レンダリングされたフレームのセクションに変更された場合、cmd+tab パーツを使用すると表示されます。Expose (F3) を押しても同じです。
フラッシングなどのいくつかの組み合わせを試しましsetNeedsDisplay
たが、率直に言って、私は迷っています。私はこの 4 月より前にプログラミングを行ったことがなく、これは (私が知る限り) NSOpenGLView を使用する完全に逆の方法であるため、アイデアがありません。現在のセットアップを機能させる方法、またはプログラムを完全に再配線する方法を誰かが提案してくれることを願っています (インターフェースはオプションのままです)。