इसलिए मैंने हाल ही में इस पर अपना हाथ आजमाया और उन्हीं मुद्दों को लेकर आप लोगों के पास गया। रेंडर टेक्सचर सॉल्यूशन एक लाल हेरिंग का एक सा है। मैं इसे अलग धागे पर मल्टीथ्रेडिंग पिक्सेल हेरफेर का उपयोग करके हल करने में सक्षम था।
https://www.youtube.com/watch?v=T_zpFk1mdCI
इसलिए आमतौर पर graphics.blit()
जहां कहीं भी जाने की जरूरत होती है, वहां रेंडर टेक्सचर का इस्तेमाल करते हैं और पास करते हैं, लेकिन लाइटमैप डेटा बनावट का समर्थन नहीं करता है, उन्हें बनावट 2ds की आवश्यकता होती है। अगला तार्किक कदम डेटा को बनावट 2 डी पर कॉपी करना और फिर लाइटमैप डेटा को फीड करना होगा। यह तकनीक फ्रेम दर को बर्बाद कर देती है क्योंकि यह केवल डेटा के संदर्भ के बजाय सीपीयू को डेटा भेजने के लिए GPU को रोक रहा है।
समाधान तो GPU का उपयोग नहीं करने के लिए है।
लाइट मैप ट्रांज़िशन समय की लंबी अवधि में होता है, इसलिए यह आवश्यक नहीं है कि हर फ्रेम में लाइट मैप को अपडेट किया जाए। तथ्य की बात के रूप में, खिलाड़ियों को शायद ध्यान नहीं होगा यदि प्रकाश मानचित्र केवल खेल के समय में हर 20-40 मिनट में अपडेट किए गए थे।
तो आप क्या करते हैं आप प्रत्येक प्रकाश मानचित्र के लिए अलग-अलग थ्रेड पर सीपीयू को कार्य जारी करते हैं।
आमतौर पर एकता, मल्टीथ्रेडिंग का समर्थन नहीं करती है। लेकिन यह ठीक है, सी # करता है। यह आदमी एक अभूतपूर्व काम करता है जो एकता में मल्टीथ्रेडिंग की व्याख्या करता है, इसलिए यदि आपने कभी इसके बारे में नहीं सुना है, या कभी भी यह नहीं जानता कि एकता में कैसे मल्टीथ्रेड किया जाए तो यह वीडियो है:
https://www.youtube.com/watch?v=ja63QO1Imck
आपको बस एक श्रमिक थ्रेड क्लास बनाने की ज़रूरत है जो कलर सरण में लाइटमैप पिक्सेल डेटा की प्रतियों को बदलता है, और फिर एक मिश्रण फ़ंक्शन बनाता है।
एक रंग से अगले करने के लिए एक साधारण लार्प करेंगे।
फिर धागा बनाएं, इसे शुरू करें, और जब सभी थ्रेडमैप अलग-अलग थ्रेड में समाप्त हो जाते हैं तो आप पिक्सेल डेटा को लाइटमैप डेटा बनावट 2 डी में वापस कॉपी कर सकते हैं।
मैंने नीचे कुछ उदाहरण कोड पोस्ट किए हैं। यह निश्चित रूप से पूरी तरह से लागू किया गया संस्करण नहीं है, लेकिन यह आपको क्लास बनाने, थ्रेड बनाने और फिर लाइटडाटा सेट करने की मुख्य अवधारणाओं को दिखाता है।
अन्य चीजें जो आपको करनी होंगी, वह लाइटमैप्स को अपडेट करने के लिए हर बार एक फ़ंक्शन कॉल करना है। इसके अलावा, आपको या तो शुरुआत में या संकलन समय पर सभी पिक्सेल डेटा को कार्यकर्ता वर्ग में कॉपी करना होगा। जो भी इसे पाता है, उसे शुभकामनाएं। मुझे पता है कि ऑप उनके जीवन के साथ आगे बढ़ गया है, लेकिन मुझे पता है कि इसी तरह की समस्याओं वाले अन्य लोग इस पर ठोकर खा सकते हैं।
public class work
{
Color[] fromPixels;
Color[] toPixels;
public float LerpValue = 0;
public bool Finished = false;
public Color[] mixedPixels;
public work(Color[] FromPix, Color[] ToPix)
{
fromPixels= FromPix;
toPixels= ToPix;
Finished = false;
mixedPixels = new Color[FromPix.Length];
}
public void DoWork()
{
for (int x = 0; x < fromPixels.Length; x++)
{
mixedPixels[x] = Color.Lerp(fromPixels[x], toPixels[x], LerpValue);
}
Finished = true;
}
}
IEnumerator LightMapSet()
{
Thread workerThread = new Thread(someworker.DoWork);
someworker.LerpValue = lerpValue;
workerThread.Start();
yield return new WaitUntil(() => someworker.Finished);
mixedMap.SetPixels(someworker.mixedPixels);
mixedMap.Apply(true);
LightmapData someLightmapData;
someLightmapData.lightmapColor = mixedMap;
lightDatas = { someLightmapData};
LightmapSettings.lightmaps = lightDatas;
}