मैंने वेबजीएल ( इस एसओ उत्तर पर आधारित ) में कुछ एफपीएस-मापने वाला कोड सेट किया है और अपने विखंडन शेडर के प्रदर्शन के साथ कुछ विषमताओं की खोज की है। कोड 1024x1024 कैनवस पर एक एकल क्वाड (या बल्कि दो त्रिकोण) को प्रस्तुत करता है, इसलिए सभी जादू टुकड़े टुकड़े करने वाले में होता है।
इस सरल shader पर विचार करें (GLSL; शीर्ष shader सिर्फ एक पास-थ्रू है):
// some definitions
void main() {
float seed = uSeed;
float x = vPos.x;
float y = vPos.y;
float value = 1.0;
// Nothing to see here...
gl_FragColor = vec4(value, value, value, 1.0);
}
तो यह सिर्फ एक सफेद कैनवास प्रदान करता है। यह मेरी मशीन पर लगभग 30 एफपीएस है।
अब संख्या क्रंचिंग को रैंप करें और स्थिति-निर्भर शोर के कुछ सप्तक के आधार पर प्रत्येक टुकड़े की गणना करें:
void main() {
float seed = uSeed;
float x = vPos.x;
float y = vPos.y;
float value = 1.0;
float noise;
for ( int j=0; j<10; ++j)
{
noise = 0.0;
for ( int i=4; i>0; i-- )
{
float oct = pow(2.0,float(i));
noise += snoise(vec2(mod(seed,13.0)+x*oct,mod(seed*seed,11.0)+y*oct))/oct*4.0;
}
}
value = noise/2.0+0.5;
gl_FragColor = vec4(value, value, value, 1.0);
}
यदि आप उपरोक्त कोड चलाना चाहते हैं, तो मैं इस कार्यान्वयन काsnoise
उपयोग कर रहा हूं ।
यह एफपीएस को कुछ इस तरह नीचे लाता है 7. जो समझ में आता है।
अब अजीब हिस्सा है ... चलो प्रत्येक 16 टुकड़ों में से केवल एक को शोर के रूप में गणना करते हैं और दूसरों को सफेद छोड़ देते हैं, निम्नलिखित स्थिति में शोर गणना को लपेटकर:
if (int(mod(x*512.0,4.0)) == 0 && int(mod(y*512.0,4.0)) == 0)) {
// same noise computation
}
आप यह बहुत तेजी से होने की उम्मीद करेंगे, लेकिन यह अभी भी केवल 7 एफपीएस है।
एक और परीक्षण के लिए, आइए इसके बजाय पिक्सेल को निम्न सशर्त से फ़िल्टर करें:
if (x > 0.5 && y > 0.5) {
// same noise computation
}
यह पहले की तरह ही सटीक पिक्सेल पिक्सल की संख्या देता है, लेकिन अब हम लगभग 30 एफपीएस तक वापस आ गए हैं।
यहाँ क्या हो रहा है? क्या पिक्सल्स के 16 वें हिस्से को फिल्टर करने के लिए दो तरीके नहीं, ठीक उसी संख्या में चक्र देने चाहिए? और क्यों धीमी के रूप में सभी पिक्सल को शोर के रूप में धीमा करने के लिए एक है?
बोनस प्रश्न: मैं इस बारे में क्या कर सकता हूं? वहाँ भयानक प्रदर्शन के आसपास काम करने के लिए किसी भी तरह से करता है, तो मैं वास्तव में है है केवल कुछ ही महंगा टुकड़े के साथ अपने कैनवास छींटेदार करना चाहते हैं?
(बस यह सुनिश्चित करने के लिए, मैंने पुष्टि की है कि वास्तविक मॉडुलो अभिकलन फ्रेम दर को प्रभावित नहीं करता है, हर 16 वें पिक्सेल को सफेद के बजाय काले रंग में रेंडर करके।)