2010-12-21 116 views
6

我試圖讓avTouch示例代碼應用在視網膜顯示屏上運行。有沒有人做過這個?openGL ES視網膜支持

在CALevelMeter類,我已經試過如下:

- (id)initWithCoder:(NSCoder *)coder { 
if (self = [super initWithCoder:coder]) { 
     CGFloat f = self.contentScaleFactor; 
     if ([self respondsToSelector:@selector(contentScaleFactor)]) 
     { 
      self.contentScaleFactor = [[UIScreen mainScreen] scale]; 
     } 
     f = self.contentScaleFactor; 

     _showsPeaks = YES; 
     _channelNumbers = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:0], nil]; 
     _vertical = NO; 
     _useGL = YES; 
     _meterTable = new MeterTable(kMinDBvalue); 
     [self layoutSubLevelMeters]; 
     [self registerForBackgroundNotifications]; 
} 
return self; 

}

並將這contentScaleFactor爲 「2」。太棒了,這是預料之中的。但是在layoutSubviews中,CALevelMeter框架仍然是它應該的1/2。

任何想法?

回答

11

幀以點爲單位,而不是像素。當一個縮放因子被應用到承載CAEAGLLayer的UIView時,它將是像素的兩倍,但其幀點大小將保持不變。

如果看一下使用類似下面的代碼附加到CAEAGLLayer所述背襯的寬度和高度的色彩渲染:

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 

你應該看到的是,寬度和渲染的高度Retina顯示屏上是它們是標準iPhone顯示器上的值的兩倍。

上面顯示的代碼應該會在Retina顯示屏上產生清晰的銳利渲染效果。

編輯(2010年12月22日):爲了迴應您的進一步問題,查看avTouch示例代碼表明,該代碼的當前版本在查找OpenGL託管視圖的邊界時出錯,而比使用渲染緩衝區的背景寬度和高度。使用非1.0比例因子時,這將導致OpenGL內容以一半尺寸繪製。

爲了解決這個問題,用下面的代碼替換相應的部分內_drawView在GLLevelMeter:

if (_vertical) 
{ 
    glTranslatef(0., _backingWidth, 0.); 
    glScalef(1., -1., 1.); 
    bds = CGRectMake(0., 0., _backingWidth, _backingHeight); 
} else { 
    glTranslatef(0., _backingHeight, 0.); 
    glRotatef(-90., 0., 0., 1.); 
    bds = CGRectMake(0., 0., _backingHeight, _backingWidth); 
} 

這將導致一切在適當的像素空間工作,並導致脆的正確尺寸渲染均衡器。我已經提交了一個關於此的錯誤報告。

+0

但視網膜顯示器的幀大小是否會增加一倍以適應更高的分辨率?即使在添加我提到的代碼之後,我仍然只能得到1/2的高度。這只是openGL儀表的情況。 UIView測量儀可以在視網膜下正常工作。我很難過。 – Bryan 2010-12-22 13:55:50