2013-09-01 3 views
6

मैं वर्तमान में एक आईफोन एप्लिकेशन लिखने के लिए एसडीएल 2 लाइब्रेरी और सी का उपयोग कर रहा हूं, और अधिकांश भाग के लिए चीजें अच्छी तरह से चल रही हैं। दुर्भाग्यवश, कुछ क्षेत्रों में विशेष रूप से आईओएस-विशिष्ट कार्यों में प्रलेखन काफी पतला प्रतीत होता है। मैं एसडीएल 2 का उपयोग करने के लिए नया हूं, और इससे चीजें बहुत मुश्किल हो जाती हैं। इस प्रकार, सब कुछ काम किया है, लेकिन मैं एक समस्या पर फंस गया हूँ। एसडीएल 2 विशेष रूप से मोबाइल एप्लिकेशन के लिए उपयोग किए जाने वाले छह ईवेंट-प्रकारों को परिभाषित करता है। README-ios.txt फ़ाइल इस तरह के रूप में उन्हें और उन्हें प्रयोग करने में बताता है:मुझे एसडीएल 2 आईओएस एप्लिकेशन घटनाओं का उपयोग कैसे करना चाहिए?

int HandleAppEvents(void *userdata, SDL_Event *event) 
{ 
    switch (event->type) 
    { 
    case SDL_APP_TERMINATING: 
     /* Terminate the app. 
      Shut everything down before returning from this function. 
     */ 
     return 0; 
    case SDL_APP_LOWMEMORY: 
     /* You will get this when your app is paused and iOS wants more memory. 
      Release as much memory as possible. 
     */ 
     return 0; 
    case SDL_APP_WILLENTERBACKGROUND: 
     /* Prepare your app to go into the background. Stop loops, etc. 
      This gets called when the user hits the home button, or gets a call. 
     */ 
     return 0; 
    case SDL_APP_DIDENTERBACKGROUND: 
     /* This will get called if the user accepted whatever sent your app to the background. 
      If the user got a phone call and canceled it, you'll instead get an SDL_APP_DIDENTERFOREGROUND event and restart your loops. 
      When you get this, you have 5 seconds to save all your state or the app will be terminated. 
      Your app is NOT active at this point. 
     */ 
     return 0; 
    case SDL_APP_WILLENTERFOREGROUND: 
     /* This call happens when your app is coming back to the foreground. 
      Restore all your state here. 
     */ 
     return 0; 
    case SDL_APP_DIDENTERFOREGROUND: 
     /* Restart your loops here. 
      Your app is interactive and getting CPU again. 
     */ 
     return 0; 
    default: 
     /* No special processing, add it to the event queue */ 
     return 1; 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    SDL_SetEventFilter(HandleAppEvents, NULL); 

    //... run your main loop 

    return 0; 
} 

मैं इस कोड के बारे में कुछ प्रश्न हैं।

SDL_SetEventFilter() क्या करता है? मैंने एसडीएल विकी पेज पढ़ा, और यह विशेष रूप से अस्पष्ट लग रहा था।

अभ्यास में, HandleAppEvents() फ़ंक्शन कैसे काम करता है? उदाहरण के लिए, अगर मैं इस तरह कोड है:

int main(int argc, char* argv[]) 
{ 
    //Initialize SDL, etc... 
    SDL_SetEventFilter(HandleAppEvents, NULL); 


    //I've got some SDL_Textures and windows and things... 
    SDL_Window* my_window; 
    SDL_Renderer* windowrend; 
    SDL_Texture* tex1, tex2, tex3; 

    //Primitive game loop 
    while(game_is_running){ 
     handle_input(); 
     do_logic(); 
     update_screen(); 
    } 

    destroy_all_my_data(); 
    SDL_Quit(); 
    return 0; 
} 

कोड किस तरह HandleAppEvents में रखा जाना चाहिए() या मुख्य() स्मृति नष्ट या मेरे खेल लूप को रोकने के लिए जब मैं उदाहरण के लिए एक SDL_APP_WILLENTERBACKGROUND प्राप्त करते हैं,?

मान लें कि tex2 व्यय योग्य है और यदि ऐप को SDL_APP_LOWMEMORY प्राप्त होता है तो हटाया जा सकता है। मैं अन्य डेटा के साथ गड़बड़ किए बिना हैंडलएपएवेंट्स() से tex2 को कैसे हटाऊंगा?

उपयोगकर्ता डेटा सूचक में क्या है?

जब मेरा ऐप पृष्ठभूमि में प्रवेश करता है, तो क्या मुझे अपने बनावट को सतहों में परिवर्तित करना चाहिए, और उन्हें ../tmp/ निर्देशिका में बीएमपीएस के रूप में सहेजना चाहिए, या जब भी ऐप अग्रभूमि पर वापस आ जाएगा तब भी वे स्मृति में होंगे?

मुझे आशा है कि मेरे भ्रमित प्रश्न कुछ प्रकार की समझ लेंगे। यदि कोई जगह है तो मुझे एसडीएल 2 के लिए एक संपूर्ण दस्तावेज मिल सकता है, यह जानना बहुत अच्छा होगा।

एक नज़र डालने के लिए धन्यवाद!

उत्तर

5

एसडीएल_SetEventFilter एसडीएल की घटना कतार के "आगे बढ़ने" का एक तरीका है। कतार में शामिल होने से पहले, आपको मूल रूप से प्राप्त होने वाली घटनाएं मिलती हैं, और आईओएस मामले में आपको तुरंत उन पर प्रतिक्रिया करना पड़ता है।

इसके पीछे तकनीकी कारण यह है कि इस तरह के संदेशों के लिए, आईओएस कॉलबैक की एक श्रृंखला का उपयोग करता है, जो एसडीएल को आपके लिए क्रॉस प्लेटफ़ॉर्म अनुभव को यथासंभव निर्बाध बनाने के लिए प्राप्त करता है, लेकिन तथ्य यह है कि आईओएस अभी भी कॉलबैक से लौटने से पहले आप उन पर कार्य करने की उम्मीद करते हैं।

तो, उदाहरण के लिए, अगर हमें केवल यह संदेश देना था कि सिस्टम इस प्रक्रिया के माध्यम से सीधे ऐप पर पास करने के बजाय कतार पर स्मृति पर कम है, और आप तब तक कुछ भी नहीं करते जब तक कि यह घटना न हो कतार, आप इसे मतदान करते हैं, आदि, आईओएस आपके ऐप को मजबूती से बंद कर सकता है क्योंकि यह अपेक्षित व्यवहार नहीं करता है।

जब ऐप पृष्ठभूमि पर जाता है, तो आपको अपने बनावट को सहेजने की आवश्यकता नहीं होती है। आईओएस यह आपके लिए करता है, और यदि इसमें पर्याप्त स्मृति नहीं है तो यह आपके ऐप को मारता है (आपने कभी भी जीएल ईएस/ईएस 2 संदर्भों को खोला नहीं है, जो कुछ एंड्रॉइड डिवाइस पर हो सकता है)।

उपयोगकर्ताडेटा पॉइंटर में एसडीएल_SetEventFilter के दूसरे पैरामीटर के रूप में आपके द्वारा पारित डेटा को शामिल करने जा रहा है, इसलिए यदि आप SDL_SetEventFilter (HandleAppEvents, NULL) का उपयोग करते हैं, तो उपयोगकर्ता डेटा पूर्ण होगा।

SDL_APP_WILLENTERBACKGROUND पर, अगर मुझे सही याद है, तो आपको कुछ भी करने की ज़रूरत नहीं है।मैंने थोड़ी देर में अपना आईओएस ऐप नहीं निकाल दिया है, लेकिन मुझे लगता है कि एसडीएल अपने सभी आंतरिक राज्य (इवेंट लूप को अवरुद्ध करने और फिर इसे पुनरारंभ करने सहित) को संभालता है। घटनाओं तुम क्या संभाल करने में अपने आप SDL_APP_LOWMEMORY कर रहे हैं और SDL_APP_TERMINATING, आप कैसे संभाल कि विशिष्ट अनुप्रयोग है हालांकि राशि (बनावट, मुक्त स्मृति, आदि को हटा दें, यह विशेष रूप से एसडीएल परे चला जाता है)

+0

+1 एक बहुत ही जानकारीपूर्ण उत्तर के लिए। यदि आपके पास समय है, तो मैं वास्तव में कुछ कोड देखना चाहता हूं जो आपके मतलब से बताता है! – BrainSteel

+0

मुझे नहीं लगता कि इस मामले में एक कोड उदाहरण लागू होता है क्योंकि आप ज्यादातर "दार्शनिक" प्रश्न पूछ रहे हैं, और जहां ऐप विशिष्ट भाग (SDL_APP_LOWMEMORY, आदि) में कोड उपयोगी होगा ... लेकिन मेरे पास कोई नहीं है वहां देने के लिए उदाहरण में, संभवतः संसाधनों को मुक्त करना और उन्हें आवश्यकतानुसार उन्हें फिर से बनाने के लिए ट्रैक रखना शामिल है। लेकिन अगर आप उत्तर पर स्पष्टीकरण चाहते हैं, तो पूछो! – gabomdq

+0

ठीक है, मैं देखता हूं कि आपका क्या मतलब है। मैं बाद में कोड के साथ प्रश्न को अद्यतन करने जा रहा हूं, और उम्मीद है कि मैं आपकी प्रतिक्रिया के माध्यम से विषय को बेहतर ढंग से समझ सकता हूं। – BrainSteel

1

यह this thread से प्रकट होता है के रूप में आप अपने को रोकने के लिए है SDL_APP_WILLENTERBACKGROUND पर गेम लूप और क्रैश से बचने के लिए इसे SDL_APP_WILLENTERFOREGROUND पर फिर से शुरू करें।

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