2013-06-23 107 views
0

我終於升級了一個非常古老的通用遊戲應用程序我必須適應更新的操作系統和設備大小 - 我已經更新了一切,並將iOS 6.1定位到正確的位置現在,但是當我在iPhone 5上運行它時,我的實際遊戲視圖(使用開放式GL渲染到EAGLView中)非常奇怪,顯示了很多剪輯(請參見屏幕截圖)。將舊應用程序升級到iOS 6 - 在iPhone 5上打開GL問題

4" retina simulator screenshot

在保留它們在我們第一次創造了這個時候,「正常」的設備,如預期出現的一切。

3.5" retina simulator

在我的視圖控制器,我基本上加載筆尖與不同設備設置正確的大小 - iPad和非4" 的設備得到了1024×768視圖和4" 設備得到一個新的1136x640視圖。

然後,在我的viewDidLoad,我建立了我的觀點的self.view.contentScaleFactor[UIScreen mainsScreen] scale],我然後做一些視圖大小,像這樣(大約):

if(iPad){ 
    [self.view setFrame:CGRectMake(0, 0,1024,768)]; 
    [self.view setCenter:CGPointMake(384,512)]; 
    DefaultViewScale=1.2; 
}else if(WideScreen){ 
    [self.view setFrame:CGRectMake(0, 0, 568, 320)]; 
    [self.view setCenter:CGPointMake(160, 293)]; 
    DefaultViewScale = 1.0f; 
}else{ 
    [self.view setFrame:CGRectMake(0, 0,480,320)]; 
    [self.view setCenter:CGPointMake(160,240)]; 
    DefaultViewScale=1.0f;; 
} 

最後,我申請通過轉換來縮放視圖上面定義的因素,我只是手動調整,然後旋轉它,因爲該應用程序僅適用於Landscape-Left。

[self.view 
    setTransform: 
     CGAffineTransformConcat(CGAffineTransformMakeScale(DefaultViewScale,DefaultViewScale), 
           CGAffineTransformMakeRotation(-M_PI_2))]; 

然後我初始化一個新的EAGLContext(OpenGL ES的1),

[(EAGLView *)self.view setContext:context]; 
[(EAGLView *)self.view setFramebuffer]; 

setFramebuffer主要是:

[EAGLContext setCurrentContext:context]; 

// Create default framebuffer object. 
glGenFramebuffers(1, &defaultFramebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); 

glGenRenderbuffers(1, &colorRenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 
[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer]; 
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth); 
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight); 

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); 

glViewport(0, 0, framebufferWidth, framebufferHeight); 

有一些更多的樣板EAGLView代碼,但請注意,我設置無論gl的glViewport告訴我它的寬度和高度是從UIView的圖層大小抓取的。

最後它設置了投影矩陣:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

glOrthof(0, self.view.frame.size.width , 0, self.view.frame.size.height, -1, 1); 

glMatrixMode(GL_MODELVIEW); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND_SRC); 

glEnableClientState(GL_VERTEX_ARRAY); 



glDisable(GL_DEPTH_TEST); 

// Set the colour to use when clearing the screen with glClear 
glClearColor(51.0/255.0,135.0/255.0,21.0/255.0, 1.0f); 

glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA); 

這是我所知最強的區域,所以讓我知道如果我錯過了一些東西,我可以給你更多的信息,如果需要。如果任何人有「一哈」或類似的經驗,我會感激一些正確的方向提示。

謝謝

+0

我注意到你的第一個代碼塊中的WideScreen情況的'setCenter'調用不符合其他情況下的模式:你有我認爲應該是的CGPointMake(160,293)案例)CGPointMake(160,284)。這可能是問題嗎? – GuyRT

+0

不幸的是,@GuyRT,這沒有效果。儘管如此,趕上! – Mustafakidd

回答

0

爲什麼在iPad上你的「DefaultViewScale = 1.2」?如果應用程序是全屏的,則不應該縮放,因爲它是1024x768。你在那裏重新調整一些東西嗎?

在我的OpenGL應用程序中,我只有一個始終全屏的EAGLView,然後從framebufferWidth/height讀取大小。

如果你有一個UIViewController,HUD-Elements正確設置,你不需要做任何[self.view setTransform ..]。我有這樣的感覺,你讓生活變得更加複雜,那應該是!
只需將帶有「UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth」的EAGLView添加爲ViewControllers主視圖的最低子視圖。並正確設置旋轉代碼(keep in mind the iOS5 calls so shouldAutoRotateToInterfaceOrientation:.. are deprecated)。

0

看起來您正在做的轉換是在設置視圖的框架之後,並可能因此改變界限。我建議打破你的繪製方法並檢查視圖和圖層的邊界。

請記住,框架是從父視角設置的,而界限是在本地座標中。來自UIView.h:

不使用幀如果視圖被轉換,因爲它不會正確 反映視圖的實際位置。改用bounds + center。

1

簡短的回答,開始使用GLKView而不是EAGLView

首先,瞭解設置的最佳實踐的一種好方法,例如,最近版本的iOS中的OpenGL上下文是使用「OpenGL Game」模板創建一個新項目並查看參考。

最顯着的區別是GLKView(在iOS 5.0中引入),這大大簡化了你的事情。它將處理您現在手動完成的大部分工作,包括設置視口。

  • 開始通過與GLKView更換使用EAGLView的(確保在你的項目中引用GLKit.framework)。
  • 刪除對setFramebuffer方法的調用。 GLKit爲您處理此事。
  • 刪除[self.view setTransform:]呼叫。如果您的應用程序是全屏OpenGL,則無需使用視圖轉換。 (而不是,它是可能,它仍然不需要)。
  • 將視圖的框架設置爲屏幕邊界(例如,通過讓它自動調整大小)。你可以在XIB中做這個。
  • 請務必在viewDidLoad的某處撥打[context setCurrentContext]
  • 這應該或多或少。還請確保將GLKViewcontext屬性設置爲OpenGL上下文,就像EAGLView一樣。
1

我建議確保您的啓動映像是最新的。

OpenGL絕對不是我的專業領域,但是在將Flash遊戲升級到iOS 6時,我遇到了類似的問題。我沒有爲新iPhone的視網膜顯示器提供合適的launch images,我的應用程序運行在'兼容模式',在屏幕的頂部和底部留有邊距。誠然,你並沒有太大的利潤空間,但它可能會讓你的應用認爲它的屏幕有多大。可能值得一試。

相關問題