6

avTouch サンプル コード アプリを Retina ディスプレイで実行しようとしています。誰かがこれをしましたか?

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 のままです。

何か案は?

4

1 に答える 1

11

フレームはピクセル単位ではなくポイント単位です。CAEAGLLayer をホストする UIView に倍率が適用されると、ピクセルは 2 倍になりますが、フレーム ポイントのサイズは変わりません。

次のようなコードを使用して、CAEAGLLayer にアタッチされたカラー レンダー バッファーのバッキングの幅と高さを確認すると、次のようになります。

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

Retina ディスプレイのレンダ バッファの幅と高さが、標準の iPhone ディスプレイの値の 2 倍になっていることがわかります。

上記のコードは、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);
}

これにより、すべてが適切なピクセル空間で機能し、イコライザーで正しいサイズで鮮明なレンダリングが行われます。これについてバグレポートを提出しました。

于 2010-12-22T04:10:36.563 に答える