2010-12-21 17 views
6

मैं रेटिना डिस्प्ले पर चलाने के लिए avTouch नमूना कोड ऐप प्राप्त करने का प्रयास कर रहा हूं। क्या किसी ने ऐसा किया है?ओपनजीएल ईएस रेटिना समर्थन

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" सेट। बढ़िया, इसकी उम्मीद थी। लेकिन फिर लेआउटस्यूब्यूज में, कैवेलवेमीटर फ्रेम अभी भी 1/2 है जो यह होना चाहिए।

कोई भी विचार?

उत्तर

11

फ्रेम्स अंक में हैं, पिक्सल नहीं। जब आपके CAEAGLLayer को होस्ट करने वाले UIView पर स्केल फैक्टर लागू होता है, तो यह पिक्सल दोगुना हो जाएगा, लेकिन इसका फ्रेम बिंदु आकार वही रहेगा।

आप समर्थन की चौड़ाई और रंग renderbuffer के लिए ऊंचाई CAEAGLLayer से जुड़ी निम्नलिखित की तरह कोड का उपयोग कर को देखें, तो:

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

आप चौड़ाई और renderbuffer की ऊंचाई एक रेटिना डिस्प्ले पर हैं कि देखना चाहिए एक मानक आईफोन डिस्प्ले पर वे दो बार मूल्य हैं।

आपके द्वारा ऊपर दिखाए गए कोड को रेटिना डिस्प्ले पर अच्छा, तेज प्रतिपादन करना चाहिए।

संपादित करें (2010/12/22): अपने आगे प्रश्न के उत्तर में, avTouch नमूना कोड को देखकर पता चलता है कि कोड के वर्तमान संस्करण ओपन-होस्टिंग दृश्य की सीमाएँ को देख में कोई गलती करता है, बल्कि यह है कि रेंडरबफर की बैकिंग चौड़ाई और ऊंचाई का उपयोग करने से। गैर-1.0 स्केल कारक के साथ, यह ओपनजीएल सामग्री को आधे आकार में खींचा जाएगा।

इसे ठीक करने के उचित अनुभाग _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 ऊंचाई है। ओपनजीएल मीटर के लिए यह केवल मामला है। UIView मीटर रेटिना के साथ ठीक काम करता है। मैं उलझन में हूं। – Bryan

+1

@ ब्रायन - एव टच नमूना कोड को देखते हुए, ऐसा प्रतीत होता है कि ऐप्पल ने जीएलएलवेल मीटर में '_drawView' लागू करने के तरीके में एक त्रुटि की है। वे ओपनजीएल में चीजों के आकार निर्धारित करने के लिए, बिंदुओं में मौजूद दृश्य की सीमाओं का उपयोग कर रहे हैं, जब इसके बजाय उन्हें '_backingWidth' और' _backingHeight' इंस्टेंस चर का उपयोग करना चाहिए। '_backingWidth' और' _backingHeight' के साथ सीमाओं के आकार और ऊंचाई के संदर्भों को बदलें और यह रेटिना डिस्प्ले पर ठीक से खींचेगा। मैं नमूना कोड पर एक बग रिपोर्ट दर्ज करूंगा। –

+0

@ ब्रायन - मैंने कोड को स्थान दिया है जिसे मेरे उत्तर में संपादन के भीतर बदला जाना चाहिए। –

संबंधित मुद्दे