2009-07-29 20 views
7

में डिस्क से एक छवि लोड करने की गति बढ़ाएं मैं वर्तमान में एक ऐप पर काम कर रहा हूं जो उपयोगकर्ता को स्थानीय छवियों की एक श्रृंखला के माध्यम से (स्वचालित रूप से स्क्रॉल) करने की अनुमति देता है। आम तौर पर एक बार स्क्रीन पर पांच या छह होंगे।विंडोज़ फॉर्म (सी # .net) ऐप

इस समय बड़ी बाधा डिस्क से छवि डेटा की वास्तविक लोडिंग प्रतीत होती है। एक टाइमर थ्रेड छवियों को एक सेकंड के प्रत्येक 1/6 को अपडेट करने के लिए कॉल करता है और ऐप उस गति को बनाए रखने के लिए संघर्ष कर रहा है। प्रत्येक छवि लगभग 25 केबी है।

मैंने छवियों को आजमाने और प्रीलोड करने के लिए रोलिंग कैश बनाने की कोशिश की लेकिन यह भी खुद के साथ पकड़ा गया ताकि इतनी धीमी गति से धीमा हो गया।

टाइमर का हर धड़कन, मैं मानक

Image img = Image.FromFile("filename"); 

पद्धति का उपयोग करके छह छवि अगली छवि लोड हो रहा है प्लेसहोल्डर के माध्यम से पाशन रहा हूँ, लेकिन सोचा था कि किसी एक तेज़ तरीका डिस्क छवियों उतरना के बारे में पता हो सकता है।

छः सेटों में से प्रत्येक में 500 और 20,000 छवियों के बीच हैं, इसलिए शुरुआत में पूरी चीज़ को स्मृति में लोड करना बहुत बड़ा है।

अगर किसी के पास इन छवियों को खींचने के लिए तेज़ तरीके से सुझाव हैं, तो इसकी सराहना की जाएगी।


आवेदन प्रवाह के कुछ और विवरण जोड़ने के लिए संपादित करें।

उपयोगकर्ता हिट 'चलाएं' बटन:

ठीक है, यह क्या हो रहा है है। टाइमर थ्रेड 1/6 सेकंड टाइमआउट के साथ शुरू होता है।

टाइमर कॉलबैक:

Update image index (_index++) 
for each viewer in list of visible viewers (the forms to display images) 
{ 
    get the filename from the id stored in the viewer 
    check to see if the file exists 
    if it does exist, 
     create new bitmap from image 
     and return that image 
    otherwise return null 

    if returned image isn't null, display it on screen 
} 

कि स्पष्ट रूप से कुछ परतों में हो रहा है - छवि लोड यूआई के लिए सेवाएं परत में चला जाता है और फिर प्रस्तुति के लिए के माध्यम से इस गुजरता है और फिर लेकिन यह है कि क्या हो रहा है का सार है ।

उत्तर

8

मैं this page पर आया जो वर्णन करता है कि छवियों को लोड करने के लिए सीधे जीडीआई + एपीआई का उपयोग कैसे करें। उपयोग करने के लिए बहुत ही सरल:

ImageFast.FromFile(@"C:\MyPhoto.JPG"); 

जोड़ा गया छवि से अधिक ImageFast की गति को दिखाने के लिए फ़ाइल विधि

इस स्रोत कोड पाया here का उपयोग करता है से।कोड की प्रतिलिपि बनाई गई थी और चिपकाया गया था और इसमें कोई बदलाव नहीं था।

Stopwatch watch = Stopwatch.StartNew(); 

string filePath = @"C:\TestImage25k.png"; 

Image fromFile = Image.FromFile(filePath); 

watch.Stop(); 

Console.WriteLine("Image.FromFile  Ticks = {0:n}", watch.ElapsedTicks); 

long fromFileTicks = watch.ElapsedTicks; 

watch.Reset(); 
watch.Start(); 

Image fastImage = ImageFast.FromFile(filePath); 

watch.Stop(); 

long fastFileTicks = watch.ElapsedTicks; 

Console.WriteLine("ImageFast.FromFile Ticks = {0:n}", watch.ElapsedTicks); 

Console.WriteLine("fromFileTicks - fastFileTicks = {0:n}", fromFileTicks - fastFileTicks); 

कंसोल आउटपुट था

 
Image.FromFile  Ticks = 19,281,605.00 

ImageFast.FromFile Ticks = 7,557,403.00 

fromFileTicks - fastFileTicks = 11,724,202.00 

आप ImageFast के प्रभाव देख सकते हैं। समय के साथ उन 11 मिलियन बचाए गए टिक जोड़े जाएंगे।

+1

मैंने इसका परीक्षण करने के लिए एक त्वरित परीक्षण ऐप लिखा, और ImageFast 11 मिलियन टिकों से तेज़ है। छवि की फाइल से 1 9 मिलियन लगते हैं जबकि ImageFast केवल 7 मिलियन लेता है। –

+0

परीक्षण परिणामों के लिए धन्यवाद, डेविड :) – bernhof

+0

कोई समस्या नहीं है। मुझे ImageFast परिणाम पसंद हैं। –

1

छवियों और प्रीलोड की संख्या को सीमित करने के लिए 'अगला' और 'पिछला' बटन डालना सबसे आसान हो सकता है।

0

यदि आपके पास एक बार में 6 छवियां प्रदर्शित होती हैं, और आप उन्हें एक दूसरे के सभी 1/6 बदलते हैं, तो आपको प्रदर्शन समस्याओं में भाग लेना चाहिए। डिस्क से 150 केबी लोड हो रहा है कैशिंग के बिना भी एक छोटी गतिविधि होनी चाहिए। ऐसा लगता है कि आप फ़ाइल लोड को अधिक कर सकते हैं। क्या आप वाकई एक समय में केवल 6 छवियां लोड कर रहे हैं? क्या आप डिस्क से छवियां पढ़ रहे हैं जो प्रदर्शित नहीं होते हैं?

यदि आप आवेदन प्रवाह की थोड़ी अधिक जानकारी प्रदान कर सकते हैं, तो मैं थोड़ा और सहायक हो सकता हूं।

+0

हाय, मैं प्रश्न संपादित कर लिया एप्लिकेशन प्रवाह का एक सा दिखाने के लिए। यह निश्चित रूप से केवल 6 छवियों को एक बार लोड कर रहा है। अगर मैं कुछ 'दर्शक' विंडो को बंद करना शुरू करता हूं, तो यह काफी तेज़ हो रहा है। मैंने खेल से पहले प्रत्येक सेट से पहले 50 छवियों को स्मृति में पढ़ने की कोशिश की थी और यह पूरी तरह से बाधा को समाप्त कर देता है, इसलिए ऐसा लगता है कि चीजें धीमा हो जाती हैं। –

0

मैं शायद लगातार डिस्क से सभी छवियों को लाने के लिए एक पृष्ठभूमि धागा (यूआई उत्तरदायी रहता है) बनाने और फिर एक घटना

1

चेक बाहर double buffering की अवधारणा के माध्यम से एक नव भरी हुई छवि को प्रकाशित करें। आप जो करना चाहते हैं उसके पास दूसरा थ्रेड है जो छवियों के अगले सेट को लोड कर सकता है जबकि आप पहले सेट को प्रदर्शित कर रहे हैं। एक बार 1/6 समय गेट हिट हो जाने पर, आप छवियों का एक सेट स्विच करते हैं और अगले सेट को लोड करना प्रारंभ करते हैं।

0

मुझे लगता है कि डबल बफरिंग की अवधारणा उपयोगी होगी। फ़ॉर्म की "डबल बफर" संपत्ति को सही पर सेट करें। इससे आपको थोड़ा सा मदद मिलेगी। निम्न लिंक आप के लिए उपयोगी हो सकता है

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