2010-09-26 70 views
1

我寫了一個iPhone應用程序,它接受來自用戶的輸入並根據輸入更新位圖上下文。更新之後,它會更新UIView的顯示。我正通過在UIView子類中實現drawRect來完成這些任務。在iPhone上使用OpenGL呈現UIImage/PNG最簡單,最快捷的方式?

當前我正在使用Quartz 2D。鑑於更新每秒發生多次,我注意到,雖然應用在模擬器中表現良好,但它在實際設備上速度要慢得多(儘管無法使用)。我想重寫drawRect來代替使用OpenGL(因爲我聽說這是更高性能的?)。如果你有其他的想法,我是全部耳朵。

我瀏覽過網絡上關於如何使用OpenGL簡單顯示PNG的示例/教程,但大多數都是我需要的矯枉過正。我正在尋找一個快速獲取PNG文件或UIImage的簡短而甜蜜的示例,然後使用OpenGL將它渲染到UIView中(可以實現嗎?這甚至在概念上甚至是有意義的) - 或者指向加速圖像呈現的文檔指針使用現有的Quartz API。

在您決定回覆RTFM回覆之前,請不要浪費我的時間或您的時間。我不是在尋找捷徑,我不介意做作業。我只是在尋找一個簡單的解決方案/指導,以滿足我的需求,而且很難得到。我相信一個精通OpenGL的人可能會解釋需要做什麼,並在5分鐘內啓動此代碼。如果那是你,它會讓我的一天:)。

任何幫助,指導等總是讚賞。謝謝。

回答

1

顯示更新位圖的更快方法可能是將位圖上下文僅分配給UIView的CALayer(如果需要,將子視圖調整大小和/或轉換爲所需的目標矩形)。不需要drawRect或OpenGL框架渲染。

+0

謝謝。具體來說,這將是什麼樣子?我以前嘗試過與CALayer合作失敗。 – sanderb 2010-09-26 06:00:00

3

創建存儲位圖方面已經分配您自己

void* data = malloc(width*height*4); 

CGContextRef ctx = CGBitmapContextCreate(. . .); 

和渲染任何你想成位圖上下文。接下來從數據

glGenTextures(1, &texref); 
glBindTexture(GL_TEXTURE_2D, texref); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 

創建紋理現在只需按照渲染這個貼圖與GL,使用上如何呈現GL到一個UIView蘋果的示例代碼的任何教程。注意在位圖上下文中使用RGBA字節順序(或將GL調用交換到ARGB)。另外,請記住GL只喜歡尺寸爲2^n x 2^n的紋理。利用iPhone的共享內存架構,數據不會在每個週期發送到顯卡,因此這不會帶來太多的性能損失。

+0

儘管系統可能使用共享內存架構,但基準測試顯示glTexImage2D遠遠低於任何內存到內存的複製速度,這可能是由於隱藏的位圖混淆或平鋪的紋理格式轉換過程。 – hotpaw2 2010-09-26 05:31:33

+0

謝謝! texref是一個void *是上面的示例嗎?我沒有看到一個聲明。此外,我已經讀過,你可以通過用GL_TEXTURE_RECTANGLE_ARB替換第一個參數GL_TEXTURE_2D來解決2^n x 2^n要求 - 這是真的嗎? (堆棧溢出帖子:http://stackoverflow.com/questions/2713890/opengl-es-rendering-texture-created-from-cgbitmapcontext) – sanderb 2010-09-26 05:44:56

+0

@ user407680,texref是一個GLuint,它是一個gl紋理名稱,不是一個指針到數據。@ hotpaw2,我敢肯定iOS GL ES的實現只允許在映射到圖形內存時進行只讀訪問。 – Hosiers 2010-09-26 12:59:50

相關問題