2011-02-13 9 views
6

Heyo में कर सकते हैं के लिए देख रहा हूँ, यह मेरी पहली बार एक सवाल पूछने यहाँ तो मुझे माफ कर दो है अगर मैं गड़बड़ किसी चीज़ अप> ~ <मैं किसी भी अनुकूलन मैं एक ग्राफिक्स संपादन प्रोग्राम

मैं पर काम कर रहा हूँ ओपन कैनवास के समान एक कार्यक्रम, पहले वाले लोगों ने इंटरनेट पर वास्तविक समय में एक ही कैनवास पर कई लोगों को आकर्षित करने की अनुमति दी थी। ओसी की वास्तव में छोटी गाड़ी है और इसमें कई सीमाएं हैं, यही कारण है कि मैं इसे लिखना चाहता था।

मैंने इसे स्थापित किया है ताकि कैनवास सभी दिशाओं में "अनिश्चित काल तक" फैला हुआ हो और 512x512 ब्लॉक पिक्सल से बना हो जो तब तक सक्रिय न हो जाएं जब तक कि वे खींचे जाएं, जो वास्तव में बनाना आसान हो, और मैं इसे हार्डवेयर तेज करने के लिए डायरेक्ट 3 डी का उपयोग करने के बारे में सोच रहा था, इस प्रकार 512 वर्ग ब्लॉक।

मेरी समस्या तब होती है जब मैं परतों का उपयोग करना चाहता हूं, मुझे पूरा यकीन नहीं है कि मैं परतों को जल्दी से और मेमोरी का उपयोग किए बिना कैसे लिख सकता हूं, क्योंकि मेरा लक्ष्य 128 एम मेमोरी के साथ डायरेक्टएक्स 9 संगत वीडियो कार्ड है, और एक सिस्टम लगभग 3.2 गीगा सीपीयू पावर और रैम के 2 और 8 गीगा के बीच। मेरे पास कुछ अलग-अलग दृष्टिकोण थे जो मैं सोचने के बारे में सोच रहा था और सोच रहा था कि शायद सबसे अच्छा क्या होगा, और यदि कुछ भी था तो मैं इसे बेहतर चलाने के लिए देख सकता था।

मेरा पहला विचार जीएफएक्स हार्डवेयर को सभी ब्लॉकों पर सभी परतों को बनावट के रूप में जितना संभव हो उतना काम करना था, और उन्हें बदलते क्षेत्र को लॉक करके अपडेट किया जाएगा, उन्हें सीपीयू पर अपडेट किया जाएगा, और उन्हें अनलॉक कर रहा है। जिन ब्लॉक्स को वर्तमान में बदला नहीं जा रहा है वे एक बनावट में चपटे हैं और व्यक्तिगत परतों को सिस्टम मेमोरी में रखा जाता है, जो जीएफएक्स मेमोरी को कम कर देता है, लेकिन सिस्टम और जीएफएक्स मेमोरी के बीच बैंडविड्थ उपयोग में काफी वृद्धि कर सकता है। मैं निरंतर लॉकिंग देख सकता हूं और सिस्टम को बहुत खराब तरीके से धीमा कर सकता हूं। एक और संभावित मुद्दा यह है कि मैंने 200 परतों का उपयोग करके कुछ लोगों को सुना है, और मैं ऊपर दिए गए को अनुकूलित करने के किसी भी अच्छे तरीके के बारे में नहीं सोच सकता।

मेरा दूसरा विचार बनावट को लिखना था - सिस्टम मेमोरी में, उन्हें एक बनावट में लिखें, और उस बनावट को प्रत्येक ब्लॉक में जीएफएक्स मेमोरी में प्रतिलिपि बनाने के लिए कॉपी करें। ऐसा लगता है कि अन्य तरीकों के साथ कई मुद्दों को खत्म करना प्रतीत होता है, लेकिन साथ ही मैं सभी कार्यों को सीपीयू में ले जा रहा हूं, इसे संतुलित करने के बजाय। यह तब तक एक बड़ा सौदा नहीं है जब तक कि यह अभी भी जल्दी से चलता है। फिर भी, दो सौ परतें रखने का मुद्दा है। हालांकि, इस मामले में, मैं शायद अंतिम पिक्सल को केवल अपडेट कर सकता हूं जो वास्तव में बदल रहे हैं, जो मुझे लगता है कि साई और फ़ोटोशॉप जैसे बड़े नाम प्रोग्राम हैं।

मैं ज्यादातर सिफारिशों, सुझावों की तलाश कर रहा हूं जो उपर्युक्त, बेहतर तरीके या ऐसे प्रोजेक्ट से संबंधित लेखों के लिंक को बेहतर बना सकते हैं। जबकि मैं इसे सी ++ में लिख रहा हूं, मुझे अन्य भाषाओं से अनुवाद करने में कोई परेशानी नहीं है। अपना समय ~

+0

वास्तव में अच्छा सवाल है! मुझे सिर्फ इसके लिए एक ही एप्लीकेशन को कोड करना है, लेकिन दुर्भाग्यवश मेरे पास समय नहीं है; ( –

उत्तर

4

डेटा संरचना
आप निश्चित रूप से अपने कैनवास स्टोर करने के लिए एक quadtree (या किसी अन्य श्रेणीबद्ध डेटा संरचना) का उपयोग करना चाहिए और अपने नोड्स 512x512 पिक्सेल से बहुत छोटे खंडों को शामिल करना चाहिए के लिए धन्यवाद। हो सकता है कि 1x1 पिक्सल जितना छोटा न हो, क्योंकि तब पदानुक्रमित ओवरहेड आपको मार देगा - आपको परीक्षण के माध्यम से एक अच्छा संतुलन मिलेगा।

ड्राइंग
अपने उपयोगकर्ताओं को केवल एक (उच्चतम) रिज़ॉल्यूशन पर आकर्षित करने दें। एक असीमित बड़ी वर्दी ग्रिड (दो आयामी सरणी) की कल्पना करो। चूंकि आप माउस की स्थिति और आपके उपयोगकर्ताओं द्वारा मूल से स्क्रॉल किए गए राशि को जानते हैं, इसलिए आप पूर्ण निर्देशांक प्राप्त कर सकते हैं। उस क्षेत्र में क्वाड्री को घुमाएं (अंत में नए नोड्स जोड़ना) और ब्लॉक डालें (उदाहरण के लिए 32x32) क्योंकि उपयोगकर्ता उन्हें क्वाड्री में खींचता है।मैं उपयोगकर्ता को 2 डी सरणी में खींचता हूं (उदाहरण के लिए उसके स्क्रीन रिज़ॉल्यूशन के रूप में बड़ा) और क्वाड्री को घुमाने/बदलने के लिए एक अलग थ्रेड का उपयोग करें और किसी भी देरी को रोकने के लिए डेटा को बफर से कॉपी करें।

quadtree Traversing और एक बनावट के लिए सभी टाइल्स को कॉपी करने और GPU के लिए भेज प्रतिपादन
? नहीं! आप देखते हैं, एक बनावट को भेजना जो स्क्रीन रिज़ॉल्यूशन जितना बड़ा है, समस्या नहीं है (बैंडविड्थ वार)। लेकिन क्वाड्री को घुमाने और अंतिम छवि को इकट्ठा करना (कम से कम यदि आप कई एफपीएस चाहते हैं)। जवाब सिस्टम मेमोरी में क्वाड्री को स्टोर करना और जीपीयू से स्ट्रीम करना है। मतलब: असीमित रूप से एक और धागा ट्रैवर्सल और प्रतियों को वर्तमान में जीपीयू में डेटा को जितनी जल्दी हो सके डेटा में देखा जाता है। यदि आपका उपयोगकर्ता कैनवास को पूर्ण रिज़ॉल्यूशन में नहीं देखता है तो आपको पेड़ के स्तर पर पेड़ को पार करने की आवश्यकता नहीं है, जो आपको स्वचालित स्तर का विस्तार (एलओडी) देता है।

कुछ यादृच्छिक विचार प्रस्तावित रणनीति

  • quadtree दृष्टिकोण बहुत अच्छा है क्योंकि यह बहुत स्मृति कुशल है के बारे में।
  • स्ट्रीमिंग विचार एचडीडी तक बढ़ाया जा सकता है ... SeaDragon
  • एक परिष्कृत कार्यान्वयन को CUDA जैसे कुछ की आवश्यकता होगी।
  • यदि आपका जीपीयू आवश्यक प्रदर्शन/प्रोग्राम योग्यता प्रदान नहीं करता है, तो बस सीपीयू पर ट्रैवर्सल को कार्यान्वित करें - जब तक छवि पूरी तरह से प्रदर्शित न हो जाए, तब तक थोड़ी देर देरी हो लेकिन स्वीकार्य हो। कई धागे का उपयोग करके असीमित रूप से प्रोग्राम करना न भूलें ताकि सीपीयू पर प्रतीक्षा करते समय स्क्रीन फ्रीज न हो। आप विभिन्न प्रभावों के साथ खेल सकते हैं: पूरी छवि को एक बार में दिखाएं, पहले और धीरे-धीरे विस्तार से विस्तार करें (चौड़ाई पहली खोज (बीएफएस)) या इसे टाइल द्वारा गहराई से प्रस्तुत करें (गहराई पहली खोज (डीएफएस)) - शायद कुछ अच्छे प्रभावों के साथ मिश्रित ।
  • सॉफ्टवेयर कार्यान्वयन बहुत आसान होना चाहिए, जब केवल पूर्ण संकल्प पर कैनवास को देखने की इजाजत हो। यदि कोई उन चरणों में ज़ूम आउट कर सकता है जो ट्रैवर्सल में मामूली परिवर्तन है। यदि कोई निर्बाध रूप से ज़ूम कर सकता है, तो उसे पड़ोसी क्वाडट्री नोड्स टाइल्स के बीच रैखिक इंटरपोलेशन की आवश्यकता होगी - अब और तुच्छ नहीं है।
  • परतें: क्वाड्री आपको कम मेमोरी खपत देनी चाहिए जिससे आप प्रति परत एक क्वाड्री स्टोर कर सकें। लेकिन जब आपके पास कई परतें हैं तो आपको रीयलटाइम में रहने के लिए कुछ अनुकूलन की आवश्यकता होगी: आप प्रति फ्रेम 200 बनावट इकट्ठा नहीं कर सकते हैं और उन्हें GPU को भेज सकते हैं। शायद (पूरी तरह से सुनिश्चित नहीं है कि यह सबसे अच्छा समाधान है) प्रत्येक परत के लिए उस परत के नीचे क्वाड्रिस के सभी नोड्स को हटाकर जिनके टाइल के पिक्सेल ऊपर की परत से पूरी तरह से ढके हुए हैं। ड्राइंग के दौरान रनटाइम पर ऐसा करने की आवश्यकता होगी और गहराई-बफर की आवश्यकता होती है। यदि आप एक इरेज़र उपकरण प्रदान करते हैं, तो आप नोड्स को हटा नहीं सकते हैं लेकिन उन्हें "अदृश्य" के रूप में चिह्नित करना है ताकि उन्हें ट्रैवर्सल के दौरान छोड़ा जा सके।

.. मेरे सिर के शीर्ष पर जाएं। यदि आपके पास और प्रश्न हैं, तो मुझे बताएं!

+0

क्वाड्री 2 डी ग्राफिक्स के लिए वास्तव में एक शांत डेटास्ट्रक्चर की तरह प्रतीत होता है। मुझे लगता है कि मैं इसे अपने अगले प्रोजेक्ट में उपयोग करूँगा! – Cam

+0

@Cam :-) यदि आपके रंगीन पिक्सेल बहुत स्पैस/असमान रूप से वितरित किए जाते हैं तो यह 2 डी सरणी से अधिक मेमोरी कुशल होता है। यदि प्रत्येक पिक्सेल कवर किया गया है, तो यह कम से कम स्वचालित एलओडी प्रदान करता है (विशाल छवियों से निपटने पर अच्छा)। लेकिन अगर आप जिस संकल्प से निपटते हैं वह ~ <4kx4k पिक्सेल बस 2 डी सरणी का उपयोग करता है। –

+1

एक प्रभावशाली प्रतिक्रिया से कुछ भी कम नहीं, मुझे कहना होगा। मैंने कभी भी क्वाड्री नहीं माना, जो बेहद अच्छी तरह से फिट होगा। क्या आपको कोई विचार होगा कि फ़ोटोशॉप और अन्य ऐसे फैंसी प्रोग्राम इसे कैसे संभालते हैं? – Addi

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