2010-12-21 25 views
6

AvTouch örnek kod uygulamasının retina ekranında çalışmasını sağlamaya çalışıyorum. Bunu yapan var mı? CALevelMeter sınıfta openGL ES retina desteği

, şu denedim:

- (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; 

}

ve contentScaleFactor "2" ayarlar. Harika, bu beklenen oldu. Fakat daha sonra layoutSubviews'ta CALevelMeter çerçevesi, olması gerekenin hala 1/2'si kadardır.

Herhangi bir fikrin var mı?

cevap

11

Çerçeveler piksel cinsinden değil, noktalardır. UIView'e CAEAGLLayer'ı barındıran bir ölçek faktörü uygulandığında, pikseller iki katına çıkar, ancak çerçeve noktası boyutu aynı kalır. Aşağıdaki gibi bir kod kullanarak CAEAGLLayer bağlı renk renderbuffer için destek genişlik ve yükseklik bakarsak

:

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

bir Retina ekranda genişlik ve renderbuffer yüksekliği olduğunu görmelisiniz Standart iPhone ekranındaki değerlerin iki katı.

Yukarıda gösterdiğiniz kod, Retina ekranında güzel ve keskin bir görüntü oluşturmaya neden olmalıdır.

DÜZENLEME (12/22/2010): Diğer sorunuza yanıt olarak, avTouch örnek koduna bakarak, bu kodun geçerli sürümünün OpenGL barındırma görünümünün sınırlarını ararken bir hata oluşturduğunu gösterir. renderbuffer'ın sırt genişliği ve yüksekliğini kullanmaktan daha iyidir. 1.0 ölçek olmayan bir faktörle, bu OpenGL içeriğinin yarı boyutta çizilmesine neden olur.

Bunu düzeltmek için, aşağıdaki kodla GLLevelMeter içinde _drawView içinde uygun bölümü değiştirin: Bu her şey uygun piksel uzayda çalışmak neden ve doğru büyüklüğü en render berrak için yol açacaktır

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); 
} 

Ses düzenleyici. Bununla ilgili bir hata raporu gönderdim.

+0

Ancak retina, daha yüksek çözünürlüğü hesaba katmak için çerçeve boyutunu iki katına çıkarmıyor mu? Bahsettiğim kodu ekledikten sonra bile, hala sadece 1/2'lik bir metre aldım. Bu sadece openGL metre için geçerlidir. UIView metre retina ile iyi çalışıyor. Şoktayım. – Bryan

+1

@Bryan - avTouch örnek koduna bakarak, Apple'ın GLLevelMeter uygulamasında '_drawView 'uyguladıkları şekilde bir hata yaptığını görüyoruz. OpenGL'deki şeylerin boyutlarını belirlemek için noktaları olan görünümün sınırlarını kullanırlar, bunun yerine '_backingWidth' ve' _backingHeight' örnek değişkenlerini kullanmaları gerekir. Referansları, '_backingWidth' ve '_backingHeight 'ile sınırların büyüklüğü ve yüksekliğine göre değiştirin ve bu bir Retina ekranında düzgün bir şekilde çizilecektir. Örnek kodda bir hata raporu veriyorum. –

+0

@Bryan - Düzenlemede değiştirilmesi gereken kodu cevabım için yerelleştirdim. –