2014-05-04 9 views
7

से एक SKTexture बनाएँ क्या कोई SKShapeNode से SKTexture बनाने का कोई तरीका है? आकार नोड्स स्मृति समस्याओं के कारण ज्ञात हैं और मैं उनसे एक स्थिर ग्राफिक बनाने के लिए एक रास्ता तलाश रहा हूं (.png अधिमानतः)।एक SKShapeNode

+0

जिज्ञासा से, आप SKShapeNodes के साथ किस प्रकार की मेमोरी समस्याएं हैं? – prototypical

+0

यहां इसके बारे में कुछ जानकारी है http://sartak.org/2014/03/skshapenode-you-are-dead-to-me.html मेरे पास मेरे दृश्य (लगभग बोर्ड गेम) में लगभग 80 स्थैतिक गैर-एनिमेटिंग आकार नोड्स हैं और यह तीसरे जीन आईपैड पर लगभग 20 एफपीएस चलाता है। –

+0

20fps पर चलना एक स्मृति समस्या नहीं है, यह एक प्रदर्शन मुद्दा है। मैंने स्मृति के संदर्भ में 'SKShapeNode' की सीमाओं का परीक्षण नहीं किया है, हालांकि ऐसा लगता है कि CGPath असली मुद्दा है। क्या आपने सीजीपाथ के साथ बनाए गए पथ का उपयोग करके 'एसकेशिप नोड' नहीं किया है? आखिरकार, अपने फ्रेमरेट मुद्दे को हल करने का एक और तरीका है 'SKEffectNode' में 'SKShapeNode' को' SKEffectNode 'में लपेटना और 'SKEffectNode' की' mustRasterize' प्रॉपर्टी का उपयोग करना। यदि आपके पास आकृति नोड्स हैं तो यह छवि को 'फ़्लैटन' करेगा और प्रदर्शन में भारी वृद्धि करेगा। – prototypical

उत्तर

11

आप SKView विधि textureFromNode:

कहा जाता है यहाँ संदर्भ से है का उपयोग कर सकते हैं:

textureFromNode:

रेंडर और एक स्प्राइट किट बनावट उस नोड के सामग्री शामिल है देता है।

- (SKTexture *)textureFromNode:(SKNode *)node 

पैरामीटर

नोड

नोड वस्तु सामग्री आप बनावट को प्रस्तुत करना चाहते हैं का प्रतिनिधित्व।

वापसी मूल्य

एक स्प्राइट किट बनावट है कि प्रदान की गई छवि रखती है।

चर्चा प्रस्तुत किए गए नोड को दृश्य के प्रस्तुत दृश्य में प्रकट होने की आवश्यकता नहीं है। नया बनावट नोड की गणना AccumulatedFrame विधि द्वारा लौटा आयत के बराबर आकार के साथ बनाया गया है। यदि नोड दृश्य नोड नहीं है, तो इसे एक स्पष्ट पृष्ठभूमि रंग ([SKColor clearcolor] के साथ प्रस्तुत किया जाता है)। SKShapeNode थोड़ा खोज और वहाँ सत्यापन करने के बाद

UPDATE-- वास्तव में एक रास्ता बताए और फिर नोड को हटाने से संबद्ध एक स्मृति रिसाव मुद्दा था, मैं एक विचार था ...

नहीं सच में एक नया विचार है, और अधिक एक repurposed एक के। यह बहुत अच्छा विचार वास्तव में मुझे मेरे दिल की सामग्री :)

पूलिंग

हाँ करने के लिए SKShapeNodes उपयोग की अनुमति दी ... मैं सिर्फ इतना है कि मैं जरूरत के मुताबिक पुन: उपयोग किया SKShapeNodes का एक पूल बनाया। क्या फर्क पड़ता है :) तो जब भी आवश्यक हो, तो जब भी आवश्यक हो, पथ को फिर से परिभाषित करें, और बाद में आपके साथ फिर से खेलने के लिए इंतजार कर रहे होंगे।

जब भी आप अपने पूल में वापसी का उपयोग करते हैं, तो आप बस पथ को फिर से परिभाषित करते हैं, और बाद में आप फिर से खेलने के लिए प्रतीक्षा करेंगे।

अपने SKScene में पूल नामक एक ivar या संपत्ति NSMutableArray बनाएं और इसे SKScene में डालने पर इसे बनाएं। आप या तो init के दौरान अपने आकृति नोड्स के साथ सरणी को पॉप्युलेट कर सकते हैं, या आप उन्हें आवश्यकतानुसार बना सकते हैं।

-(SKShapeNode *)getShapeNode 
{ 
    if (pool.count > 0) 
    { 
     SKShapeNode *shape = pool[0]; 
     [pool removeObjectAtIndex:0]; 
     return shape; 
    } 

    // if there is not any nodes left in the pool, create a new one to return 
    SKShapeNode *shape = [SKShapeNode node]; 

    return shape; 
} 

इसलिए आप जहां भी दृश्य में आप एक SKShapeNode जरूरत है यदि आप ऐसा करते हैं::

SKShapeNode *shape = [self getShapeNode]; 
// do whatever you need to do with the instance 

जब

यह कुछ त्वरित विधि मैं पूल से एक नया नोड हथियाने के लिए बनाया है आप आकृति नोड का उपयोग करके किया जाता है, बस इसे पूल में वापस कर दें और पथ को सेट करें। उदाहरण के लिए:

[pool addObject:shape]; 
[shape removeFromParent]; 
shape.path = NULL; 

मैं जानता हूँ कि यह एक समाधान है और एक आदर्श समाधान है, लेकिन निश्चित रूप से इस SKShapeNodes की एक बड़ी संख्या का उपयोग करने और स्मृति खून बहाना नहीं चाहते किसी के लिए एक बहुत व्यवहार्य समाधान नहीं है।

+0

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

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