2011-04-15 16 views
9

फ़्रेम दर: मैं उस दर का जिक्र कर रहा हूं जिस पर प्रदर्शन में परिवर्तन होता है। यानी ओन्ड्रा() को बुलाया जाता है और कैनवास को फिर से खींचा जाता है।एंड्रॉइड: डिवाइस की फ्रेम दर कैसे प्राप्त करें?

क्या सभी एंड्रॉइड उपकरणों के लिए कोई डिफ़ॉल्ट दर है? चूंकि यह दर डिवाइस की प्रोसेसिंग पावर पर निर्भर करती है, उस डिवाइस के लिए प्रोग्राम शुरू करने से पहले डिवाइस की फ्रेम दर कैसे प्राप्त करें?

+0

हम एक जीएल सतह के बारे में बात कर रहे हैं, या सामान्य रूप में (एनीमेशन का उपयोग करते समय)? कोई डिफ़ॉल्ट फ्रेमरेट नहीं है, मैं इसे आगे कह सकता हूं। – EboMike

+0

बस 2 डी एनीमेशन कहने के लिए! सतह दृश्यों का उपयोग – m4n07

उत्तर

6

यह this question पर एक फॉलो-अप हो सकता है, जहां मैंने सुझाव दिया था कि एक रेड्रा लूप होने पर जो बार-बार चित्रकारी रखता है, वह थोड़ा अधिक हो सकता है। डिवाइस डिस्प्ले की क्षमताओं को जानने के लिए एक एपीआई हो सकती है, लेकिन अगर वहां मुझे पता नहीं है। जब आप अपना खुद का इवेंट लूप/थ्रेड फ़ंक्शन लिख रहे हों तो आप फ़्रेमेट को नियंत्रित कर सकते हैं कि आप कितनी बार अपनी 'ड्रा' विधि को कॉल करते हैं। आम तौर पर, मुझे लगता है कि ज्यादातर उद्देश्यों के लिए, आप 30 या उससे अधिक की ताज़ा दर के साथ ठीक रहेगा। यदि आप एक तेज एक्शन गेम लिख रहे हैं, तो उसे तेज़ एनीमेशन की आवश्यकता है तो आप जितनी जल्दी हो सके उतना तेज़ दौड़ना चाहते हैं जितना आप कर सकते हैं, अधिक fps, जितना आसान होगा।

// define the target fps 
private static final int UPDATE_RATE = 30; // Frames per second (fps) 

public void run() { 
    while(running) { // volatile flag, set somewhere else to shutdown 
     long beginTimeMillis, timeTakenMillis, timeLeftMillis; 

     // get the time before updates/draw 
     beginTimeMillis = System.currentTimeMillis(); 

     // do the thread processing/draw 
     performUpdates(); // move things if required 
     draw();   // draw them on the screen 

     // get the time after processing and calculate the difference 
     timeTakenMillis = System.currentTimeMillis() - beginTimeMillis; 

     // check how long there is until we reach the desired refresh rate 
     timeLeftMillis = (1000L/UPDATE_RATE) - timeTakenMillis; 

     // set some kind of minimum to prevent spinning 
     if (timeLeftMillis < 5) { 
      timeLeftMillis = 5; // Set a minimum 
     } 

     // sleep until the end of the current frame  
     try { 
      TimeUnit.MILLISECONDS.sleep(timeLeftMillis); 
     } catch (InterruptedException ie) { 
     } 
    } 
} 
+0

मुझे डर है कि यह एक स्पष्ट कारण के लिए एक अच्छा विचार नहीं है: यदि फोन का प्रदर्शन उस दर पर अपडेट किया गया है जो 30 में से एक नहीं है (उदाहरण के लिए, 48, डोगी एक्स 20 एल की तरह) , तो एनीमेशन चिकनी नहीं होगा। ऐसा इसलिए है क्योंकि वैसे भी 48 फ्रेम प्रदर्शित होंगे, लेकिन केवल 30 अलग-अलग (आपके कोड द्वारा प्रदान किए गए) होंगे, जिसका अर्थ है कि उनमें से कुछ 1/48 सेकंड के लिए दृश्यमान होंगे, और कुछ 2/48 सेकंड के लिए दिखाई देंगे। इससे एक झटकेदार प्रभाव पड़ता है जो आपको लगता है कि "कुछ गलत है, लेकिन मैं वास्तव में समझा नहीं सकता"। –

2

आप एक निश्चित फ़्रेमरेट पर भरोसा नहीं कर सकते हैं:

एक ठेठ घटना पाश (धागा रन समारोह) कुछ इस तरह लग सकता है। एंड्रॉइड एक मल्टीटास्किंग ऑपरेटिंग सिस्टम का उपयोग कर रहा है। यदि पृष्ठभूमि में कुछ थ्रेड चल रहे हैं जो कुछ भारी उठाने के लिए करते हैं, तो हो सकता है कि आप अपने इच्छित फ़्रेमेट तक पहुंचने में सक्षम न हों। यहां तक ​​कि यदि आप एकमात्र सक्रिय प्रक्रिया हैं, तो फ़्रेमेट आपके GPU और CPU पर निर्भर करता है, और प्रत्येक की घड़ी। हो सकता है कि उपयोगकर्ता के पास हैक किया गया रोम हो जो घड़ी को कस्टम मान में बदल देता है।

कुछ फोन एक निश्चित फ़्रेमेट पर लॉक हो सकते हैं। एचटीसी ईवीओ को सबसे लंबे समय तक 30 एफपीएस तक बंद कर दिया गया था, जब तक कि कस्टम रोम बाहर नहीं निकले, जिससे उस सीमा को हटा दिया गया। नए ईवीओ रोम ने भी उस सीमा को हटा दिया।

मुझे नहीं पता कि आप क्या करने की कोशिश कर रहे हैं, लेकिन आपकी सबसे अच्छी शर्त प्रत्येक फ्रेम के बाद समय को मापने और अपने एनिमेशन के लिए उस डेल्टा का उपयोग करना है। यदि आप एफपीएस प्रदर्शित करने की कोशिश कर रहे हैं, तो एक चिकना औसत का उपयोग करें।

4

आप एंड्रॉइड द्वारा प्रदान किए गए डंपिस टूल का उपयोग कर सकते हैं।

adb shell dumpsys display 

डिवाइस के फ्रेम दर के बारे में जानकारी विशेषता "MPhys" में प्रदान की जाती है: डिवाइस के प्रदर्शन के बारे में जानकारी प्राप्त करने के लिए आदेश पर अमल।

आप की तरह कुछ मिल जाएगा:

mPhys=PhysicalDisplayInfo{1080x1920, 60.000004 fps, densitiy 3.0, 
480.0x480.0 dpi, secure true} 

डिवाइस के फ्रेम दर, दूसरे क्षेत्र में है में मेरे मामले ६०.०००००४ एफपीएस

+0

यह सही जवाब है।एफपीएस जो आप यहां प्राप्त करते हैं वह अधिकतम है कि आप उस डिवाइस पर पहुंचने में सक्षम होंगे, भले ही आप एक 'सतह दृश्य' (लूप में) पर कैनवास पर सॉफ़्टवेयर ड्राइंग का उपयोग कर रहे हों ('lockCanvas()') के साथ या हार्डवेयर ओपनजीएल प्रतिपादन ('GLSurfaceView' पर 'onDrawFrame()') में। मुझे लगता है कि यह मान आदर्श रूप से 60 होना चाहिए (Google का सुझाव है कि इसे https://developer.android.com/training/testing/performance.html में लक्षित करना है), लेकिन यह कम हो सकता है (उदाहरण के लिए, यह ब्रांड पर 47.24 है नया डोगी एक्स 20 एल)। मैंने एक फोन नहीं देखा है जहां यह अधिक है। यह एक हूवेई पी 9 लाइट या मोटो एक्स पर 60 है। –

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