2015-02-17 8 views
25

मेरे पास LibGDX के साथ एक एप्लिकेशन बनाया गया है। मैं डेस्कटॉप पर एप्लिकेशन चला सकता हूं और यह 90 एफपीएस @ 1080 पी पर चलता है।वेबजीएल और क्रोम: उच्च रिज़ॉल्यूशन खराब प्रदर्शन के लिए बनाता है

फ़ायरफ़ॉक्स पर यह 40-50 एफपीएस @ 1080p (अधिकतम विंडो) पर चलता है।

क्रोम पर यह 30 एफपीएस @ 1080p (अधिकतम विंडो) पर चलता है।

हालांकि क्रोम पर, यदि मैं संकल्प को कम करता हूं, तो प्रदर्शन युगल (60fps तक)। फ़ायरफ़ॉक्स पर ऐसा नहीं होता है। इसका कारण क्या हो सकता है?

मैं webkitRequestAnimationFrame का उपयोग कर रहा हूं।

जैसा कि दिखाया गया है, मुझे पता है कि मेरा पीसी संकल्प ठीक संभाल सकता है।

संपादित

मैं हालांकि वे मोबाइल GPUs पर ज्यादातर उद्देश्य से लगते, नीचे दिए गए सुझावों को लागू करने की कोशिश कर रहा हूँ।

स्रोत: https://wiki.mozilla.org/Platform/GFX/MobileGPUs#Memory_Bandwidth

हमेशा तुरंत glBindFramebuffer

के बाद glClear फोन देखें Adreno 200 दस्तावेज़, खंड 3.2.1, "यह आवश्यक है (क) उपयोग को साफ करता है जब फ्रेम बफर वस्तुओं स्विचिंग (एफबीओ) ड्राइवर को जीएमईएम सामग्री को सहेजने/पुनर्स्थापित करने से बचने के लिए, और (बी) हमेशा फ्रेम की शुरुआत में गहराई-बफर साफ़ करें। "

यह समझ में आता है, इसलिए हमें हमेशा यह करना चाहिए। संक्षेप में, इसका मतलब है कि हमें प्रत्येक glbindFramebuffer कॉल के बाद एक ग्लक्लेयर करना चाहिए, आदर्श रूप से इसके ठीक बाद, या कम से कम किसी भी ड्रॉ-कॉल से पहले।

फ्रेमबफर बाइंडिंग महंगा

तुरंत वर्तमान फ्रेमबफर का प्रतिपादन को हल करने फ्रेमबफर बंधन बलों बदल रहे हैं। इसलिए फ्रेमबफर बाइंडिंग को कम करने के लिए प्रतिपादन को सॉर्ट करना महत्वपूर्ण है। एड्रेनो 200 दस्तावेज़, खंड 3.2.4, में एक उपयोगी स्पष्टीकरण है।

संपादित

के ऊपर एक उल्लेखनीय अंतर नहीं किया।

संपादित

मुझे लगता है इस समस्या को GLSL संकलक के कारण उत्पन्न होती है। मुझे इस विषय पर बहुत ज्ञान नहीं है, लेकिन मेरा मानना ​​है कि ओपनजीएल ईएस के लिए जीएलएसएल नियमित ब्राउज़र जीएलएसएल के साथ संकलित है, कुछ ब्राउज़र विशिष्ट कोड के साथ। यह हो सकता है कि क्रोम इष्टतम से कम संकलित हो और उच्च संकल्पों पर प्रोग्राम को धीमा करने के लिए खंडन छायांकन का कारण बनता है।

अगर किसी को यह सुनिश्चित करने के लिए कुछ सुझाव हैं कि यह संकलन इष्टतम है, तो मैं इसे आज़मा सकता हूं और देख सकता हूं कि यह समस्या को हल करता है या नहीं।

संपादित

समस्या एक इंटेल HD ग्राफिक्स 4000 + चिपसेट के साथ विंडोज पर क्रोम में प्रचलित नहीं लगता है। क्रोम संस्करण: 40.0.2214.111 मीटर। कम संकल्प: 45fps ~।उच्च संकल्प: 30 एफपीएस स्थिर।

मेरा मूल परीक्षण केस एक जीटीएक्स 650 के साथ उबंटू पर क्रोम के साथ था। क्रोम संस्करण बाद में जोड़ा जाएगा।

संपादित करें क्रोम की

संस्करण जो इस समस्या को प्रदर्शित करता है: एक GTX 650 ग्राफिक्स कार्ड पर Ubuntu पर 40.0.2214.111 (64-बिट)।

संपादित

GTX 650 के साथ एक ही पीसी पर, विंडोज 7 के तहत, एक ही आवेदन क्रोम के तहत स्थिर 60fps पर चलाता है। चूंकि उबंटू के तहत जावा में संकलित एप्लिकेशन 90fps पर ठीक चलता है, मुझे विश्वास है कि यह एक लिनक्स ड्राइवर समस्या नहीं हो सकता है, बल्कि क्रोम के लिनक्स संस्करण के साथ एक मुद्दा है।

संपादित

मैं इस बारे में Chrome में एक बग रिपोर्ट भेज दिया है।

+0

क्या आपने क्रोम: // जीपीयू/लिनक्स और विंडोज से तुलना करने की कोशिश की है ताकि यह देखने के लिए कि उनके पास अलग-अलग समस्याएं हैं या नहीं? इसके अलावा, अगर क्रोम/उबंटू हार्डवेयर त्वरण का समर्थन करता है तो वहां जांचें। इसके अलावा, जांचता है कि क्रोम/उबंटू पर समस्या वास्तव में रेंडरिंग है .. शायद यह कोड के किसी अन्य हिस्से में कुछ है। मैं सुझाव देना चाहता हूं, शायद वेबगेल के बारे में [ख्रोनोस समूह मेलिंग सूची] को ईमेल भेजने का एक अच्छा विचार हो सकता है (https://www.khronos.org/webgl/public-mailing-list/)। – wendelbsilva

+1

क्या आप अपने रेंडर लूप में 'gl.getError() 'या' gl.readPixels' को कॉल कर रहे हैं? वे दोनों perf मार देंगे। क्या आप बड़ी मात्रा में डेटा अपलोड कर रहे हैं (जैसे वीडियो)? आम तौर पर आप मूल से वेबजीएल धीमे होने जा रहे हैं क्योंकि वेबजीएल कैनवास वेबपृष्ठ में मिश्रित हैं। एक पूर्णस्क्रीन कैनवास के लिए जो एक अतिरिक्त पूर्णस्क्रीन ड्रा है। उस अनुरोध के शीर्ष परएनीमेशन फ्रेम 60fps तक सीमित है (या आपके मॉनिटर की रीफ्रेश दर)। यदि आप समय की जांच करना चाहते हैं तो आपको यह जांचना चाहिए कि कितने मिलीसेकंड का इस्तेमाल किया गया था या प्रत्येक फ्रेम को छोड़ दिया गया था, मॉनिटर उन्हें प्रति सेकंड कितने फ्रेम नहीं दिखा सकता क्योंकि मॉनिटर उन्हें प्रदर्शित नहीं कर सकता – gman

+2

विंडोज़ वेबजीएल पर डायरेक्टएक्स का उपयोग करता है और [एंगल परियोजना] के माध्यम से एचएलएसएल शेडर्स को ट्रांसफर करता है (https://code.google.com/p/angleproject/)। '--use-gl = डेस्कटॉप' ध्वज के साथ क्रोम चलाने का प्रयास करें (बिना किसी पूर्व क्रोम इंस्टेंस के चल रहे) और देखें कि क्या आप एक ही प्रदर्शन समस्याओं का अनुभव करते हैं। इसके अलावा आप इस सवाल को प्रस्तुत करने के संदर्भ में आपके आवेदन के बारे में कोई विवरण नहीं दे रहे हैं, यह भी असुरक्षित है। अपने दायर बग्रेपोर्ट को लिंक जोड़ने पर विचार करें क्योंकि इससे दूसरों की मदद मिल सकती है। –

उत्तर

1

यहाँ में अन्य बातों के शामिल नहीं, जहाँ तक मैं पिछली बार में था, उन सभी requestAnimationFrame तरीकों 60fps पर सीमित कर रहे हैं, और केवल कि तुलना में कम जा सकते हैं।

आप इसे इस बिट के साथ परीक्षण कर सकते हैं: http://cssdeck.com/labs/gvxnxdrh/। आप fps var जितनी चाहें उतनी उच्च संशोधित कर सकते हैं, लेकिन एनीमेशन मेरे डेस्कटॉप पर किसी भी ब्राउज़र में 60fps से अधिक तेज़ नहीं होगा।

+0

मेरे पास वीएसआईएनसी के साथ कुछ भी नहीं है। किसी कारण से क्रोम उच्च संकल्प वाले विंडोज़ को अपडेट करना पसंद नहीं करता है। अगर मेरे पास अधिकतम विंडो है, तो यह 20fps है। आधा संकल्प के साथ अधिकतम खिड़की, अभी भी 20 एफपीएस। हालांकि, अगर मैं खिड़की को आधे से कम कर देता हूं, तो यह बेहद कम हो जाता है। फ़ायरफ़ॉक्स इस समस्या को प्रदर्शित नहीं करता है। – RobotRock

+0

वास्तव में उस व्यवहार को पुन: उत्पन्न नहीं कर सकता ... वाट रिज़ॉल्यूशन/विंडो आकार क्रोम में तोड़ना शुरू कर देता है? – yergo

+0

जब आप GPU- सीमित होते हैं तो फ़्रेमेट विंडो आकार (रिज़ॉल्यूशन) के साथ परिवर्तनीय होता है। यह एक ब्राउज़र में होता है, न कि अन्य, ओपनजीएल कार्यान्वयन की वजह से अधिकतर। अनुरोध की आवृत्ति के लिए एनीमेशन फ्रेम ... यह सीपीयू और जीपीयू गति पर निर्भर करता है (यह निर्धारित करने के लिए कि आपके थ्रॉटलिंग का कारण बन रहा है, अपने ब्राउज़र में डीवी टूल्स देखें)। बीटीडब्ल्यू, एफपीएस 60 तक सीमित नहीं है। मुझे यकीन नहीं है कि एक सीमा है, मैंने इसे उच्च अंत कंप्यूटर पर 75 पर चलाया है – DAG

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