2010-04-27 23 views
2

OpenGL ES確實快得多嗎?爲什麼?與在Quartz 2D中繪製這些東西相比,在OpenGL ES中繪製這些簡單的東西真的非常複雜嗎?在OpenGL ES而不是Quartz 2D中繪製簡單的曲線,直線和圓形要複雜多少?

例如,我有一個UIView子類,帶-drawRect:實現,在那裏繪製一些線條,曲線和圓圈。只是簡單的路徑,有一些影子。

我會在OpenGL ES中做什麼? EAGLView層沒有這麼好的東西嗎?想到的一件事是觸摸事件如何進入OpenGL ES?也許這是複雜的事情呢? OpenGL ES中有基本繪圖操作教程嗎?

回答

9

基於your earlier question,我想你想切換到OpenGL的原因是爲了加快您繪製的元素的動畫。在那個問題中,你試圖通過用Quartz每幀重繪你的UIView的內容來設置動畫。由於iPhone繪圖系統的工作原理,這將非常慢。每一幀,您的視圖的背景層都需要轉換爲紋理並重新上傳到GPU,這是一組非常緩慢的操作。

正如已經指出的那樣,除非您願意使用像Cocos2D這樣的第三方框架,否則爲此需要花費大量的時間和精力。即便如此,我敢打賭,你會發現繪製複雜的二維元素與石英一樣硬或難。

相反,我的建議是,不要試圖重新繪製每一幀動畫石英您的內容,而是通過分層繪製,然後使用核心動畫來移動這些層。即使在最初的iPhone操作系統設備上,我也發現可以以每秒60幀的速度使用Core Animation製作50個半透明層。核心動畫,使用Quartz繪製,遠遠比單純的OpenGL ES的工作,又可以讓如果處理得當,你達到接近相同的性能水平。相信我,我都用過。

即使你需要的,因爲它改變形狀動畫向量元素,你可以使用像CAShapeLayer來處理動畫爲您服務。

參見my answerthis question。有關Core Animation入門的資源,請參閱我的回答here

+0

謝謝。你不在俄羅斯生活多麼可憐。會花你喝一些;)你能推薦一個教程,幫助我開始在iPhone上使用OpenGL ES來繪製簡單的圖形嗎? – dontWatchMyProfile 2010-04-27 14:52:30

+0

@mystify - 威斯康星州對我來說足夠冷。我所知道的大多數OpenGL ES教程都是面向3-D圖形的,比如這個問題中列出的那些:http://stackoverflow.com/questions/72288/learning-opengl-es-1-x或者這個:http://stackoverflow.com/questions/1148143/what-are-some-good-iphone-3d-2d-opengl-es-game-tutorials。我所知道的所有最好的2-D東西都是Quartz和Core Animation。 – 2010-04-27 17:35:20

1

對於簡單的事情,Quartz 2D可以正常工作,而且非常簡單。只有在開始出現性能問題時才移動到OpenGL。

+0

我有他們,後3幾條線和曲線。僅約5個。這很瘋狂。性能非常糟糕,超過任何工業吸塵器都可以做到。 – dontWatchMyProfile 2010-04-27 12:20:22

+0

繪製幾條線條和曲線不應該導致問題,除非你做了很多。你想做高速動畫還是什麼?如果是這樣,你應該澄清這個問題。 – 2010-04-27 13:04:44

2

他們是兩個完全不同的事情:

  • Quartz2D提供一種畫布上,您使用的是有很多商品像你說的做的基本的東西,一個API借鑑的東西:線,多邊形,塊傳輸圖像,貝塞爾路徑,陰影等。當然,因爲它是一個相當高的水平的API,可以做很多簡單的事情,但什麼你不能去上這些功能的更多

  • 的OpenGL ES反而是非常低級別的API可以讓你完全控制將要顯示的內容,甚至可以從基元構建簡單的東西(然後這取決於我們是在談論ES1.0還是ES2.0,它們是完全不同的)。它基本上是跨平臺的,它的目的是用來指導GPU展示什麼以及如何展示它。

即使是簡單的事情,可以用OpenGL ES是複雜的,主要是因爲它是非常靈活的,所以你將需要了解許多概念,把所有的人都在一起,並創建你的場景。例如,你沒有一個真正的「圓形」圖元,你要做的是將一個由許多小塊組成的圖形繪製到紋理上,然後將紋理繪製到顯示器的一個真正的四邊形上,然後用它來移動環繞。

然後,OpenGL中的所有內容都是使用轉換矩陣製作的,這些轉換矩陣是用於在場景中旋轉,平移或縮放對象的工具。它們是一個非常優雅和流暢的工具,但與Quartz2D通常做的相比,它們需要更強大的數學背景。

此外,如果你打算用OpenGL ES2.0開發而不是ES1.0事情變得更加複雜:2.0之前,你有這樣的允許您使用與其像glTranslateglRotate基本功能的向後兼容性翻譯或旋轉繪製的東西。在2.0版本中,他們將所有這些都只留下了着色器的方法,所以你開發的所有東西都是着色器,這些着色器將被編譯併發送到GPU執行:這在開始時很頑皮,你必須清楚地瞭解OGL管道工作,片段着色器或像素着色器等等。我的兩個美分:OGL比Quartz2D涼得多,但它很難學,因爲它需要很多主題的知識,而且因爲OGL ES是一個標準不是很古老,所以文檔在某種程度上缺乏(因此它會更容易啓動用簡單的OGL,然後採取什麼需要的ES)。

性能注意事項:由於OGL ES只是使用GPU來完成骯髒的工作,與Quartz2D相比,它確實更快。

+0

如果我在正常的UIViews上放置OGL ES視圖,該怎麼辦?作曲不會殺死我所有的表演優點嗎? – dontWatchMyProfile 2010-04-27 12:19:32

+1

比較Quartz和OpenGL ES將蘋果與橘子進行比較。一個是2D繪圖API,另一個是硬件加速渲染,通常是3D內容。更好的比較是Core Animation vs OpenGL ES,我在答案中指出了這一點。 – 2010-04-27 12:56:01

+0

@mystify - 是的,合成的透明或半透明的OpenGL ES內容將大大減少渲染性能,以及蘋果在建議反對幾乎所有情況下。在這種情況下,有一些例外情況是必要的,例如增強現實應用程序,但聽起來不像您的情況。但是,如果您的OpenGL ES內容位於不透明的CAEAGLLayer中,如果將其置於另一個視圖或圖層之上,則不會看到此性能下降。 – 2010-04-27 12:58:35

1

典型的表現求之旅:

  • 的drawRect
  • 的Core Animation(CA)
  • 的OpenGL

IMO:

  • 如果什麼都可以在完成drawRect,也可以通過CA來完成,使用CA
  • 如果什麼都可以的OpenGL來完成,也可以通過CA來完成,使用CA

只是我的0.02