2013-07-31 11 views
18

में सभी प्रतिपादन करें यह मेरा वर्तमान सेटअप है: मैं एसडीएल (वर्तमान में लिनक्स पर) का उपयोग कर ओपनजीएल प्रतिपादन कर रहा हूं। मैं एसडीएल (SDL_Init) शुरू करता हूं और मुख्य थ्रेड में एप्लिकेशन विंडो (SDL_CreateWindow) बना देता हूं और इसे दूसरे थ्रेड में पास करता हूं। यह दूसरा धागा इसे से ओपनजीएल संदर्भ बनाता है (SDL_GL_CreateContext) और रेंडर लूप शुरू करता है, जबकि मुख्य धागा घटनाओं के लिए सुनता है। मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि जीएल कॉल इस दूसरे धागे तक पूरी तरह से सीमित हैं; वास्तव में मेरे अधिकांश आवेदन तर्क वहां होते हैं, मुख्य धागा वास्तव में केवल एसडीएल में आने वाली घटनाओं को संभालने के लिए ज़िम्मेदार होता है।एसडीएल 2.0: मुख्य थ्रेड में विंडो बनाएं, लेकिन अलग-अलग

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

क्या मुझे कोई चिंता है कि यह ओएसएक्स/विंडोज पर काम नहीं करेगा? लिनक्स पर, मेरे पास कुछ भी नहीं है। संदर्भ साझा करने और कई धागे से जीएल कॉल करने के बारे में इंटरनेट पर बहुत सारी जानकारी है, लेकिन मैं बस एक थ्रेड में ओपनजीएल करना चाहता हूं जो मुख्य नहीं है। मैं केवल बाद में यह पता लगाने के लिए अपने आवेदन को कोडिंग जारी रखना नहीं चाहूंगा कि यह कहीं और काम नहीं करेगा।

+0

मुझे ठीक लगता है। इसके बारे में एक और धागा है ... [लिंक] (http://stackoverflow.com/questions/6172020/opengl-rendering-in-a-secondary-thread?rq=1) – user1961169

+0

@ user1961169 धन्यवाद, मैंने पहले से ही पढ़ा है धागा आप जुड़े हैं। उस व्यक्ति को लिनक्स/एक्स 11 के साथ परेशानी हो रही थी, जो मेरे लिए विशेष रूप से पूरी तरह से काम करता है, यह सिर्फ ओएसएक्स/विन 32 है, मैं इसके बारे में अनिश्चित था। हालांकि उस धागे में कुछ टिप्पणियां थीं जिन्होंने सुझाव दिया कि यह उन प्लेटफॉर्म पर भी ठीक होना चाहिए, इसलिए मुझे याद दिलाने के लिए धन्यवाद! – Ancurio

+0

केवल एक चीज जो आपको आश्वस्त करना है वह यह है कि ओएस सामान कॉल ऐप मुख्य थ्रेड में हैं। यदि नहीं तो यह अक्सर अजीब व्यवहार (बूथ जीत और लिनक्स पर) बनाता है जैसे हैंडल, कभी-कभी अपवाद, ग्राफिक्स कलाकृतियों, अवसर जीयूआई त्रुटियों, आदि ... – Spektre

उत्तर

2

मेरे पास एक ऐप है जो मैक/आईओएस/विंडोज पर चलता है जो इस तरह से संरचित है (सभी जीएल एक प्रतिपादन धागे में), लेकिन मैं एसडीएल का उपयोग नहीं करता हूं।

मैंने अभी एसडीएल के Cocoa_GL_CreateContext (जिसे ओएस एक्स पर SDL_GL_CreateContext द्वारा बुलाया गया) पर एक नज़र डाली है और यह कॉल को मेरे मुख्य थ्रेड से संदर्भ स्थापित करने के लिए बनाता है।

तो, यदि आप किसी भी समस्या को दबाते हैं, तो मुख्य थ्रेड में जीएल संदर्भ बनाने का प्रयास करें और फिर इसे प्रतिपादन धागे (प्रतिपादन धागे में जीएल संदर्भ बनाने के बजाय) को पास करें।

2

ओपनजीएल और मल्टीथ्रेडिंग मूल रूप से दुश्मन हैं: किसी भी पल में केवल एक धागा 'रेंडर संदर्भ का मालिक हो सकता है' - हां, जब भी थ्रेड स्विच होता है तो आप जीएल रेंडर संदर्भ स्विच कर सकते हैं, लेकिन लागत के बारे में सोच सकते हैं, और यह भी मान सकते हैं कि, एक OEM ड्राइवर से अगले तक, यह अच्छी तरह से समर्थित नहीं है और कुछ लोगों के लिए काम करने की संभावना है, न कि दूसरों के लिए। एकमात्र लॉजिकल (और सीन) विकल्प, आपके सभी ओपनजीएल कॉल को एक थ्रेड पर रखना है (नोट: अपवाद हैं, ऐसी चीजें हैं जो स्ट्रीमिंग डेटा से संबंधित किसी भी थ्रेड को ग्ल में कॉल कर सकती हैं, बिना उन्हें संदर्भ प्रस्तुत करने की आवश्यकता होती है)। दुर्भाग्यवश, हम सुझाव के अनुसार जीएल संदर्भ को आसानी से पास नहीं कर सकते हैं, हमें ग्लोकेक कंटेंट को कॉल करना होगा, जो जीएल को बताता है "यह कॉलर थ्रेड अब आपके मालिक है", लेकिन अन्य धागे को बताने में विफल रहता है ...

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