2010-06-19 23 views
7

पर एसएसएल ओएस एक्स पर एसडीएल प्रीप्रोसेसर चाल का उपयोग करता है जो मुख्य सी() को अपने स्वयं के प्रवेश बिंदु के साथ अधिभारित करता है, जो उद्देश्य सी में लिखा गया है, जो उपयोगकर्ता के मुख्य को कॉल करता है।ओएस एक्स

ये चाल गैर-सीडीएल उपयोगकर्ताओं (उदाहरण: हास्केल बाइंडिंग) के जीवन को बहुत मुश्किल बनाती हैं।

क्या इसके लिए कोई अच्छा कारण है?

एसडीएल एसडीएल_इनिट में उद्देश्य-सी कोको प्रारंभिक क्यों नहीं कर सका?

उत्तर

5

मैक ओएस एक्स के लिए दृष्टिकोण अन्य गैर-लिनक्स प्लेटफ़ॉर्म (विंडोज़, पुराना मैक, बीओएस) के दृष्टिकोण से बहुत अलग नहीं है। आप एसडीएल डेवलपर्स खुद को पूछ सकते क्यों वे इसे इस तरह से किया था, लेकिन मैं कई कारणों से देख सकते हैं कि वे ऐसा करने के लिए चुन सकते हैं:

  • यह एसडीएल कोड है, जो एसडीएल विशिष्ट आरंभ पर केंद्रित है की निर्भरता रहती है उपप्रणाली (वीडियो, ऑडियो, समय, आदि) विशिष्ट उपप्रणाली तक सीमित है कि एसडीएल विशेष रूप से काम करने के लिए डिज़ाइन किया गया है। अर्थात। इस तरह, एसडीएल दुबला और मतलब रहता है।
  • यह एप्लिकेशन प्रारंभिकरण के लिए एक नया मंच-विशिष्ट सबसिस्टम पेश करने से बचाता है। हर कोई नंगे-हड्डियों के अनुप्रयोग ऑब्जेक्ट और मेनू को नहीं चाहता है जो एसडीएल मैक ऐप्स के लिए सेट अप करता है, लंबे शॉट से नहीं - इसलिए यदि आप इसे SDL_init में डाल रहे हैं, तो आपको इसे एक वैकल्पिक उपप्रणाली बनाना होगा असुविधाजनक डेवलपर्स के रूप में जिन्हें इसकी आवश्यकता नहीं है।
  • यह एसडीएल दिनचर्या के परिचालन अर्थशास्त्र को बनाए रखते हुए, मैक ओएस एक्स और अन्य अनुप्रयोग ढांचे को आम तौर पर संचालित करने के तरीके को नियंत्रित करता है। एसडीएल_इनिट मानता है कि यह प्रारंभ होने के बाद कॉलर पर लौटने जा रहा है, लेकिन यदि आपने SDL_init में एप्लिकेशन ऑब्जेक्ट बनाने के लिए नैतिक रूप से प्रयास किया है और एप्लिकेशन को लॉन्च करने और लॉन्च करने के लिए [app run] पर आक्रमण किया है, तो आप कभी वापस नहीं आ जाएंगे। यदि आपने run पर कॉल नहीं किया है, तो आपको एप्लिकेशन रन लूप सेट अप करने के लिए एक अलग एसडीएल फ़ंक्शन बनाना होगा। यह एसडीएल लाइब्रेरी को थोड़ा सा जटिल बना सकता है। चुना गया दृष्टिकोण यह सब से बचाता है, फ्रेमवर्क को पहले स्थापित किए गए सभी एप्लिकेशन की देखभाल करने के लिए, और applicationDidFinishLaunching से SDL_main() दिनचर्या का आह्वान करते हुए।
  • यह आसान मैक ओएस एक्स के लिए खत्म हो एसडीएल क़ौम लिनक्स पर कोडित कन्वर्ट करने के लिए तुम भी मुख्य नाम बदलने की जरूरत नहीं है बनाता है - main()SDL_main() के पूर्वप्रक्रमक नाम आप के लिए है कि का ख्याल रखता है!

मैं इन कारणों के अंतिम अनुमान लगा रहा हूँ SDL_main.h में मुख्य की परिभाषा है, जो मैं मानता हूँ एक बदसूरत हैक है के पीछे प्राथमिक ड्राइवर है।

आप अपने पुस्तकालय और एप्लिकेशन के लिए पार मंच पोर्टेबिलिटी के उस स्तर तक देने के लिए तैयार कर रहे हैं, मैं बस निम्न पंक्ति को हटाने के लिए अपने SDL_main.h को संशोधित करने का सुझाव चाहते हैं:

#define main SDL_main 

और निम्नलिखित को हटाने अपनी परियोजना में SDLMain.m से:

#ifdef main 
# undef main 
#endif 

तुम भी एसडीएल पुन: संयोजित करने के लिए यदि आप ऐसा करते आवश्यकता नहीं होनी चाहिए। ध्यान दें कि SDLMain.m पहले से ही प्रीप्रोसेसर हैक के बिना SDL_main() को आमंत्रित करने के लिए सेट अप किया गया है, और एसडीएल में और कुछ भी इसका उपयोग नहीं करेगा, इस तरह आप आसानी से SDL_main() को अपने गेम के प्रवेश बिंदु के रूप में प्रदान कर सकते हैं।

आप अन्य रास्ते जाने के लिए, अपने आप को main() पदभार संभालने चाहते हैं, तो आप अभी भी SDL_main.h में #define main SDL_main हैक से छुटकारा पाने के लिए चाहते हैं, लेकिन उसके अलावा, आप main() कि एसडीएल के लिए प्रदान करता करने के लिए कृतज्ञ नहीं कर रहे हैं आप। सबसे पहले, ध्यान दें कि SDLMain.{h,m} लाइब्रेरी का हिस्सा उचित नहीं है; आपको अपनी परियोजना में उन्हें अलग से शामिल करना होगा। दूसरा, SDLMain.h में निम्नलिखित टिप्पणी नोट:

/* SDLMain.m - main entry point for our Cocoa-ized SDL app 
     Initial Version: Darrell Walisser <[email protected]> 
     Non-NIB-Code & other changes: Max Horn <[email protected]> 

    Feel free to customize this file to suit your needs 
*/ 

कि एक निमंत्रण की तरह मेरे लिए लगता है अपने खुद के रोल अगर इन आप के लिए काम नहीं कर रहे, SDLMain.{h,m} एक मॉडल के रूप के साथ शुरू जाना। और यदि आप अपना खुद का रोलिंग कर रहे हैं, तो आप जो भी चाहते हैं वह कर सकते हैं! उस मामले के लिए, यदि आप यही चाहते हैं, तो आप एचओसी का उपयोग करके हास्केल में SDLMain.m के बराबर लिख सकते हैं। जब तक आप एचओसी के साथ whiz नहीं हैं, हालांकि, मैं इसे सरल रखना होगा।