2013-01-17 67 views
11

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

public void run() { 
    this.run = true; 
    Canvas canvas = null; 
    while (run) { 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (this.surfaceHolder) { 
       Thread.sleep(delay); 
       draw(new Img(canvas, size)); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } finally { 
      if (canvas != null) { 
      this.surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
     synchronized (this) { 
      if (wait) { 
       try { 
        wait(); 
       } catch (Exception e) {} 
      } 
     } 
    } 
} 

यदि यह एंड्रॉइड ट्रिपल बफरिंग है - इसे कैसे बंद करें, या इसके साथ कुछ करें? एंड्रॉयड 4.2.1

+1

मैं वर्तमान एंड्रॉइड उपकरण ट्रिपल बफरिंग सोच रहा हूं। यह यहाँ खेल सकता है? – DThought

+0

एंड्रॉइड आदि का संस्करण क्या है? –

+1

एंड्रॉइड 4.2.1 यू – user1748526

उत्तर

1
  1. मैं एक Runnable कार्यान्वयन (जिसमें विधि शून्य रिटर्न) में एक बूलियन क्षेत्र, "रन" नामकरण के खिलाफ की सिफारिश करेंगे। यहां तक ​​कि यदि समस्याएं संघर्ष से सतह पर नहीं आती हैं, तो यह भ्रमित है। शायद "चल रहा", या कुछ (कुछ भी), अधिक समझ में आता है - डीबग करना आसान है।

  2. ऑब्जेक्ट.वाइट का उपयोग न करें जब आप बहु-थ्रेडिंग करते हैं। जैसा कि आप उम्मीद कर सकते हैं यह हमेशा (आमतौर पर, नहीं करेगा) कार्य करेगा।

  3. आपको शायद अपने कैनवास सदस्य के कई उदाहरण मिल रहे हैं क्योंकि कहीं (शायद एंड्रॉइड फ्रेमवर्क में, या शायद आपके कोड में ... कहना मुश्किल है), "नया कैनवास (तर्क)" क्या कहा जा रहा है आप मानते हैं कि आपका एकमात्र कैनवास उदाहरण दूसरे धागे पर है। जबकि आपके पास केवल एक संदर्भ है, एक से अधिक उदाहरण बनाए जा सकते हैं।

  4. मैं सिंक्रनाइज़ (जो कुछ भी) का उपयोग करने की अनुशंसा नहीं करता, जब तक कि आप सुनिश्चित न हों कि आपको ऐसा करने की आवश्यकता है।

  5. वहां रुको। यह समस्या बहुत उलझन में है - मैंने पिछले वसंत के माध्यम से काम किया था और यह आसान या मजेदार नहीं था।

आशा है कि उपरोक्त में से कोई भी किसी भी तरह से मदद करता है।

-Brandon

1

आप अपने पिछले ड्रॉ संरक्षित करने के लिए आप एक ऑफ स्क्रीन कैनवास में उन्हें आकर्षित करने और उन्हें कैनवास आप लॉक कैनवास से मिला करने के लिए आकर्षित करना चाहिए पसंद है।

Bitmap offScreenBitmap = Bitmap.createBitmap(100,200,Bitmap.ARGB_8888); 
Canvas offScreenCanvas = new Canvas(offScreenBitmap); 

onScreenCanvas = this.surfaceHolder.lockCanvas(); 

//always draw to te offScreenCanvas 
offScreenCanvas.drawXxxx 

//copy the data to on-screen canvas you got from the lock 
onScreenCanvas.drawBitmap(offScreenBitmap); 

unlockAndPost(onScreenCanvas) 

कि अपने कार्य किया जाना चाहिए:

puesd-कोड विचार वर्णन करने के लिए। सही?

फिर , हुड सामान के नीचे एक छोटा सा:

हाँ, एंड्रॉयड (सतह एक दृश्य है) दृश्य गुणा बफ़र्स है: एक ड्राइंग के लिए एप्लिकेशन द्वारा प्रयोग किया जाता है और एक प्रतिपादन और के लिए प्रणाली द्वारा प्रयोग किया जाता है कभी-कभी तीसरा होता है जब ऐप समय पर ड्राइंग खत्म नहीं कर सकता है। इसे बंद करने का कोई तरीका नहीं है और आप नहीं चाहेंगे। और जब आप पहले ही देख चुके हैं तो लॉक करते समय आपको विभिन्न कैनवास मिलते हैं।