2010-09-24 46 views
0

我試圖設置一個子類別NSOpenGLView在一個不尋常的方式,我遇到了一些問題。基本上,我正在編寫一個程序來爲我的博士進行生物工程仿真,我需要能夠在MacOSX和Unix下編譯它(我的機器是Mac,但最終將在更強大的Unix機器上運行該仿真器)。由於代碼在未來一年半會變得越來越長,我寧願不必跟蹤兩個完全不同的程序版本。因此,我希望能夠通過避免使用ObjectiveC-2.0並保持接口可選(在長時間模擬之前執行設置並在開發過程中監視短期內的事情)來編譯Unix下的ObjectiveC代碼。與一個不尋常的NSOpenGLView設置的問題

當前版本在沒有界面的情況下運行良好 - 模擬執行正確,程序能夠渲染OpenGL幀並將它們導出到圖像和視頻文件中,沒有任何問題。由於我現在添加接口(現在只是一個帶有NSOpenGLView子類和一個「開始」按鈕的簡單窗口)(以便我可以在沒有它的情況下使用main()的備用版本運行代碼)必須以一種奇怪的方式將OpenGL「連線」在一起,因爲繪圖代碼不在drawRect函數中,甚至在子類視圖中的任何位置,而是在「基本」程序中的任何地方。

我做了什麼到目前爲止是這樣的:

  1. 主要程序(使用對象稱爲「格子」)執行所有的模擬和渲染,正確outputing圖像和視頻文件,這也包含了NSOpenGLContext並調用[renderContext flushBuffer];

  2. 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()是空的。

  1. PottsController是在InterfaceBuilder中實例化的對象,它將啓動按鈕連接到視圖。開始按鈕只是簡單地告訴網格運行幾個步驟。

現在,按啓動會導致模擬運行正常(即輸出到文件和終端),但PottsView工作不正常。它仍然是白色的,但如果我更改爲選項卡部分,如果它更改爲渲染幀的部分。如果按下公開(F3),則相同。

我試過沖洗的幾種組合,setNeedsDisplay等,但坦白說我迷路了。在4月份之前,我還沒有做過任何編程,而且這種存在(據我所知),使用NSOpenGLView的一種完全倒退的方式讓我不再有想法。我希望有人可以建議我如何使當前的設置工作或如何完全重新連接程序(同時仍然保持界面可選)。

回答

0

目前尚不清楚您如何認爲自己已將上下文和視圖「連線」在一起。你可以擁有任意數量的openglContexts - 只需繪製成一個就不會讓它的內容出現在隨機的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?