2008-11-04 12 views
5

मेरे पास एक आईफोन ऐप है जहां मैं इन तीन कार्यों को ऐपडिडफिनिश लॉन्चिंग में कॉल करता हूं:GlmatrixMode (GL_PROJECTION) को कॉल करने से मुझे एक आईफोन ऐप में EXC_BAD_ACCESS क्यों मिलता है?

glMatrixMode(GL_PROJECTION); 
glOrthof(0, rect.size.width, 0, rect.size.height, -1, 1); 
glMatrixMode(GL_MODELVIEW); 

डीबगर के साथ कदम उठाने पर मुझे पहली पंक्ति निष्पादित करते समय EXC खराब एक्सेस मिलता है। कोई अंदाजा ऐसा क्यों हो रहा है?

बीटीडब्ल्यू मेरे पास एक और एप्लीकेशन है जहां मैं वही काम करता हूं और यह ठीक काम करता है। तो मैंने उस ऐप में सबकुछ डुप्लिकेट करने की कोशिश की है (# आयात, ओपनगलएस फ्रेमवर्क इत्यादि जोड़ना) लेकिन अब मैं बस अटक गया हूं।

उत्तर

4

यदि ओपनजीएल दृश्य में दो धागे एक बार में ड्रॉ करने का प्रयास कर रहे हैं तो मैंने ओपनजीएल कॉल के साथ इसमें भाग लिया है। हालांकि, यह आपके जैसा काम नहीं कर रहा है।

क्या आपने इस कॉल से पहले अपना प्रदर्शन संदर्भ और फ्रेमबफर शुरू किया है? उदाहरण के लिए, मेरी UIView उपवर्ग कि ओपन ड्राइंग करता है, मैं अपने initWithCoder में निम्नलिखित फोन: विधि:

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; 

if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) 
{ 
    [self release]; 
    return nil; 
} 

createFramebuffer विधि निम्नलिखित की तरह दिखता है:

- (BOOL)createFramebuffer 
{ 
    glGenFramebuffersOES(1, &viewFramebuffer); 
    glGenRenderbuffersOES(1, &viewRenderbuffer); 

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; 
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 

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

    if (USE_DEPTH_BUFFER) { 
     glGenRenderbuffersOES(1, &depthRenderbuffer); 
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
     glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); 
     glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 
    } 

    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) 
    { 
     return NO; 
    } 

    return YES; 
} 

यह वह जगह है काफी बॉयलरप्लेट कोड , जैसा कि एक्सकोड में ओपनजीएल ईएस एप्लीकेशन टेम्पलेट द्वारा उत्पन्न किया गया है। शायद GlMatrixMode() को कॉल करने से पहले चीजों को प्रारंभ नहीं करके, आपको एक क्रैश हो रहा है।

इसके अलावा, आप एप्लिकेशन में ओपनजीएल ड्राइंग क्यों कर रहे हैंडिफिनिश लॉन्चिंग :? क्या आपके यूआईपीप्लिकेशन डिलीगेट की तुलना में ओपनजीएल कॉल के लिए नियंत्रक को देखने या देखने के लिए एक और उपयुक्त जगह नहीं होगी?

+0

ऐसा इसलिए हो सकता है क्योंकि ऐप्पल का डेमो एप्लिकेशन, क्रैश लैंडिंग इस तरह से करता है। – xyz

2

मैंने इस त्रुटि को कई अलग-अलग परिस्थितियों में देखा है लेकिन विशेष रूप से कभी भी आपके भीतर नहीं। यह आम तौर पर रिलीज़ होने वाली मेमोरी तक पहुंचने का प्रयास करने वाले एप्लिकेशन के परिणामस्वरूप आता है।

क्या आप पुष्टि कर सकते हैं कि आयत अभी भी आवंटित है?

1

ग्लोथोफ को कॉल करने से पहले आपको मौजूदा मैट्रिक्स को पहचान मैट्रिक्स के साथ प्रतिस्थापित करने की आवश्यकता है। यह glLoadIdentity()

3

जिस तारीख को आपने बग सबमिट किया था, उस समस्या को होने की संभावना होने की संभावना नहीं है, लेकिन यदि आप ऐप्पल उदाहरण कोड का उपयोग करते हैं और ES 2.0 सक्षम पर चलाते हैं तो आपको ऐसा कुछ भी दिखाई देगा डिवाइस, क्योंकि यह spec से मैट्रिक्स स्टैक को हटा देता है, हालांकि फ़ंक्शन परिभाषाएं कंपाइलर के लिए दृश्यमान रहेंगी क्योंकि डिवाइस ES 1.1 का भी समर्थन करता है।

+0

डिफ़ॉल्ट ओपनजीएल प्रोजेक्ट पहले ईएस 2.0 लोड करने की कोशिश करता है, और केवल 1.1 अगर विफल रहता है। आप 'awakeFromNib' संपादित करके इसे ठीक कर सकते हैं। – tsellon

1

आईफोन सिम्युलेटर को पुनरारंभ करें। यह समस्या निश्चित रूप से ओपनजीएल संदर्भ के कारण ठीक से सेट नहीं की जा रही है। मैंने पाया कि कभी-कभी आईफोन सिम्युलेटर के पास समस्याएं होती हैं और ओपनजीएल संदर्भ के लिए [EAGLContext setCurrentContext:] द्वारा ठीक से सेट करने के लिए पुनरारंभ करने की आवश्यकता होती है।

+3

मुझे यह त्रुटि भी मिल रही थी और क्यों नहीं पता चला। मुझे यह पृष्ठ गूगल के माध्यम से मिला। तब मैंने अपने कोड पर नज़र डाली और महसूस किया कि मैं ईएस 2.0 के साथ संदर्भ शुरू कर रहा था, लेकिन प्रदर्शित करने के लिए मेरे ES 1.1 रेंडरर का उपयोग कर रहा था। उफ़। – Christine

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

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