2013-08-14 11 views
5

मैं वर्तमान में मस्केल के लिए हास्केल सीख रहा हूं क्योंकि मैं हमेशा यह देखना चाहता था कि आप किसी ऑब्जेक्ट उन्मुख अर्थ में प्रोग्राम कैसे डिज़ाइन करते हैं।जीसी नरम वास्तविक समय अनुप्रयोगों के लिए हास्केल में रुकता है

लेकिन मैं यह भी शोध कर रहा हूं कि गेम इंजन के लिए हास्केल का उपयोग करना उपयोगी है या नहीं। मेरी मुख्य चिंता जीसी है।

मुझे पता है कि जीएचसी समवर्ती और थ्रेड स्थानीय है।

मैंने पढ़ा कि जीसी आमतौर पर 1ms-5ms के बीच रुक जाती है। मुझे पता है कि यह हर कार्यक्रम के लिए अलग है, लेकिन फिर भी मुझे कुछ गणना करने के लिए कुछ संख्या चाहिए।

मान लें कि मेरा गेम 60fps पर चलता है जिसका मतलब है कि प्रत्येक फ्रेम को गणना के 0.016666667s की आवश्यकता है? एक जीसी पॉज़ इसे ~0.017666667 तक बढ़ा देगा जिसके परिणामस्वरूप 56fps होगा। तो यह ~4fps या 7% का प्रदर्शन नुकसान है। मेरे लिए यह एक बहुत बड़ी हिट है।

अब मैं थ्रेड स्थानीय जीसी पर गिन रहा हूं क्योंकि मैं चाहता हूं कि मेरा गेम इंजन अत्यधिक समवर्ती हो।

मैं गेम कोड के लिए अभिनेता मॉडल का उपयोग करना चाहता हूं ताकि प्रत्येक इकाई की अपनी याददाश्त हो। यदि मैं सही हूं तो इसका मतलब है कि प्रत्येक इकाई के पास इसका स्थानीय कचरा संग्रह होता है।

लेकिन मुख्य समस्या अभी भी इसके मुख्य लूप के साथ गेम इंजन है। यादृच्छिक एफपीएस 7% की बूंदें काफी बड़ी है।

क्या मेरी गणना सही है? कोई सिफारिशें जो आप मुझे दे सकते हैं?

+2

आप मानते हैं कि प्रत्येक फ्रेम गणना पर जीसी चलाया जाता है। यह शायद गलत है। – Nicolas

+0

@ निकोलस मुझे नहीं लगता कि यह हर फ्रेम चलाएगा। मुझे लगता है कि यह किसी बिंदु पर चलेगा और फिर इसे स्थानीय धागा रोक देगा। लेकिन 1 एफपीएस की रोकथाम 4 एफपीएस ड्रॉप में 60 एफपीएस पर होती है। मुझे यकीन नहीं है कि यह कब चलता है, मुझे लगता है कि कुछ पैरामीटर हैं जिन्हें मैं ट्विक कर सकता हूं। मुझे अभी भी उम्मीद है कि मैं गलत हूं। –

+1

नहीं, आपने प्रत्येक फ्रेम गणना में 1ms जोड़ा। इसका मतलब है कि आपने माना है कि * प्रत्येक * फ्रेम पर, आप जीसी के कारण 1ms खो देते हैं। आपकी गणना के अनुसार, जीसी को प्रति सेकंड 56 बार कहा जाता है, और चलाने के लिए 1ms का उपयोग करें। – Nicolas

उत्तर

2

आपकी गणना पक्षपातपूर्ण है।

आप सही हैं: 60 एफपीएस = 1 फ्रेम प्रत्येक 0.0166667 सेकंड।

मान लीजिए (सबसे खराब मामला) कि जीसी कार्यक्रम 5ms के लिए रोक देता है। हर बार जीसी चलाता है, आप 0.005 खो देते हैं। इसका मतलब है कि हर बार जीसी कहा जाता है, तो आप 0.333 एफपीएस खो देते हैं।

सही गणना प्राप्त करने के लिए, हमें यह जानने में सक्षम होना चाहिए कि जीसी कितनी बार बुलाया जाता है, जिसे मैं नहीं जानता और निश्चित रूप से आपके प्रोग्राम द्वारा उत्पन्न डेटा की मात्रा से जुड़ा हुआ है।

+0

धन्यवाद, मुझे नहीं पता कि मैं कितना कचरा उत्पादन करूंगा ताकि मैं विराम की भविष्यवाणी नहीं कर सकूं बार। यह किसी भी तरह से बुरा है अगर मैं अब हास्केल में अपना इंजन लिखना शुरू करता हूं और मैं 2 वर्षों में देखता हूं कि विराम के समय अस्वीकार्य हैं तो मैंने अपने समय के 2 साल खो दिए हैं। (क्रमबद्ध करें) –

+0

फिर सी ++ का उपयोग करें या अपनी पहली चीज़ लोड लोड लिखें। – kqr

+2

@ मिकक्लेन आपको जॉन कारमाक के क्वैककॉन 2013 मुख्य नोट देखना चाहिए। वह वास्तव में इस मुद्दे के बारे में बात करता है और एक संभावित समाधान प्रस्तुत करता है। वह सी ++ में अपने विचार को लागू करने का वर्णन करता है लेकिन मेरा मानना ​​है कि आप सी विदेशी संकेतकों के माध्यम से बनावट आदि के प्रबंधन द्वारा हास्केल में जो कुछ भी वर्णन करते हैं वह कर सकते हैं। – asm

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