2012-10-10 13 views
7

में ओपनजीएल वर्टेक्स डेटा में संरेखण कितना महत्वपूर्ण है ओपनजीएल ईएस प्रोग्रामिंग गाइड चर्चा करता है कि आपको गलत हस्ताक्षर किए गए वर्टेक्स डेटा से बचना चाहिए और डेटा को 4 बाइट ब्लॉक में संरेखित करने का एक उदाहरण देता है।आईओएस

OpenGL ES Programming Guide

Misaligned vs Aligned vertex data

हालांकि अधिकांश डेमो सामग्री और ट्यूटोरियल में मैं ऑनलाइन पाया है मैं किसी को ऐसा करने नहीं दिख रहा। नीचे दिया गया उदाहरण 71 वर्ग पर डेमो प्रोजेक्ट से है:

static const SSTexturedVertexData3D EnemyFighterVertexData[] = { 
    {/*v:*/{1.987003, -0.692074, -1.720503}, /*n:*/{0.946379, -0.165685, -0.277261}, /*t:*/{0.972816, 0.024320}}, 

और आप इसे कैसे करेंगे? एक डमी 0.0 को v और n और 2 में से टी में जोड़ें?

मेरा अनुमान है कि यदि आप प्रति ऐप में एक बार वर्टेक्स डेटा लोड कर रहे हैं तो इससे कोई फर्क नहीं पड़ता है, लेकिन यदि प्रत्येक बाध्यकारी फ्रेम पर अलग-अलग सरणी के लिए बाध्यकारी और बाध्यकारी है तो इससे कोई फर्क नहीं पड़ता। मेरी योजना है कि मेरे सभी सरणी किसी भी तरह से गठबंधन करें, लेकिन मैं उत्सुक हूं।

+2

क्या आप वाकई उपरोक्त 4-बाइट सीमा से पहले ही गठबंधन नहीं हैं? यदि आपके द्वारा दिखाया गया कोड GLfloats का उपयोग कर रहा है, तो वे 32-बिट (4 बाइट) डेटा प्रकार हैं, इसलिए इससे कोई फर्क नहीं पड़ता कि उनमें से कितने हैं, वे हमेशा 4-बाइट सीमा से गठबंधन होते हैं। मार्गदर्शिका शॉर्ट्स और अन्य डेटा प्रकारों का जिक्र कर रही है। –

+0

मैं सोच रहा था कि। धन्यवाद! आपको इसे एक उत्तर के रूप में रखना चाहिए ताकि मैं इसे चेकमार्क कर सकूं। – badweasel

+1

मैं कर सकता था, लेकिन यह अधिक मौलिक सवाल का जवाब नहीं देता है कि वर्टेक्स डेटा के बाइट संरेखण प्रदर्शन के लिए कितना महत्वपूर्ण है। इसके लिए कुछ बेंचमार्कों को पूरी तरह से चित्रित करने की आवश्यकता हो सकती है। –

उत्तर

2

सामान्य एक कशेरुका floats से बना है जो गठबंधन करने जा रहे हैं, इसलिए आपको इससे बहुत चिंतित होने की आवश्यकता नहीं है। असल में बहुत सी किताबें सामान्य struct एस का उपयोग वर्टेक्स डेटा रखने के लिए करती हैं, जो पैडिंग मुद्दे के कारण संगत होने की गारंटी नहीं है, लेकिन यदि आपके पास फ्लोट हैं, तो यह ठीक है क्योंकि आपके पास पैडिंग होने की संभावना नहीं है। बेशक, कुछ लोग (स्वयं शामिल) सी ++ से एसटीएल vector का उपयोग करना पसंद करते हैं, लेकिन यदि आप आईओएस पर हैं, तो आप सी ++ का उपयोग कर सकते हैं, तो आप शायद ऑब्जेक्टिव-सी का उपयोग कर रहे हैं, इस प्रकार गैर-स्ट्रक्चर तरीके से संगतता में सामान्य सी एरे शामिल होंगे साथ काम करने के लिए बहुत मजेदार नहीं हैं।

यदि आप वर्टेक्स डेटा के साथ-साथ आपके ड्रॉइंग ऑब्जेक्ट के लिए अन्य डेटा रखने के लिए कस्टम स्ट्रक्चर बनाते हैं, और आप short एस या अन्य प्रकार का उपयोग करते हैं, तो आपको कोई समस्या बनने के लिए पैडिंग मिल सकती है। लेकिन अगर आप केवल float एस के साथ चिपके रहते हैं तो आप ठीक होंगे, और आप अच्छी कंपनी में होंगे क्योंकि ओपनजीएल के अधिकांश शैक्षिक स्रोत ऐसा करते हैं।

+0

मैं आईओएस हूं लेकिन मैं ओपनजीएल के लिए उद्देश्य सी संरचनाओं के उपयोग से बचता हूं। मैं आमतौर पर "स्थिर कॉन्स GLfloat Vertex []" का उपयोग करता हूं और फिर उसे एक वीबीओ में लोड करता हूं। आश्चर्यजनक रूप से, 2 डी sprites के लिए मैं वास्तव में एक अनुकूलित एक्सेल दस्तावेज़ का उपयोग अपने सभी vertex डेटा बनाने के लिए। 3 डी के लिए मैं ओबीजे फ़ाइल आयात करता हूं और गेम में त्वरित लोडिंग के लिए इसे बाइनरी फ़ाइल के रूप में सहेजता हूं। मैं सिर्फ प्रयास के लिए आपको चेकमार्क देने के इच्छुक हूं। ब्रैड लार्सन का मुद्दा हालांकि मेरे प्रश्न पर टिप्पणी में यह था कि यह परीक्षण के बिना उत्तरदायी नहीं है। एक वैध बिंदु हो सकता है। – badweasel

+0

एक और नोट .. मुझे यह स्टैक ओवरफ्लो के बारे में नफरत है, जहां आप एक प्रश्न का उत्तर देना चाहते हैं और आप खोजना चाहते हैं .. फिर अपना जवाब केवल एक वर्ष या दो साल का एहसास करने के लिए तैयार करें। तो जाहिर है कि मैंने जो जवाब इस्तेमाल किया था वह ब्रैड था कि मैं पहले से ही 4-बाइट सीमाओं में था ... एक साल पहले। :) – badweasel

+0

@badweasel उत्सुकता से, आप आईओएस में ओबीजे आयात करने के लिए किस तकनीक का उपयोग कर रहे हैं और फिर बाइनरी को क्रमबद्ध करें? क्या आप रूपांतरण के लिए जीएलकिट या दूसरी लाइब्रेरी का लाभ उठा रहे हैं, या आप ओबीजे टेक्स्ट डेटा को अपने आप परिवर्तित कर रहे हैं? और फिर आप किस विधि के साथ बाइनरी बना रहे हैं? –