2010-08-26 11 views
6

मैं यह समझने की कोशिश कर रहा हूं कि मेरी समस्या के आसपास कैसे काम करना है। मैंने http://groups.google.com/group/android-developers/browse_thread/thread/a2aac88a08cb56c2/b7dff4ba388cd664?lnk=gst&q=SurfaceView#b7dff4ba388cd664 पढ़ा है जो मेरे प्रश्न का उत्तर देता है लेकिन जहां तक ​​मैं कह सकता हूं, यह एक तरह का "कठिन भाग्य" उत्तर है। तो यहां मेरी समस्या है:SurfaceView झिलमिलाहट/फाड़ना

जब भी सतह बदल जाती है (उदाहरण के लिए अभिविन्यास आदि) मैं अपनी गेम पृष्ठभूमि का बिटमैप खींचने के लिए सामान्य तरीके (लॉक/अनलॉक एंडपोस्ट) में SurfaceView का उपयोग कर रहा हूं और मैं आगे बढ़ने की श्रृंखला प्रस्तुत कर रहा हूं मंडल (लगभग 25.f के त्रिज्या के साथ 30 तक)। इन सर्किलों की स्थिति के लिए एक्स, वाई डेटा सर्वर से आ रहा है और यह सब ठीक चल रहा है। सभी सर्कल ऑब्जेक्ट्स एक सूची में संग्रहीत हैं और उनकी स्थिति को यह सुनिश्चित करने के लिए अद्यतन किया जाता है कि यह अद्यतन सिंक्रनाइज़ किया गया है। हालांकि, जब मैं इन सर्किलों को स्क्रीन पर खींचता हूं (कैनवास.लॉक() के दौरान), अधिकांश समय वे ठीक प्रस्तुत करते हैं लेकिन कभी-कभी (जैसे प्रत्येक कुछ सेकंड में) कुछ सर्कल एक फ्रेम के लिए संक्षेप में फाड़ या झिलमिलाहट लगती हैं। मंडलियों की संख्या हमेशा स्थिर होती है, इसलिए यह समस्या नहीं है और मंडलियों की सूची में कोई समवर्ती संशोधन नहीं है (जैसा कि मैंने कहा है, यह सिंक्रनाइज़ किया गया है)। मैंने इन सभी सर्किलों को प्रत्येक रेंडर लूप पर बिटमैप में खींचने और मुख्य कैनवास में उस बिटमैप को चित्रित करने का भी प्रयास किया है। ऐसा लगता है कि यह मुख्य रूप से मुख्य कैनवास में मंडलियों को चित्रित करते समय ~ 30FPS के विपरीत ~ 13FPS के रूप में परफॉर्मेंस को और भी प्रभावित करता है)। क्षमा करें अगर जानकारी थोड़ा अस्पष्ट है, (कंपनी को खुश रखने की कोशिश कर रहा है: पी) लेकिन मैं बस सोच रहा था कि कोई मुझे एक सुराग दे सकता है? या मैं बस भाग्य से बाहर हूँ। मुझे ध्यान रखना चाहिए कि सर्वर से आने वाला स्थिति डेटा रीयलटाइम डेटा है और यह बहुत महत्वपूर्ण है कि प्रतिपादन इन रीयलटाइम स्थितियों को दर्शाता है।

किसी भी मदद के लिए धन्यवाद! क्रिस

संपादित करें:

पर्याप्त मेला। रेंडर थ्रेड से रन() है।

@Override 
    public void run() { 
     Canvas c; 
     while (mRun) { 
      c = null; 
      try { 
       c = mSurfaceHolder.lockCanvas(null); 
       synchronized (mSurfaceHolder) { 
        panel.onDraw(c); 
       } 
      } finally { 
       if (c != null) { 
        mSurfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 

सुंदर मानक सामान (लगभग एक चंद्र लैंडर की कार्बन कॉपी: पी)

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    mBackground= Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.RGB_565); 
    screenOrientation = getResources().getConfiguration().orientation; 
    if(thread.getState()== Thread.State.TERMINATED){ 
     thread = new RenderThread(holder, this); 
     thread.setRunning(true); 
     thread.start(); 
    }else { 
     thread.setRunning(true); 
     thread.start(); 
    } 
} 



@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    Canvas c = new Canvas(mField); 
    c.drawARGB(255,0,144,0); 
    backgroundDetails.renderOnPanel(c, this); 
    screenOrientation = getResources().getConfiguration().orientation; 
} 

सुंदर आसान का पालन करने के लिए, बस पृष्ठभूमि बिटमैप अगर उन्मुखीकरण परिवर्तन पुनः बनाने और प्रतिपादन धागा शुरू करते हैं।

public void onDraw(Canvas canvas) { 
    canvas.drawBitmap(mField,0,0,null); 
    drawPositionBeans(canvas, this); 
} 

और अंत में:

public void onDraw(Canvas canvas, RadarView radarView) { 
    float beanX=0, beanY=0; 
    float radius = 25.0f; 
    final List<PositionBean> copyOfList = Collections.synchronizedList(positionBeans.getPositionBeans()); 
    synchronized(copyOfList){ 
     try { 
      for (final PositionBean pb : copyOfList) 
      { 
       if (panel.getOrientation() == Configuration.ORIENTATION_PORTRAIT) { 
        beanX = (float)pb.getY()*(-1); 
        beanY = (float)pb.getX(); 
       } else { 
        beanX = (float)pb.getY()*(-1); 
        beanY = (float)pb.getX()*(-1); 
       } 
       mPaint.setARGB(255,pb.getRgbColor().getR(), pb.getRgbColor().getG(), pb.getRgbColor().getB()); 
       panel.drawSpot(canvas, beanX, beanY, radius, mPaint); 

       mPaint.setStyle(Paint.Style.STROKE); 
       mPaint.setARGB(255,255,222,1); 
       for (int j = 0; j < selectedBean.size(); ++j) 
       { 
        if(pb.getTrack()==selectedBean.get(j)) { 
         panel.drawSpot(canvas, beanX, beanY, radius+1, mPaint); 
        } 
       } 
       mPaint.setStyle(Paint.Style.FILL); 
      } 

     } catch(Exception e) { 
      Log.e("render", "Exception Drawing Beans: " + e); 
     } 
    } 
} 

धन्यवाद फिर लोग। क्रिस

+0

असंभव द्वारा परिभाषित पुनः बनाने का अपने gameloop देखने और कोड ड्राइंग के बिना जवाब देने के लिए चाहते हैं। – Sebi

+0

सेबी के समान ही कहा - एक कोड नमूना उपयोगी होगा - लेकिन क्या आपने संभावना है कि आप कभी-कभी जो पद प्राप्त कर रहे हैं वह गलत हैं? सिर्फ एक विचार यह है कि क्यों सर्किल 'झिलमिलाहट' हो सकती है, अगर उन्हें अस्थायी रूप से ऑफ-व्यू पर रखा जा रहा है। फिर, बिना किसी कोड के जवाब देना असंभव होगा। – Seidr

+0

मदद लोगों के लिए बहुत धन्यवाद। लेकिन हाँ मुझे यकीन है कि स्थिति डेटा सही है। –

उत्तर

0

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

1

ऐसा इसलिए हो रहा है क्योंकि एंड्रॉइड ग्राफिक्स में बफर सतह और एक दृश्य सतह है और यह सुनिश्चित करने के लिए कि वे हमेशा उपलब्ध होते हैं, वे बस वैकल्पिक होते हैं। जिसका अर्थ यह है कि यदि आप एक फ्रेम पर आकर्षित करते हैं तो यह तब तक नहीं होगा जब तक आप इसे हर फ्रेम पर नहीं खींचते।

http://groups.google.com/group/android-developers/msg/8d1243c33f9b7b6e?pli=1

0

मैं सतह दृश्य के बारे में थोड़ा पढ़ने कि यदि आप

getHolder().lockCanvas(); 

फोन आप सब कुछ आकर्षित करने की आवश्यकता के बाद पाया फिर।

जब तक आप अपना गंदे क्षेत्र प्रदान नहीं करते।

getHolder().lockCanvas(Rect dirty); 

आप केवल क्षेत्र रेक्ट

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