2011-12-18 66 views
0

我正在創建一個子類NSOpenGLView來完成一些OpenGL繪圖的應用程序。現在我想添加一個覆蓋控制,類似於QuickTime X.我嘗試的第一件事是將NSOpenGLCPSurfaceOrder設置爲-1,並使我的窗口不透明。它確實有效,但我失去了窗戶陰影,所以不是一個可行的解決方案。圖層支持NSOpenGLView +動畫計時器=奇怪的繪圖行爲?

我再發通過調用[setWantsLayer:YES]並增加我的控制盒作爲一個子視圖我NSOpenGLView子層支持。它的工作,但我注意到性能大幅下降。我做了一些研究,發現這一點:

我使用一個NSTimer對象調用的方法每秒[timerFired:] 60倍。完美的作品。我在這個方法中做的唯一的事情就是調用[self setNeedsDisplay:YES],因爲當使用層次支持的OpenGLView時,需要重載[drawRect:rect]方法並在那裏執行所有的OpenGL繪圖。問題:[drawRect:rect]經常被調用,雖然定時器沒有觸發。

起初我以爲「當然是這樣,它吸引了NSOpenGLView,所以它可能是由窗口管理器或一些被稱爲」。因此刪除了我的計時器對象,以確定它在[timerFired:]調用之間的調用方式。結果:它根本沒有被調用,至少在沒有調整窗口大小或拖動窗口的時候沒有。

接下來我嘗試了我的計時器時間間隔。結果,直到每秒55次,[drawRect:rect]被稱爲每秒60到70次之間,並且從每秒59次的計時間隔起,[drawRect:rect]被稱爲每秒100到120次。

我懷疑這個高度不可預測的方式在我的畫被稱爲導致的性能損失,無論是作爲不均勻或有很多的OpenGL圖紙,沒有足夠的時間堵塞該線程將被執行的東西。我還讀過層支持的OpenGLViews不能與vsync一起工作,儘管我無法證實這一點。

有沒有人有解釋?有沒有人有關於如何在定時器觸發時繪製我的OpenGL的想法?

我已經嘗試過天真的方法並添加了一個布爾變量,在我的[timerFired:]中設置爲true,並且使得我的[drawRect:rect]只調用OpenGL繪圖方法(如果變量爲true)。結果是一個非常閃爍和結構的動畫,所以沒有運氣。

如何在異步動畫或CVDisplayLink中使用CAOpenGLLayer?會幫助嗎?

編輯這可能是有用的信息,另一件事:我已經使用[setNeedsDisplay:YES]沒有我的觀點是層的支持,所以我可以很容易地層支持,而不是層支持之間切換,並且我沒有任何上面描述的問題,所以它肯定與我的觀點是層層支持。只需撥打[setWantsLayer:YES]就可以了。

回答

0

所以我用CVDisplayLink替換了我的NSTimer對象,一切都很順利。雖然我實際上不明白爲什麼。這似乎是要求一個支持層破壞垂直同步,但它不能解釋隨機調用drawRect,這是從無處不在。

此外,我真的想如果VSYNC可與支持NSOpenGLView和/或與CAOpenGLLayer層。我找不到任何官方信息。