2010-12-21 154 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