Roblox पर रॉगलाइक और आरपीजी गेम्स के लिए प्रक्रियात्मक जनरेशन मुख्य आधार है। सही एल्गोरिदम के बिना गेम में मेमोरी क्रैश और लैग की समस्या आती है।
कमरे बांटने के लिए BSP, प्राकृतिक रास्तों के लिए Delaunay त्रिकोणीकरण और परफॉर्मेंस के लिए `StreamingEnabled` का उपयोग करके असीमित डंगियन बनाए जा सकते हैं।
1. बाइनरी स्पेस पार्टिशनिंग (BSP) द्वारा कमरों का निर्माण
नक्शे के संतुलित विभाजन के लिए गणितीय विधि:
- रिकर्सिव विभाजन: पूरे क्षेत्र को छोटे-छोटे हिस्सों में तब तक बांटा जाता है जब तक कि कमरे का सही आकार न मिल जाए।
- पहलू अनुपात नियंत्रण: कमरों को बहुत संकरा होने से बचाने के लिए 1:1 से 1:2.5 का अनुपात बनाए रखना।
- बिना टकराव के कमरे: हर हिस्से के अंदर एक कमरा बनता है, जिससे कमरे कभी आपस में नहीं टकराते।
2. प्राकृतिक गलियारे: डेलाउने त्रिकोणीकरण और MST
कमरों को सुचारू रूप से जोड़ने का तरीका:
- केंद्र बिंदु नेटवर्क: सभी कमरों के केंद्रों को जोड़कर 2D डेलाउने नेटवर्क बनाया जाता है।
- न्यूनतम स्पैनिंग ट्री (MST): अतिरिक्त रास्तों को हटाकर सबसे छोटा और सुरक्षित रास्ता तय करना।
- लूप जोड़ना (15% अतिरिक्त): कुछ रास्तों को वापस जोड़ना ताकि गेमप्ले एकतरफा न लगे।
3. ग्रिड आधारित गलियारे और टाइल असेंबली
रेखाचित्र को वास्तविक 3D ब्लॉक में बदलना:
- L-आकार के मोड़: कमरों के दरवाजों को समकोण गलियारों से जोड़ना।
- 4-बिट ऑटोटाइलिंग: दीवारों और कोनों के लिए सही 3D मॉडल का स्वचालित चयन।
- पार्ट्स की बचत: मॉडल्स को जोड़कर मेमोरी लोड को 90% तक कम करना।
-- बाइनरी स्पेस पार्टिशनिंग (BSP) मॉड्यूल
local BSPNode = {}
BSPNode.__index = BSPNode
function BSPNode.new(x, z, width, depth)
local self = setmetatable({}, BSPNode)
self.X, self.Z = x, z
self.Width, self.Depth = width, depth
self.LeftChild = nil
self.RightChild = nil
self.Room = nil
return self
end
function BSPNode:Split(minSize)
if self.LeftChild or self.RightChild then return false end
local splitHorizontal = math.random() > 0.5
if self.Width > self.Depth and (self.Width / self.Depth) >= 1.25 then
splitHorizontal = false
elseif self.Depth > self.Width and (self.Depth / self.Width) >= 1.25 then
splitHorizontal = true
end
local maxDimension = (splitHorizontal and self.Depth or self.Width) - minSize
if maxDimension <= minSize then return false end
local splitPos = math.random(minSize, maxDimension)
if splitHorizontal then
self.LeftChild = BSPNode.new(self.X, self.Z, self.Width, splitPos)
self.RightChild = BSPNode.new(self.X, self.Z + splitPos, self.Width, self.Depth - splitPos)
else
self.LeftChild = BSPNode.new(self.X, self.Z, splitPos, self.Depth)
self.RightChild = BSPNode.new(self.X + splitPos, self.Z, self.Width - splitPos, self.Depth)
end
return true
end
return BSPNode
4. मेमोरी प्रबंधन और StreamingEnabled आर्किटेक्चर
कम रैम वाले मोबाइल फोनों पर भी सुचारू संचालन:
- ModelStreamingMode.Atomic: पूरे कमरे को एक साथ लोड करना ताकि दीवारें गायब न हों।
- 64x64 चंक विभाजन: दूर के कमरों की फिजिक्स बंद रखना ताकि लैग न हो।
- ऑक्लूजन कलिंग: बंद दरवाजों के पीछे के कमरों को रेंडर न करके GPU पर लोड घटाना।
5. सीड (Seed) सिंक्रोनाइज़ेशन और सर्वर नियंत्रण
बिना किसी लैग के निष्पक्ष और सुरक्षित गेमप्ले:
- समान सीड शेयरिंग: केवल एक 32-बिट नंबर भेजकर क्लाइंट और सर्वर पर बिल्कुल एक जैसा नक्शा बनाना।
- सर्वर आधारित दुश्मन: राक्षस, खजाने और जाल केवल सर्वर द्वारा सुरक्षित रूप से तैयार किए जाते हैं।
- नेवमेश पाथफाइंडिंग: दुश्मनों को सही रास्ता दिखाने के लिए स्वचालित नेविगेशन सेटअप।
Frequently Asked Questions
साधारण यादृच्छिक प्लेसमेंट की तुलना में BSP क्यों बेहतर है?
BSP कमरों को व्यवस्थित तरीके से बांटता है जिससे कमरे आपस में नहीं टकराते और खाली जगह भी नहीं छूटती।
Delaunay और MST का क्या फायदा है?
यह सभी कमरों के बीच सबसे छोटा और प्राकृतिक रास्ता बनाता है जिससे कोई भी कमरा अलग-थलग नहीं रहता।
StreamingEnabled क्यों महत्वपूर्ण है?
यह केवल खिलाड़ी के आस-पास का इलाका लोड करता है, जिससे बड़े नक्शे भी मोबाइल पर आसानी से चलते हैं।
बिना लैग के नक्शा कैसे सिंक करें?
सर्वर और क्लाइंट के बीच एक ही सीड नंबर शेयर करके दोनों जगह बिना डेटा ट्रांसफर के एक जैसा नक्शा बन जाता है।