2010-07-13 18 views
14

यह शायद अधिक से पूछा गया है और अधिक है, लेकिन मैं कुछ भी तो यहाँ इसे फिर से चला जाता है उपयोगी नहीं मिला ...ज्यामिति प्रवाह के लिए ट्यूनिंग ओपन प्रदर्शन

अपने आवेदन में मैं एक काफी बड़े जाल रेंडर करने के लिए की जरूरत है (एक कुछ मिलियन त्रिकोण या अधिक) और मुझे इसके बारे में सभ्य फ्रेम दर प्राप्त करने में कुछ समस्याएं आ रही हैं। सीपीयू काफी ज्यादा निष्क्रिय है इसलिए मैं निश्चित रूप से जीपीयू-बाध्य हूं। रिज़ॉल्यूशन को बदलने से प्रदर्शन प्रभावित नहीं होता है, इसलिए यह खंड नहीं है- या रास्टर-बाउंड।

जाल गतिशील (लेकिन स्थानीय रूप से स्थैतिक) है इसलिए मैं पूरी चीज़ को वीडियो कार्ड में संग्रहीत नहीं कर सकता और उसे एक कॉल के साथ प्रस्तुत नहीं कर सकता। आवेदन विशिष्ट कारणों से डेटा को पत्थरों में वोक्सल्स के साथ एक ऑक्टेट के रूप में संग्रहीत किया जाता है, इसका मतलब है कि मुझे मूल रूप से मुक्त रूप से निराशा होती है। कशेरुक डेटा में निर्देशांक, मानक और रंग होते हैं - कोई बनावट या शेडर्स का उपयोग नहीं किया जाता है।

मेरा पहला दृष्टिकोण केवल एक बड़े STREAM_DRAW वीबीओ का उपयोग करके स्मृति से सबकुछ प्रस्तुत करना था, जो बहुत धीमी हो गई। मेरा प्रारंभिक विचार यह था कि मैं शायद बस को ओवरटाक्स कर रहा था (प्रति फ्रेम ~ 150 एमआईबी दबा रहा था), इसलिए मैंने एक कैशिंग योजना लागू की जो हाल ही में ग्राफिक्स कार्ड पर स्थिर वीबीओ में ऑब्जेक्ट प्रस्तुत करने के लिए इस्तेमाल की गई ज्यामिति को स्टोर करता है, प्रत्येक वीबीओ ने कुछ जोड़े कुछ एमआईबी मूल्य के डेटा के लिए 100 कीबी (वीबीओ प्रति अधिक भंडार करने से अधिक कैश थ्रैशिंग मिलती है, इसलिए यहां एक व्यापार बंद है)। नीचे दी गई तस्वीर एक उदाहरण है कि डेटा कैसा दिखता है, जहां सब कुछ रंगीन लाल कैश किए गए वीबीओ से खींचा जाता है।

Example of the rendered data http://gimaker.users.sourceforge.net/0010.png

नीचे दिए गए नंबरों रूप में, मैं नहीं प्रदर्शन में एक शानदार वृद्धि जब कैश का उपयोग कर दिख रहा है। लगभग 1 लाख त्रिकोण के एक पूरी तरह से स्थिर जाल के लिए मैं मिल निम्नलिखित फ्रेम दर:

    कैशिंग के बिना
  • : 1.95 हर्ट्ज
  • कैशिंग का उपयोग कर शिखर सरणियों: 2.0 हर्ट्ज
  • (> जाल के 75% कैश्ड है)
  • कैशिंग STATIC_DRAW VBOs का उपयोग कर: 2.4 हर्ट्ज

तो मेरे सवालों का है कि कैसे मैं इस गति बढ़ाने के हो? आईई .:

  • सभ्य प्रदर्शन प्राप्त करने के लिए अनुशंसित वर्टेक्स प्रारूप क्या है? मैं रंगों के लिए GL_FLOAT और GL_UNSIGNED_BYTE के रूप में स्थितियों और मानदंडों के साथ इंटरलीव्ड स्टोरेज का उपयोग करता हूं, जिसमें एक पैडिंग बाइट 4-बाइट संरेखण (28 बाइट्स/वर्टेक्स कुल) प्राप्त करने के लिए होता है।
  • चाहे मेरे सभी बक्से के लिए मानक के लिए एक ही बफर का उपयोग करने में सहायता हो सकती है (सभी बक्से धुरी-गठबंधन हैं इसलिए मैं एक सामान्य बफर आवंटित कर सकता हूं, जो कि सबसे बड़ा कैश प्रविष्टि का आकार आवंटित कर सकता है और उन सभी के लिए इसका उपयोग कर सकता है)।
  • मुझे कैसे पता चलेगा कि पाइपलाइन का कौन सा हिस्सा बाधा है? मेरे पास एक शानदार वीडियो कार्ड नहीं है (इंटेल जीएम 9 65 ओपन सोर्स लिनक्स ड्राइवरों के साथ) इसलिए यह संभव है कि मैंने इसकी सीमा को मारा। मैं सामान्य हार्डवेयर (2-3 साल पुराने एकीकृत ग्राफिक्स, आधुनिक एकीकृत ग्राफिक्स, आधुनिक असतत ग्राफिक्स) से कितना थ्रूपुट उम्मीद कर सकता हूं?
  • आप इस, नुकसान कैसे से निपटने के हैं पर कोई अन्य युक्ति, आदि

मैं LOD सुझाव दे जवाब में कोई दिलचस्पी नहीं हूँ (मैं पहले से ही इस परीक्षण किया), विक्रेता विशिष्ट सुझाव या बाद में कुछ भी से ओपन सुविधाओं का उपयोग 1.5 से अधिक

+0

क्या आपके प्राइमेटिव केवल अक्ष-संरेखित बक्से में होते हैं? – Stringer

+0

@ स्टिंगर बेल: हां (लेकिन विश्व अक्षों के साथ जरूरी नहीं है)। – Staffan

+1

मुझे यकीन नहीं है लेकिन मुझे लगता है कि आपने ग्राफिक्स कार्ड सीमा को मारा है। मैंने थोड़ी सी गड़बड़ी की है और ऐसा लगता है कि इंटेल जीएम 9 65 के खेल के लिए espacially काफी कम प्रदर्शन है। (आपका खेल एक खेल नहीं है लेकिन हालांकि प्रस्तुत करने के लिए काफी "कठिन" लगता है)। एनवीडिया में एक सूची है कि उनके कार्ड कितने त्रिकोण/दूसरे-दूसरे को प्रस्तुत कर सकते हैं-शायद आप "सैद्धांतिक" सीमा को जानने के लिए इस सूची के साथ अपने कार्ड को वर्गीकृत कर सकते हैं। – InsertNickHere

उत्तर

5

आप शायद इस प्रतिक्रिया पसंद करने के लिए नहीं जा रहे हैं ....

मैं आपकी समस्या को मिल गया है: खुला स्रोत लिनक्स ड्राइवरों के साथ इंटेल GM965

अपनी मौजूदा नौकरी की मात्रा हिट नहीं करता है डेटा, हमने वीबीओ में कई मिलियन वर्टेक्स प्रस्तुत किए हैं और इंटेल ग्राफिक्स हार्डवेयर/ड्राइवर बेकार साबित हुए हैं। अपने आप को एक एनवीडिया कार्ड प्राप्त करें (और बाइनरी ड्राइवर का उपयोग करने के लिए प्राप्त करें, यह सिर्फ काम करता है) और आप सभी सेट हो जाएंगे। हालांकि शीर्ष पीढ़ी क्वाड्रो (यदि काम का भुगतान हो रहा है) या शीर्ष अंत जीटीएक्स 400 श्रृंखला (यदि आप भुगतान कर रहे हैं या सिर्फ काम पर कुछ रुपये बचाने की कोशिश कर रहे हैं) तो वर्तमान पीढ़ी भी नहीं होनी चाहिए, केवल ठीक w/नवीनतम करना चाहिए ड्राइवरों। यदि आप अपनी मशीन को अपग्रेड करना चाहते हैं तो परीक्षण करने के लिए आप मशीन डब्ल्यू/इस हार्डवेयर को खोजने का भी प्रयास कर सकते हैं।

+0

ऐसा लगता है कि आप सही हैं। मैंने एक बेहतर मशीन के साथ एक मशीन पर परीक्षण किया, क्वाड्रो नहीं, लेकिन फिर भी बेहतर, और बिना कैशिंग के 15 हर्ट्ज और बिना आधा मिला। यह किसी समस्या से अधिक असुविधा है क्योंकि मैं केवल डेवलपर हूं और नहीं (वर्तमान में) इसका प्राथमिक उपयोगकर्ता हूं। – Staffan

+0

@Staffan: इसका मतलब यह नहीं है कि आपने मेरे जीएमए 965 को अधिकतम कर दिया है। शायद आप प्रदर्शन के लिए कुछ खराब कर रहे हैं। स्पष्ट रूप से मैं इंटेल मीडिया त्वरक प्रोफाइलर (यदि आपका आवेदन निश्चित रूप से पोर्टेबल है) को आज़माने का प्रयास करेगा। यह मत भूलना कि जीएमए टाइल-आधारित रेंडरर्स हैं .. – Stringer

+0

@ स्टिंगर बेल: ऐसा लगता है कि वास्तव में यह वीडियो कार्ड/ड्राइवर सीमा निर्धारित कर रहा है। मेरे कैशिंग तंत्र के कुछ ट्यूनिंग के बाद मुझे एक GeForce 3 Ti200 पर ~ 28 मिलियन त्रिकोण/एस मिलते हैं, इस पर कोई आधिकारिक कल्पना नहीं है कि यह कितने त्रिकोणों को धक्का दे सकता है लेकिन ऐसा लगता है कि यह सीमा के करीब उचित रूप से हो सकता है। – Staffan

0

मैं पहले एक प्रदर्शन प्रोफाइलर (जैसे gDEBugger) का उपयोग करूंगा, ताकि आप यह पता लगा सकें कि क्या आप वर्टेक्स, खंड या बस सीमित हैं।अनुमान लगाना मुश्किल है कि इस तरह के एक विशेष मामले (इंटेल + ओपन सोर्स ड्राइवर) में क्या अनुकूलन करना है।

क्या आपने वीए मोड को भी आजमाया था? क्या आप glDrawElements का उपयोग कर रहे हैं? glDrawArrays? क्या डेटा वर्टेक्स-कैश अनुकूल है (पूर्व और पोस्ट ट्रांसफॉर्म)?

+0

बेल: यदि मैं लिनक्स के लिए एक ओपन सोर्स (या फ्री) था तो मैं ओपनजीएल प्रोफाइलर का उपयोग करूंगा (देखें [मेरा अन्य प्रश्न] (http://stackoverflow.com/questions/3235864/open-source-opengl-profiler- के लिए-linux))। ओपन सोर्स ड्राइवर इंटेल-विकसित आधिकारिक ड्राइवर हैं, लेकिन मुझे लगता है कि आप पहले से ही जानते हैं। मैं glDrawArrays का उपयोग कर रहा हूं क्योंकि मैं ऊर्ध्वाधर के बीच डेटा साझा नहीं कर सकता (सभी शिखरों में अलग-अलग मानक या पोस्टियन हैं)। वीए मोड क्या है? डेटा कैश फ्रेंडली AFAICT है, यानी इंटरलीव स्टोरेज (सुनिश्चित नहीं है कि रूपांतरण कैसे प्रभावित होंगे)। – Staffan

+0

मैंने बंद स्रोत होने के बावजूद जीडीईबगर की कोशिश की, और यह मेरे लिए काम नहीं करता है (मुझे एक अप्रत्यक्ष संदर्भ देता है और फिर एक SIGSEGV का कारण बनता है)। – Staffan

+0

वीए मोड सादा पुराना 1.1 वर्टेक्स सरणी है। पोस्ट ट्रांसफॉर्म कैश का उपयोग तभी किया जाता है जब आपके पास इंडेक्स हों (देखें http://www.opengl.org/wiki/Post_Transform_Cache)। क्या आप अपने बक्से को रेंडर करने के लिए GL_QUAD या GL_TRIANGLES का उपयोग करते हैं? – Stringer

0

मुझे आपके "जाल" के बारे में पता नहीं है लेकिन ऐसा लगता है कि वे सभी क्यूब्स हैं। यदि आपके लिए यह संभव है, तो एक प्रदर्शन सूची में एक यूनियन क्यूब प्रस्तुत करें और उस प्रदर्शन सूची के स्केल किए गए संस्करण को प्रस्तुत करें। यह अक्सर 10x स्पीडअप देता है, क्योंकि बस को कशेरुक डेटा या वीडियो मेमोरी समाप्त नहीं किया जाता है।

बेशक यह डेटा बदलने की आपकी क्षमता पर निर्भर करता है। यह मामला नहीं हो सकता है अगर यह वास्तव में तस्वीर पर पसंद नहीं है।

+0

वे सभी क्यूबोइड्स हैं, हां। जैसा कि मैंने ओपी में वर्णित किया है, मैं बस को ओवरटाक्स करने से बचने के लिए वीबीओ के साथ एक कैश का उपयोग करता हूं - उपरोक्त छवि को पीढ़ी में कोई glVertex3() कॉल शामिल नहीं था। – Staffan

+0

लेकिन वीबीओ! = प्रदर्शन सूची ... अंतर यह है कि वीबीओ अभी भी एक बड़ी तीर का उपयोग करता है, भले ही यह वीडियो मेमोरी में हो। अधिकांश मामलों में ऐसे सेटअप के लिए मुझे 10000 x एक डीएल को कॉल करने के लिए सबसे ज्यादा धमाका मिलता है जो एक कशेरुक सरणी में 10000 क्यूब होता है। – rioki

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