मुझे एक अल्ट्रासाउंड मशीन पर एक WPF एप्लिकेशन मिला है जो सी ++ में उत्पन्न अल्ट्रासाउंड छवियों को प्रति सेकंड 30 फ्रेम के ऊपर की गति से प्रदर्शित करता है।बड़ी मेमोरी आवंटन के बिना त्वरित अद्यतन छवियों को कैसे प्रदर्शित करें?
जो मैं समझता हूं उससे, डब्ल्यूपीएफ में छवियों को प्रदर्शित करने के लिए सामान्य प्रक्रिया आपकी छवि के लिए बिटमैप स्रोत बनाना है और अपनी छवि के लिए स्रोत सेट करना है, जो उसके बाद इसे अमान्य और प्रदर्शित करने का कारण बनता है।
चूंकि बिटमैप स्रोत IDISposable लागू नहीं करते हैं, इस विधि का उपयोग करके मुझे 30 बिटमैप स्रोतों को एक सेकंड बनाने के लिए मजबूर किया गया है। 32bppArgb प्रारूप के साथ 640x480 छवि के लिए, यह लगभग 30 एमबी/सेकेंड मेमोरी एक सेकंड आवंटित किया जा रहा है और फिर कचरा हर 10 सेकंड में निपटाया जाता है, जिससे दृश्य अंतराल होता है। स्पष्ट रूप से एक स्वीकार्य समाधान नहीं है।
मेरे वर्तमान समाधान है:
सी ++ में: मैं एक System.Drawing.Bitmap (WinForms बिटमैप) बनाने प्रबंधित C++, चित्र को भरने के लिए एक सूचक से एक memcpy कर का उपयोग ग्राफिक्स पर आपत्ति मुझे कुछ अतिरिक्त ड्राइंग की ज़रूरत है, और इसे एक छवि रिसीव किए गए ईवेंट के दौरान सी #/डब्ल्यूपीएफ में पास करें।
सी # में Image.Source BitmapBuffer द्वारा उत्पन्न एक स्रोत है, जो बिटमैप स्रोत के कच्चे डेटा तक पहुँचने का एक हैक तरह से है पर सेट है: this link. देखें मैं एक पी/CopyMemory का आह्वान डेटा की प्रतिलिपि करते हैं BitmapBcaner में Bitmap.Scan0 से। मैं फिर स्क्रीन को अद्यतन करने के लिए छवि को अमान्य कर देता हूं, और ड्रॉइंग। बिटमैप ऑब्जेक्ट को स्मृति मुक्त करने के लिए() का निपटान करता हूं।
हालांकि इस विधि ने थोड़ी देर के लिए काम किया है, यह बहुत हैकी लगता है और मुझे यह विश्वास करना मुश्किल लगता है कि प्रतिबिंब के माध्यम से ऐसा करने के लिए कोई अन्य "उचित" तरीका नहीं है।
प्रश्न: क्या कोई बेहतर तरीका है?
मार्शल का उपयोग करना। कॉपी के बजाय असुरक्षित कोड भी तेज़ है और असुरक्षित ब्लॉक की आवश्यकता नहीं है। – Andreas