के लिए मेमोरी बफर में स्विफ्ट ऐरे की कुशलतापूर्वक प्रतिलिपि बना रहा है मैं ऐप्पल के नए धातु ढांचे का उपयोग करके एक आईओएस एप्लिकेशन लिख रहा हूं। मेरे पास Matrix4 ऑब्जेक्ट्स की एक सरणी है (Ray Wenderlich's tutorial देखें) कि मुझे MTLDevice.newBufferWithLength() विधि के माध्यम से एक शेडर में पास करने की आवश्यकता है। मैट्रिक्स 4 ऑब्जेक्ट ऐप्पल के जीएलकिट का लाभ उठा रहा है (इसमें एक GLKMatrix4 ऑब्जेक्ट है)।आईओएस धातु
मैं जीपीयू कॉल के साथ इंस्टेंसिंग का लाभ उठा रहा हूं।
मैं बाद में एक struct जो (बस Matrix4 वस्तु परे उदाहरण के प्रति अधिक डेटा शामिल हैं को यह बदल जाएगा।
मैं कुशलता से इस बफर में वस्तुओं की [Matrix4] सरणी कॉपी कर सकते हैं कैसे?
वहाँ यह करने के लिए एक बेहतर तरीका है फिर से, मैं इस विस्तार करेंगे भविष्य में और अधिक डेटा के साथ एक struct का उपयोग करने के
नीचे मेरी कोड का एक सबसेट है?।:
let sizeofMatrix4 = sizeof(Float) * Matrix4.numberofElements()
// This returns an array of [Matrix4] objects.
let boxArray = createBoxArray(parentModelViewMatrix)
let sizeOfUniformBuffer = boxArray.count * sizeOfMatrix4
var uniformBuffer = device.newBufferWithLength(sizeofUniformBuffer, options: .CPUCacheModeDefaultCache)
let bufferPointer = uniformBuffer?.contents()
// Ouch - way too slow. How can I optimize?
for i in 0..<boxArray.count
{
memcpy(bufferPointer! + (i * sizeOfMatrix4), boxArray[i].raw(), sizeOfMatrix4)
}
renderEncoder.setVertexBuffer(uniformBuffer, offset: 0, atIndex: 2)
नोट: boxArray [i] .raw() विधि ऑब्जेक्टिव-सी कोड में इस के रूप में परिभाषित किया गया है:
- (void *)raw {
return glkMatrix.m;
}
आप देख सकते हैं मैं एक सरणी वस्तु के माध्यम से पाशन कर रहा हूँ और फिर एक memcpy कर रहे हैं। मैंने ऐसा इसलिए किया क्योंकि मुझे सरणी के एक संगत सेट के रूप में सरणी का इलाज करने में समस्याएं आ रही थीं।
धन्यवाद!
आपको simd.float4x4 का उपयोग करना चाहिए। – Jessy