2010-04-22 15 views
5

मैं एक गेम के लिए कुछ स्क्रिप्ट लिख रहा हूं, स्क्रिप्ट लिआ में लिखी गई हैं। गेम की आवश्यकताओं में से एक यह है कि आपके लुआ स्क्रिप्ट में अपडेट विधि (जिसे प्रत्येक फ्रेम कहा जाता है) को चलाने के लिए 2-3 मिलीसेकंड से अधिक समय नहीं लग सकता है, अगर यह गेम बस लटकता है।लुआ कार्य शेड्यूलिंग

मैंने इस समस्या को कोरआउट के साथ हल किया है, मुझे बस मल्टीटास्किंग कॉल करना है। रुनटास्क (कुछ समारोह) और फिर कार्य कोरआउटिन के रूप में चलता है, फिर मुझे अपने कोड में मल्टीटास्किंग.इल्ड() को स्कैटर करना होता है, जो जांचता है कि कैसे लंबे समय तक काम चल रहा है, और यदि यह 2 एमएस से अधिक है तो यह कार्य को रोक देता है और इसे अगले फ्रेम को फिर से शुरू करता है। यह ठीक है, सिवाय इसके कि मुझे अपने कोड में मल्टीटास्किंग.इल्ड() हर जगह स्कैटर करना है, और यह एक वास्तविक गड़बड़ है।

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

संपादित करें: स्पष्ट होने के लिए, मैं एक गेम संशोधित कर रहा हूं, जिसका मतलब है कि मुझे केवल लुआ तक पहुंच है। कोई सी ++ चाल की अनुमति नहीं है।

उत्तर

5

lua_sethookDebug Interface में चेक करें।

+0

ऐसा लगता है कि इसे C++ स्रोत तक पहुंच की आवश्यकता है? – Martin

+0

यह सी है, सी ++ – Javier

+2

'डीबग' पुस्तकालय लुआ से निर्यात किया जाता है। आप सीधे lua से 'debug.sethook()' को कॉल कर सकते हैं। –

1

मैंने वास्तव में अभी तक इस समाधान की कोशिश नहीं की है, इसलिए मुझे यह सुनिश्चित नहीं है कि यह कितना अच्छा काम करेगा।

debug.sethook(coroutine.yield,"",10000); 

मैंने मनमाने ढंग से संख्या चुना; इसे तब तक ट्विक किया जाना चाहिए जब तक कि आपको लगभग समय सीमा की आवश्यकता न हो। ध्यान रखें कि सी फंक्शंस इत्यादि में बिताए गए समय में निर्देश गणना मूल्य में वृद्धि नहीं होगी, इसलिए एक लूप लंबे समय से चलने वाले सी कार्यों में कॉल की तुलना में इस सीमा तक कहीं अधिक तेज़ी से पहुंच जाएगा। यह बहुत कम मूल्य निर्धारित करने के लिए व्यवहार्य हो सकता है और इसके बजाय एक फ़ंक्शन प्रदान करता है जो देखता है कि os.clock() या इसी तरह की वृद्धि हुई है।

+0

शायद सबसे सुंदर समाधान (वास्तव में, मैंने इसे मूल रूप से आजमाया), लेकिन दुर्भाग्य से यह काम नहीं करता है। इस चर्चा को देखें http://lua-list.2524044.n2.nabble.com/embedded-lua-in-web-based-REPL-td4766017.html – AlexWebr