2015-04-28 4 views
13

मैं एक खेल बना रहा हूं और प्लेफील्ड को दोबारा बनाना कंसोल के साथ अच्छा नहीं है। राइट() क्या कोई तरीका है कि मैं पूरे क्षेत्र को "लगी" दिखने के बिना तेज़ी से फिर से लिख सकता हूं? खेलने का मैदान में काफी सब कुछ चल रहा है, लेकिन वहाँ केवल 0 से विभिन्न तत्वों पर वस्तुओं रहे हैं .. (पूर्ण कोड यहाँ http://pastebin.com/TkPd37xD देख सकें और मैं क्या अगर मेरे वर्णन पर्याप्त नहीं है के बारे में बात कर रहा हूँ)सी # Console.Write() से कुछ तेज है?

for (int Y = 0; Y < playfield.GetLength(0); Y++) 
{ 
    for (int X = 0; X < playfield.GetLength(1); X++) 
    { 
     //destroying the row when it reaches the top 
     if (playfield[0, X] != 0) 
     { 
      for (int i = 0; i < playfield.GetLength(1); i++) 
      { 
       playfield[0, X] = 0; 
       Console.SetCursorPosition(X, 0); 
       Console.Write(" "); 
      } 
     } 
     if (playfield[Y, X] == 3) 
     { 
      playfield[Y - 1, X] = 3; 
      playfield[Y, X] = 0; 
     } 
     else if (playfield[Y, X] == 1) 
     { 
      Console.SetCursorPosition(X, Y - 1); 
      Console.Write("="); 
      playfield[Y - 1, X] = 1; 
      Console.SetCursorPosition(X, Y); 
      Console.Write(" "); 
      playfield[Y, X] = 0; 
     } 
     else if (playfield[Y, X] == 0) 
     { 
      Console.SetCursorPosition(X, Y); 
      Console.Write(" "); 
     } 
    } 
} 
+9

बस पूरी स्क्रीन को दोबारा नहीं हटाएं, केवल –

+0

बदल गए हिस्सों में मैंने सोचा कि यह वही है जो मैं कर रहा था, लेकिन स्पष्ट रूप से मैं नहीं था, बस अब मैंने देखा है कि मेरा आखिरी "अन्य अगर" जरूरी नहीं है क्योंकि मैं वही काम कर रहा हूं, अगर == 1, मैंने आखिरी अन्यथा हटा दी, और अब यह बहुत बेहतर दिखता है! :) – Darkbound

+0

क्या आपने स्ट्रिंगबफर का उपयोग करने का प्रयास किया था? – Caramiriel

उत्तर

12

मूल रूप से दो दृष्टिकोण हैं: कम प्रस्तुत करें, और तेज़ी से प्रस्तुत करें।

रेंडर कम आमतौर पर अधिक कठिन होता है, लेकिन यह भी कम गहन होता है। क्लासिक उदाहरण कारमैक के उत्सुक गेम होंगे - पीसी में पूरी स्क्रीन को एक बार में फिर से प्रस्तुत करने की हिम्मत नहीं थी, इसलिए कारमैक ने सुनिश्चित किया कि स्क्रीन के केवल हिस्सों को वास्तव में बदल दिया गया है। आपके मामले में, यह पुरानी स्क्रीन के खिलाफ नई स्क्रीन की जांच के रूप में सरल हो सकता है (निश्चित रूप से Console विधियों का उपयोग किए बिना) - आपके द्वारा लिखे गए गेम के प्रकार के आधार पर, यह आपको बड़ी मात्रा में काम बचा सकता है।

तेजी से प्रस्तुत करना आमतौर पर आसान होता है। पुराने दिनों में सामान्य दृष्टिकोण आउटपुट बफर तक सीधे पहुंच प्राप्त करना था - प्लेफील्ड को अलग-अलग मेमोरी में रखने के बजाए, आप इसे सीधे ग्राफिक्स कार्ड में रखते थे - जो कि पूरी स्क्रीन को जितनी जल्दी हो सके उतना तेज़ करने में सक्षम था, बेशक, अन्यथा आप कभी भी अपनी सीआरटी स्क्रीन पर ज्यादा नहीं देख पाएंगे। यह विकल्प पिछड़ा संगतता के रूप में अभी भी सुलभ है, इसलिए यदि आप अपने एप्लिकेशन को टर्बो पास्कल कहते हैं, तो आप अभी भी इसका उपयोग कर सकते हैं, लेकिन यह वास्तव में सी # में आसानी से पहुंच योग्य नहीं है। StringBuilder में पूरी स्क्रीन को प्रतिपादित करने में एक विकल्प है, और फिर Console.Write सभी एक बार में। यह काफी तेज होगा, लेकिन यह बिल्कुल तारकीय नहीं है। char[] आपको प्रदर्शन का एक अतिरिक्त बिंदु प्रदान करने की अनुमति देगा - आप अपने प्लेफील्ड को char[][] के रूप में सीधे प्रस्तुत कर सकते हैं और फिर जब भी आप कुछ बदलते हैं तो आपको StringBuilder को फिर से बनाने की आवश्यकता नहीं होती है - आपको केवल प्रत्येक प्लेफील्ड लाइन के लिए Console.Write करना होगा।

और निश्चित रूप से, आप जितनी जल्दी हो सके परिवर्तनों को लिख सकते हैं; जिस गेम को आप लिख रहे हैं उसके आधार पर, यह "महान परिणामों के साथ तुच्छ" से "बहुत कठिन और अच्छा दिखने" से सभी तरह से हो सकता है। और चूंकि कंसोल का बफर क्षेत्र तब विंडो आकार से बड़ा हो सकता है, इसलिए आप इसे बफर के एक छिपे हिस्से में भी खींच सकते हैं, और उसके बाद पूरे परिवर्तन को एक बार में खींचने के लिए Console.MoveBufferArea का उपयोग कर सकते हैं - इसे आमतौर पर "बैकबफरिंग" कहा जाता है। मुझे यकीन नहीं है कि यह अच्छा लगेगा, हालांकि - कंसोल विंडो आजकल आपको बफर में स्क्रॉल करने की अनुमति देती है, जो आपके उपयोग के मामले के लिए हानिकारक हो सकती है।

कंसोल बफर के लिए बहुत तेज पहुंच प्राप्त करने के अभी भी तरीके हैं, लेकिन .NET में पूरी तरह से रहने के दौरान नहीं - आपको पी/आमंत्रण का उपयोग करने की आवश्यकता होगी। इस विषय पर एक बड़ा जवाब यहां है - How can I write fast colored output to Console?।आधुनिक प्रणालियों पर, यह एक बैक बफर का उपयोग करने के लिए काफी समकक्ष है और इसे एक साथ "ड्राइंग" करता है - यह अविश्वसनीय रूप से तेज़ है। और फिर, आप सीधे अपने गेम डेटा के लिए बैक बफर का उपयोग कर सकते हैं - यह 20-30 साल पहले काम करता था, और यह आज भी काम करता है; सीमित संसाधनों के साथ खेलने में यह अच्छा अभ्यास है। क्या आप एक ऐसा गेम लिख सकते हैं जो सब कुछ के लिए वास्तव में कंसोल टेक्स्ट बफर का उपयोग करता है, या कम से कम लगभग सबकुछ? इस तरह की चीजों के साथ खेलना बहुत मजेदार है; आप इस तरह के खेलों की पूरी तरह से लिख सकते हैं, जिसमें टेट्रिस या लोड रनर जैसे गेम शामिल हैं। बेशक, यह केवल विंडोज पर काम करेगा, इसलिए यदि आप अन्य प्रणालियों का समर्थन करना चाहते हैं, तो यह बहुत मुश्किल है।

और अंत में, आप केवल अपना स्वयं का कंसोल लिख सकते हैं (या बेहतर, पहले से लिखे गए और परीक्षण किए गए किसी का उपयोग करें)। यदि आप समय के साथ अधिक चुनौतियों पर जाना चाहते हैं तो यह एक अच्छा अभ्यास है, और यह आपको समय के साथ और अधिक शक्तिशाली तकनीकों के साथ खेलने की अनुमति देगा। सामान्य उदाहरण बौने किले की तरह खेल होगा - अभी भी पाठ आधारित, अभी भी कंसोल की तरह, लेकिन वास्तव में एसडीएल जैसी तकनीकों का उपयोग करके ग्राफिक रूप से खींचा गया है। न केवल आधुनिक प्रणालियों पर यह बहुत तेज़ है (क्योंकि आपके पास टेक्स्ट बफर को सीधे एक्सेस करने का कोई आसान तरीका नहीं है), यह ग्राफिकल टाइल वाले गेम को आसानी से बदलने का विकल्प भी खोलता है। यह ठंडा सामान के लिए सीढ़ी पर एक और कदम पत्थर है :))

0

एक वैकल्पिक एपीआई लिंक https://msdn.microsoft.com/en-gb/library/windows/desktop/aa363362%28v=vs.85%29.aspx

[DllImport("kernel32.dll")] 
static extern void OutputDebugString(string lpOutputString); 

में निर्दिष्ट कॉल उपयोग करने के लिए आप भी में आउटपुट बफरिंग से मामूली प्रदर्शन हासिल कर सकते हैं अपने एक StringBuilder में छोरों और पाश के लिए प्रत्येक के बाद यह outputting के लिए। यह संभव नहीं है कि आप अपने कार्यक्रम के साथ क्या हासिल करना चाहते हैं।

+2

इस तरह से जाने की कोई ज़रूरत नहीं है, एक प्रबंधित 'Debug.WriteLine' है जो प्रबंधित दुनिया में वही काम करता है। – Blindy

0

यदि आप आउटपुट cmd विंडो को छुपाते हैं, तो विंडोज़ इसे फिर से नहीं चलाता है और आप स्क्रीन पर खुले होने की तुलना में तेज़ी से चलता है।

यदि यह सिर्फ एक डीबग समस्या है, तो आप बस विंडो को कम कर सकते हैं और एक छोटा प्रदर्शन वृद्धि देख सकते हैं।

+0

ओपी के "प्लेफील्ड" शब्द के उपयोग से मुझे संदेह है कि यह डीबग आउटपुट के बजाए एक गेम है। – Rawling

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