2012-01-15 9 views
6

मेरे पास एक ऐसा एप्लिकेशन है जो पृष्ठभूमि कार्य करते समय, "अनुमानित समय शेष" गणना (जैसे "5 सेकंड शेष") और "पूरा होने का अनुमानित समय" (उदाहरण के लिए "12:59 बजे पूरा होता है) के साथ एक प्रगति पट्टी दिखाता है। : 5 9 "), या जैसा कि मैंने इसे बुलाया, ईटीए।मैं अपने "अनुमानित समय शेष" (और ईटीए) गणना से "जिटर" को कैसे हटा सकता हूं?

इस ईटीए की गणना के लिए एल्गोरिदम मूल रूप से समय के साथ प्रगति के "रोलिंग औसत" लेता है:
1. प्रत्येक प्रगति घटना वर्तमान समय के साथ एक कतार में जोड़ दी जाती है।
2. एक निश्चित अवधि (उदाहरण के लिए 10 एस) के बाद, कतार से आइटम हटा दिए जाते हैं।
3. ईटीए कतार में पहली और आखिरी वस्तुओं से निकाला गया है।
स्रोत कोड उपलब्ध है अगर आप परवाह: ETACalculator.cs

हालांकि, वहाँ एक घबराना समस्या है। चूंकि प्रत्येक प्रगति घटना गणना में जोड़ दी जाती है, इसलिए ईटीए को थोड़ा अपडेट किया जाएगा। मान लें कि ईटीए केवल 0.1s द्वारा बदलता है। यह छोटा जिटर आसानी से ईटीए को "फटकार" का कारण बनता है। उदाहरण के लिए, 5s, 4s, 3s, आदि से एक चिकनी प्रगति देखने के बजाय ..., मुझे 5-5-5-4-5-4-5-4-5-4-4-4 दिखाई देता है।

मैं केवल 1-प्रति-सेकंड के अपडेट को कम करने के बारे में सोच रहा था, लेकिन फिर प्रगति पट्टी कम चिकनी है, और मैं भी वास्तव में "वास्तविक" मंदी को वास्तविक समय दिखाऊंगा।

मुझे एक साधारण एल्गोरिदम के साथ आने में परेशानी हो रही है जो इस अजीब जिटर को कम कर देता है। मैं जिटर को कैसे हटा सकता हूं?

+0

विनफॉर्म? WPF? कुछ और? क्या आप प्रासंगिक कोड पोस्ट कर सकते हैं? – Oded

+3

Obligatory [xkcd संदर्भ] (http://xkcd.com/612/)। – Ani

+0

यदि यह कम हो गया है तो केवल प्रगति को अपडेट करें। (यानी हम वर्तमान में 4 पर वापस नहीं आते हैं)। –

उत्तर

9

अलग वास्तविक चिड़चिड़ा प्रगति और दो अलग-अलग चर में प्रगति का प्रदर्शन किया।

अब जितनी तेज प्रगति को अपडेट करें।

नियमित (अपेक्षाकृत तेज़) अंतराल पर, दृष्टिकोण पर वास्तविक प्रगति को प्रदर्शित करें।

एक साधारण दृष्टिकोण एल्गोरिथ्म दो मानों

display_progress = (display_progress + actual_progress)/2 

औसत करने के लिए यह पिछले मूल्यों और न सिर्फ तत्काल मूल्य को प्रतिबिंबित करने के लिए मूल्य गीला होगा होगा।

तुम भी उपयोग करके चिकनाई परिष्कृत कर सकते हैं:

display_progress = (P) * display_progress + (1.0-P) * actual_progress 

कहाँ P0.0 और 1.0 के बीच एक निरंतर मूल्य है।

संपादित करें:

यह कई फिल्टर है कि इस्तेमाल किया जा सकता से एक है। यह अच्छा है कि इसमें ज्यादा बहीखाता की आवश्यकता नहीं है।

हालांकि, हो रही सही उत्पादन, एक विकल्प हो करने के लिए नहीं जा रहा है क्योंकि दोष अपने इनपुट में है। "जिटर" और "वास्तविक मंदी" के बीच का अंतर केवल के बाद देखा जा सकता है।

+1

अच्छा विचार (पहला आदेश आईआईआर लो-पास फ़िल्टर), लेकिन यह "शेष समय" चर पर किया जाना चाहिए, न कि "% प्रगति" चर। –

+0

मैं देख सकता हूं कि यह प्रगति को "चिकनी" कैसे करेगा, और यह मेरी प्रगति गणना के लिए एक अच्छा जोड़ा हो सकता है। लेकिन मुझे लगता है कि यह अभी भी ईटीए एक्सट्रापोलेशन में जिटर से पीड़ित होगा। यहां तक ​​कि यदि जिटर केवल '0.00001' है, तो यह दिखाएगा कि ईटीए' 5.00000' और '4.9 99 99' के बीच है। क्षमा करें मेरे प्रश्न ने यह स्पष्ट नहीं किया; मैं इसे अद्यतन करने जा रहा हूँ। –

2

कोड को देखे बिना आपके एल्गोरिदम पर बिल्कुल स्पष्ट नहीं है, लेकिन जब आप अपना ईटीए अपडेट करते हैं तो पहले वर्तमान ईटीए की जांच करें और केवल पुराने मान से कम होने पर इसे अपडेट करें।

+1

मैंने [ETACalculator.cs] के लिंक के साथ अपडेट किया है (https://github.com/scottrippey/Progression/blob/master/Progression/Extras/ETACalculator.cs), अगर आप रुचि रखते है। हालांकि, मेरी स्थिति में, प्रगति धीमी हो सकती है, इस मामले में मैं एक सटीक ईटीए प्रदर्शित करना चाहता हूं। –

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