एकता 2017.2 तिलमप की आकार सीमा क्या है?


17

मैं एकता 2017.2 के तिलमप फीचर पर प्रलेखन के माध्यम से खुदाई कर रहा हूं।

क्या एकता एक विशेष तिलमप जाल के लिए अधिकतम कितनी टाइलों को सीमित करेगी?

मुझे पता है कि प्रत्येक टाइल को एक बार इंस्टेंट किया जाता है और रनटाइम के दौरान तिलमैप मेष पर क्लेड्स को बनावट के लिए इस्तेमाल किया जाता है, इसलिए मुझे लगता है कि मेष क्वाड काउंट सीमा अंततः हार्डवेयर पर निर्भर है, और कमोबेश मनमाने ढंग से उच्च है।

क्या यह सही धारणा है, या इंजन में एक सख्त टोपी है?


1
क्यों होता है पतन? यह एक वैध प्रश्न है।
फिलिप

जवाबों:


25

आपकी रैम आपकी सीमा है

इन स्पेक्स के साथ सिस्टम पर निम्नलिखित परीक्षण किए गए थे:

  • इंटेल i5-6600
  • 16 जीबी रैम
  • NVIDIA GeForce GTX 1070
  • विंडो 7 होम प्रीमियम

यहां एक स्क्रिप्ट है जिसे मैंने चलाया था जो एक टाइल (32x32 पिक्सल) के साथ भरकर एक टिलेमैप बढ़ता है। विधि Grow()वर्तमान नक्शे में एक और कॉलम और दूसरी पंक्ति जोड़ता है। विधि को प्रत्येक अद्यतन 100 बार कहा जाता है।

public class TileTest : MonoBehaviour {

    public Tile tile;
    private Tilemap tilemap; 

    public int currentSize;


    void Start () {
       tilemap = GetComponent<Tilemap>;
        Grow();
    }

    void Update() {

        for (var i = 0; i < 100; i++) {
            Grow();
        }
        Debug.Log(currentSize);        
    }

    private void Grow() {
        for (int x = 0; x < currentSize; x++) {
            tilemap.SetTile(new Vector3Int(x, currentSize, 0), tile);
        }
        for (int y = 0; y < currentSize; y++) {
            tilemap.SetTile(new Vector3Int(currentSize, y, 0), tile);
        }
        tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);

        currentSize++;
    }
}

कुछ मिनटों के बाद, मेरा कंप्यूटर स्मृति से बाहर चला गया और एकता दुर्घटनाग्रस्त हो गई। उस समय यह 8400x8400 (70 मिलियन) टाइल्स पर था और Unity.exe कार्य प्रबंधक के अनुसार 11 जीबी रैम से थोड़ा अधिक खपत कर रहा था।

ठीक है, लेकिन विरल नक्शे के बारे में क्या ?

यहाँ एक अलग लिपि दी गई है, जिसमें 100 टाइलों की वृद्धि में x और y निर्देशांक में एक एकल टाइल रखी गई है:

public class TileTest : MonoBehaviour {

    public Tile tile;
    private Tilemap tilemap; 
    public int currentSize;


    void Start () {
        tilemap = GetComponent<Tilemap>();
    }

    void Update() {
        tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);
        currentSize+= 100;
    }    
}

Unity.exe की स्मृति पदचिह्न वास्तव में बहुत कम बढ़ गई है, जो संकेत देता है कि खाली टाइलसेट कोशिकाओं को लगभग कोई रैम की आवश्यकता नहीं है। हालांकि, FPS गिरते रहे जैसे कि टाइलसेट बढ़ रहा था। इसने 60 एफपीएस को 30000x30000 पर, 30 एफपीएस को 60000x60000 और 15 एफपीएस को 90000x90000 पर टक्कर दी। एफपीएस उस कम रहा जब मैंने टेस्ट-गेम चल रहा था, जब मैंने स्क्रिप्ट को हटा दिया। तो यह मंदी टिलमैप को बदलने से नहीं थी। यह बस इसे प्रदान करने से था। इसलिए जब आप एक बहुत बड़ा ओपन वर्ल्ड गेम बनाना चाहते हैं, तो आपको कई छोटे टिलमैप्स का उपयोग करना होगा, जिन्हें आप रनटाइम पर बनाते और नष्ट करते हैं।

निष्कर्ष: विशाल लेकिन ज्यादातर खाली तिलमप में अधिक रैम का उपयोग नहीं किया जाता है, लेकिन वे एक रेंडरिंग टोंटी हैं , यहां तक ​​कि जब यह कैमरा व्यूपोर्ट में नहीं होता है।

मैंने तब इस लिपि के साथ प्रयोग किया जो एक दिए गए आकार के साथ तिलमिलापन पैदा करती है:

public class TileTest : MonoBehaviour {

    public Tile tile;
    public int xSize;
    public int ySize;

    void Start () {
        Tilemap tilemap = GetComponent<Tilemap>();

        for (int x = 0; x < xSize; x++) {
            for (int y = 0; y < ySize; y++) {
                tilemap.SetTile(new Vector3Int(x, y, 0), tile);
            }
        }
    } 
}

मैंने इस स्क्रिप्ट का उपयोग 8192x8192 मानचित्र बनाने के लिए किया था। इसमें कुछ मिनट लगे, लेकिन जब स्क्रिप्ट खत्म हो गई, तो यह स्थिर 95 एफपीएस पर चला गया।

निष्कर्ष: लाखों टाइल वाले नक्शे संभव हैं, कम से कम गेमिंग पीसी पर


5
यह सबसे खूबसूरत जवाब है जो मैंने लंबे समय में देखा है। "चलो पता करते हैं!" सिस्टम को हथौड़ा करने के लिए स्क्रिप्ट लिखता है स्क्रिप्ट कंप्यूटर धूम्रपान करना शुरू करता है "ऐसा लगता है कि यह आपको सीमित नहीं करता है!" धन्यवाद @ फीलिप!
स्टीफ़न

8192 ^ 2 परीक्षण की पीढ़ी के दौरान फ्रैमरेट क्या था? मैं उत्सुक हूं कि पीढ़ी के प्रयासों ने सिस्टम को कितना नुकसान पहुँचाया।
Stephan

1
@ स्टेफेन जीरो एफपीएस। जैसा कि मैंने कहा, पीढ़ी को कई मिनट लगते हैं। और क्योंकि यह स्क्रिप्ट Updateपीढ़ी-दर-पीढ़ी, खेल और एकता संपादक को तब तक नहीं छोड़ती है , जब तक कि पीढ़ी खत्म न हो जाए। यदि आप चाहते हैं कि मैप पीढ़ी के दौरान आपका गेम उत्तरदायी हो, तो पीढ़ी को एक कोरटाइन में ले जाएं, जो एक समय में एक चंक उत्पन्न करता है और उनके बीच पैदावार देता है।
फिलिप

@ स्टेफ़न और वैसे, सभी टाइलों को एक बार सेट करने के लिए सेटटाइलब्लॉक का उपयोग करना तेज़ हो सकता है । लेकिन जल्दी से परीक्षण मानचित्र तैयार करना यहाँ मेरा लक्ष्य नहीं था।
फिलिप

ओह! दुआ, ठीक है। किसी कारण से मैं सोच रहा था कि यह बाधित होगा। यह एक दिलचस्प विचार है। मुझे इस सप्ताह के अंत में इसके साथ खेलना होगा। ऐसा लगता है कि इस नए पर अभी तक इस सुविधा पर बहुत सारे परिणाम नहीं हैं। पूरी प्रतिक्रिया के लिए धन्यवाद! यह पहले से ही बहुत ध्यान आकर्षित कर रहा है। पश्चात की मदद करना!
Stephan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.