2009-04-27 23 views
14

मैं एंड्रॉइड के लिए एक गेम विकसित कर रहा हूं। यह बहुत कुछ चल रहा है लेकिन काफी आसानी से चल रहा है। यह निश्चित रूप से, जब तक कि उपयोगकर्ता स्क्रीन को छूता है।मेरे एंड्रॉइड फ़्रेमेट को नष्ट करने वाली स्पर्श घटनाएं क्यों हैं?

जबकि वे इसे छू रहे हैं, onTouchEvent कहा जाता है (action = ACTION_MOVE, x = 0 और y = 0 के साथ) मोटे तौर पर एक बार क्या, एक काफी उच्च प्राथमिकता होने के लिए के रूप में यह पूरी तरह से फ़्रेमरेट obliterates प्रकट होता है पर हर दस मिलीसेकेंड। जैसे ही स्पर्श समाप्त होता है, फ्रेमरेट अपने अच्छे राज्य में लौटता है।

मैं कोशिश की है

  • के रूप में हमेशा की तरह
  • खेल के लिए onTouchEvent संभाल इनपुट होने onTouchEvent वापसी true सीधे
  • नहीं होने onTouchEvent सभी

पर लागू समस्या बनी रहती होने सभी तीन परिस्थितियों में।

किसी को भी इस का सामना करना पड़ा है? क्या ACTION_MOVE घटनाएं उत्पन्न होती हैं, या यह सुनिश्चित करने के लिए कि वे वास्तविक आंदोलन होने पर केवल उत्पन्न होते हैं या एक मतदान विधि का उपयोग करते हैं जो स्पर्श के वर्तमान स्थान को प्राप्त करता है? या इसे पूरी तरह से अक्षम करने का एक तरीका भी?

उत्तर

12

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

+0

लिंक अब काम नहीं करता। –

0

शायद कुछ हद तक एक स्पष्ट समाधान है, लेकिन ... आप उनमें से केवल बारे में 1/10 से निपटने की कोशिश की? यदि आप प्रोसेस कर रहे हैं जो यूआई थ्रेड पर हर 10 एमएमएस ट्रिगर किया गया है, तो यह संभवतः फ्रेमरेट को धीमा करने जा रहा है, हां। तो क्या होगा यदि आप कुछ हद तक एक काउंटर जमा करते हैं और केवल कुछ प्रसंस्करण करते हैं जो कुछ न्यूनतम सीमा से पहले प्राप्त हो जाता है?

1

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

यहाँ मेरी कोड कैसा दिखता है। यूआई धागा पर:

public boolean onTouchEvent(MotionEvent event) { 
    // Store event somewhere the game thread can see it: 
    // ... 

    synchronized (someObject) { 
     try { 
      someObject.wait(1000L); 
     } catch (InterruptedException e) { 
     } 
    } 

    return true; 
} 

और खेल धागे पर:

void myGame() { 
    while (!stopping) { 
     // ... 

     // Get a touch event: 
     synchronized (someObject) { 
      someObject.notify(); 
     } 
     Thread.yield(); 

     // ... 
    } 
} 
0

आप सिंक्रनाइज़ करने धागे मैं हैंडलर इंटरफ़ेस का उपयोग कर घटना और प्रासंगिक भेजने के लिए सिफारिश कर सकते हैं से निपटने के लिए बिना एक समाधान चाहते हैं गेम रेंडरिंग थ्रेड में संदेश/बंडल का उपयोग कर डेटा। यहां संकेतित नींद का कामकाज अभी भी लागू होता है।

0

आम तौर पर घटनाएं टाइमस्टैम्प संपत्ति के साथ आती हैं इसलिए गणना करना और ईवेंट दर को थ्रॉटल करना आसान है।

if (currentEventTimestamp - lastEventTimestamp > 500) { 
 

 
    lastEventTimestamp = currentEventTimestamp; 
 

 
    // do something 
 

 
}

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

  • कोई संबंधित समस्या नहीं^_^