2009-06-28 5 views
5

हम एक पुराने वीडियो गेम को बनाए रखते हैं जो डायरेक्टड्रा के साथ पूर्ण स्क्रीन 256-रंग ग्राफिक्स मोड का उपयोग करता है। समस्या यह है कि, पृष्ठभूमि में चल रहे कुछ एप्लिकेशन कभी-कभी सिस्टम चलते समय सिस्टम पैलेट को बदलने का प्रयास करते हैं, जिसके परिणामस्वरूप दूषित ग्राफिक्स होते हैं।"एक्सक्लूसिव" डायरेक्टड्रा पैलेट वास्तव में अनन्य नहीं है

हम (कभी-कभी) यह पता लगा सकते हैं कि यह WM_PALETTECHANGED संदेश को संसाधित करके होता है। कुछ अपडेट संस्करणों से पहले हमने लॉगिंग जोड़ा (बस विंडो शीर्षक/वर्ग/प्रक्रिया नाम लॉग करें), जिससे उपयोगकर्ताओं को अपमानजनक अनुप्रयोगों की पहचान करने और उन्हें बंद करने में मदद मिली। एमएसएन लाइव मैसेंजर एक आम अपराधी था।

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

कुछ समय पहले मैंने समाधान खोजने की उम्मीद में यादृच्छिक चीजों की कोशिश करना शुरू कर दिया था। मैंने पाया कि डायरेक्टड्रा पैलेट (IDirectDrawPalette :: SetEntries का उपयोग करके) को सेट करने से पहले जीडीआई पैलेट (बनाएं/selectPalette का उपयोग करके) को दूषित होने के बाद पैलेट को पुनर्स्थापित कर देगा (WM_PALETTECHANGED हैंडलर)। SetSystemPaletteUse और प्राथमिक सतह पर SetPalette को कॉल करने में कुछ और मदद की। हालांकि, अभी भी एक कल्पित झिलमिलाहट है जब कोई एप्लिकेशन पैलेट चोरी करने की कोशिश करता है, जो विशेष रूप से फीड के दौरान प्रमुख होता है।

प्रश्न: क्या "असली" अनन्य पैलेट प्राप्त करने का कोई तरीका है, जो कि हमारे गेम को ध्यान में रखे जाने तक विंडोज पैलेट को बदलने वाले अन्य अनुप्रयोगों को पूरी तरह से अस्वीकार करता है?

उत्तर

1

किसी को वास्तव में एक रजिस्ट्री प्रविष्टि फ़िक्स मिला इसके लिए, यहां:

http://answers.ea.com/t5/Command-Conquer-The-Ultimate/Common-Problems-Read-This-Before-Posting/m-p/222052

उस पृष्ठ पर "स्कैम्बल रंग" ढूंढें और आपको जिस फिक्स की आवश्यकता है, उसके साथ आप भाग लेंगे।


के बाद से ऑनलाइन संसाधनों क्षणभंगुर हैं, हालांकि, यहाँ पूर्ण व्याख्या दी गई है:

कार्यक्रम के लिए "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DirectDraw \ संगतता \" के तहत एक नया कुंजी बनाओ।

यदि प्रोग्राम आप 32-बिट प्रोग्राम के लिए संगतता लागू कर रहे हैं, और आप 64-बिट सिस्टम पर हैं (या तो इसे मैन्युअल रूप से या 64-बिट प्रोग्राम के माध्यम से लागू करना), तो भूलना न भूलें इसके लिए क्षतिपूर्ति करने के लिए "सॉफ़्टवेयर" और "डायरेक्टड्रा" के बीच "वाह 6432 नोड" जोड़ें।

कि कुंजी में, सेट इन मूल्यों:

  • "झंडे" (REG_BINARY): [00,08,00,00]
  • "नाम" (REG_SW): अपने कार्यक्रम के फ़ाइल का नाम। कोई रास्ता नहीं, केवल निष्पादन योग्य फ़ाइल नाम।
  • "आईडी" (REG_BINARY): एप्लिकेशन की डायरेक्टड्रा आईडी।

आवश्यक DirectDraw आईडी प्राप्त करने के लिए, कार्यक्रम चलाने और फिर इस रजिस्ट्री कुंजी की जाँच करें:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw\MostRecentApplication 

फिर, अगर आप एक 64 बिट प्रणाली और कार्यक्रम आप के लिए यह कर रहे हैं पर हैं 32-बिट एक है, "सॉफ़्टवेयर" के बाद "वाह 6432 नोड" जोड़ें।

उस कुंजी में आईडी चार बाइट्स है। आईडी मान में बाइट्स डालने के लिए अपने ऑर्डर को उलट दें। 32dd83d5 d5,83, डीडी, 32 बन जाता है।

+0

धन्यवाद, हमारे उपयोगकर्ताओं के परीक्षण के लिए एक स्क्रिप्ट पोस्ट की गई है, देखते हैं कि कैसे यह अभ्यास में हमारे खेल के लिए काम करेगा। –

+0

हाँ, काम करने लगता है :) धन्यवाद! –

+0

यह एक संगतता शिम की तरह दिखता है जो माइक्रोसॉफ्ट ने उन ऐप्स के लिए रखा है जो पैलेट सही नहीं हैं। –

0

स्पष्ट रूप से "an application should not call SetSystemPaletteUse, unless it has a maximized window and the input focus"। शायद कुछ अन्य कार्यक्रम गलत व्यवहार कर रहा है। यह विवरण माइक्रोसॉफ्ट की तरह यह बहुत अच्छा लगता है कि सभी कार्यक्रम सहयोग करेंगे और ऐसा करने के लिए उन्हें मजबूर करने के लिए कोई रास्ता नहीं देंगे। यह विंडोज 3.1 पर वापस होने की तरह है। :)

यादृच्छिक सुझाव: क्या आपने SYSPAL_NOSTATIC256 पैरामीटर के साथ SetSystemPaletteUse को आजमाया है?

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

+0

जब पैलेट चोरी होता है, यह आम तौर पर पूरे होगा (या अधिकांश दृश्यमान) पैलेट, तो शायद यह एक सेटिंग सेटिंग SetSystemPaletteUse नहीं था। हमने एक SetSystemPaletteUse (डीसी, SYSPAL_NOSTATIC256) कॉल जोड़ा, और इससे कुछ स्थितियों में मदद मिली, लेकिन मुख्य समस्या का समाधान नहीं हुआ है। पैलेट की जगह उतनी ही तंग है जितनी है, इसलिए हम बदले में गेम या उपयोगकर्ता सामग्री की तुलना में कभी-कभी झटके से रहेंगे। –

3

आप क्या कर सकते हैं एक 'सरल' कामकाज है।

  • Blit एक गुप्त बफर के लिए सब कुछ (स्मृति)
  • 16 बिट के लिए 8 बिट बफर परिवर्तित (: के बाद से अपने खेल एक पुराने खेल है यह शायद वर्तमान हार्डवेयर के लिए कोई मुकाबला नहीं है, जिसके कारण यह चाल काम करेगा या 32 बिट) वर्तमान पैलेट (ताकि भी स्मृति में किया)
  • 16 बिट (या 32 बिट की सामग्री की प्रतिलिपि) स्क्रीन
  • फ्लिप screenbuffer की backbuffer को बफ़र का उपयोग कर।

यह आपके खेल के लिए कम से कम परिवर्तन की आवश्यकता होगी, और पूरी तरह से पैलेट मुद्दों से छुटकारा मिल जाएगा, हालांकि अपने खेल अभी भी सभी यह पैलेट प्रवंचना है का उपयोग कर सकते

आर

+0

कोई ऐसा व्यक्ति है जो पहले दो कमांड और जीत खेलों (सी और सी 1 और रेड अलर्ट 1) के लिए ऐसा करता है, एक ddraw.dll ओवरराइड बनाकर। बहुत अच्छी तरह से काम किया, और खिड़की मोड भी जोड़ा (कुछ हैक्स के बाद माउस ऑफ़सेट फ़ंक्शंस को अनुकूलित करने के लिए, अब-परिवर्तनीय 0,0 ऑफसेट की क्षतिपूर्ति करने के लिए)। Http://hifi.iki.fi/cnc-ddraw/ – Nyerguds

+0

पर परियोजना की जानकारी यही वह है जिसे हम पूरी तरह से पार करते थे, लेकिन यह सस्ता नहीं हुआ।कुछ उपयोगकर्ताओं ने सॉफ्टवेयर पैलेट परिवर्तन की वजह से * ट्रिपल * सीपीयू उपयोग की सूचना दी। –

+0

@ साइबरशैडो तो आप इसे गलत कर रहे हैं। परिवर्तन केवल लुकअप का उपयोग करके वास्तव में तंग पाश का उपयोग करके किया जा सकता है। यदि आप चाहते हैं कि मैं आपका कोड देख सकूं। – Toad

0

मैं कम से डायरेक्ट नहीं जानते सब, लेकिन मैं सुझाव देता हूं कि आपकी प्रतिपादन ऑफ-स्क्रीन करने के बाद प्रदर्शन गहराई में परिवर्तित हो रहा है ... मुझे लगता है कि आप डायरेक्ट 2 डी को अपने लिए यह सब कुछ करने के लिए प्राप्त कर सकते हैं ...

0
आपको बस इतना करना नियंत्रण कक्ष में 16 bit रंगों को अपने पीसी सेट कर दिया जाता है

और खेल सही आता है, मेरे लिए Original Command and Conquer पर काम करता है: डी

+1

यह एक समाधान नहीं है जिसे एक वीडियो गेम द्वारा लागू किया जा सकता है। साथ ही, यह विंडोज 8 के साथ शुरू होने वाले विंडोज संस्करणों के लिए काम नहीं करेगा, जो अब सही रंग से कम रंग मोड का समर्थन नहीं करता है। –

+1

इसके अलावा आप विंडोज 8 और बाद में डिस्प्ले कलर गहराई को 16-बिट पर सेट नहीं कर सकते हैं। –

+0

बस एफवाईआई, [ddraw ओवरराइड] (http://hifi.iki.fi/cnc-ddraw/) विशेष रूप से कमांड एंड कॉंकर के लिए बनाया गया है जो सभी ओएस पर चाल करता है। मैं सिर्फ [गेम के लिए पूर्ण अनौपचारिक पैच] डाउनलोड करने की सलाह दूंगा (http://nyerguds.arsaneus-design.com/cnc95upd/cc95p106/), हालांकि; सीएनसी-डीड्रा को वैसे भी अनुकूलित किया गया था: पी – Nyerguds

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