2010-08-26 50 views
6

Tôi đang cố gắng tìm ra cách khắc phục sự cố của mình. Tôi đã đọc http://groups.google.com/group/android-developers/browse_thread/thread/a2aac88a08cb56c2/b7dff4ba388cd664?lnk=gst&q=SurfaceView#b7dff4ba388cd664 loại câu trả lời cho câu hỏi của tôi nhưng theo như tôi có thể nói, đó là một loại câu trả lời "may mắn khó khăn". Vì vậy, đây là vấn đề của tôi:Nhấp nháy/rách bề mặt

Tôi đang sử dụng SurfaceView theo cách thông thường (khóa/mở khóaAndPost) để vẽ bitmap nền trò chơi của mình bất cứ khi nào bề mặt bị thay đổi (ví dụ: hướng vv). vòng tròn (lên đến 30 với bán kính khoảng 25.f). Dữ liệu x, y cho vị trí của các vòng kết nối này đến từ máy chủ và tất cả đều chạy tốt. Tất cả các đối tượng hình tròn được lưu trữ trong một danh sách và vị trí của chúng được cập nhật cẩn thận để đảm bảo bản cập nhật này được đồng bộ hóa. Tuy nhiên, khi tôi vẽ các vòng tròn này vào màn hình (trong canvas.lock()), hầu hết thời gian chúng hiển thị tốt nhưng đôi khi (ví dụ: cứ sau vài giây) một số vòng tròn dường như bị rách hoặc nhấp nháy trong một khung. Số lượng vòng kết nối luôn không đổi nên đó không phải là vấn đề và không có sửa đổi đồng thời cho danh sách vòng kết nối (như tôi đã nói, nó được đồng bộ hóa). Tôi thậm chí đã thử vẽ tất cả các vòng tròn này vào một Bitmap trên mỗi vòng lặp vẽ và vẽ bitmap đó vào khung chính. Điều này dường như chỉ ảnh hưởng đến hiệu suất hơn nữa (~ 13FPS như trái ngược với ~ 30FPS khi vẽ vòng tròn trực tiếp tới khung chính). Xin lỗi nếu thông tin là một kẻ mơ hồ nhỏ, (cố gắng để giữ cho công ty hạnh phúc: p) nhưng tôi đã chỉ tự hỏi nếu có ai có thể cho tôi một đầu mối? Hay là tôi không may mắn. Tôi nên lưu ý rằng dữ liệu định vị đến từ máy chủ là dữ liệu thời gian thực và điều quan trọng là việc hiển thị phản ánh các vị trí thời gian thực này.

Cảm ơn bạn đã trợ giúp! Chris

EDIT:

Đủ công bằng. Đây là run() từ chuỗi render.

@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); 
       } 
      } 
     } 
    } 

thứ Khá chuẩn (gần như một bản sao carbon của tàu đổ bộ mặt trăng: p)

@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; 
} 

Khá dễ dàng để làm theo, chỉ vẽ lại bitmap nền nếu những thay đổi định hướng và bắt đầu thread rendering.

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

Và cuối cùng:

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); 
     } 
    } 
} 

Cảm ơn một lần nữa chàng trai. Chris

+0

Impossible để trả lời mà không nhìn thấy gameloop của bạn và vẽ mã. – Sebi

+0

Giống như Sebi đã nói - một mẫu mã sẽ hữu ích - nhưng bạn có cho rằng khả năng các vị trí bạn thỉnh thoảng nhận được không chính xác? Chỉ là một suy nghĩ về lý do tại sao các vòng tròn có thể là 'nhấp nháy', nếu chúng được định vị tạm thời tắt chế độ xem. Một lần nữa, không có mã nào sẽ không thể trả lời được. – Seidr

+0

Rất cám ơn các bạn đã giúp đỡ. Nhưng có, tôi chắc chắn dữ liệu định vị là chính xác. –

Trả lời

0

Tôi gặp sự cố đó. Giải pháp phù hợp với tôi là đồng bộ hóa phương thức onDraw và phương thức cập nhật ma trận chuyển đổi. Vì có các khung khi ma trận giống hệt nhau (giá trị ban đầu của ma trận mới()) và trong khung tiếp theo nó có giá trị đúng.

0

tôi tìm thấy sau khi đọc một chút về quan điểm của bề mặt mà nếu bạn gọi

getHolder().lockCanvas(); 

Bạn cần phải rút ra tất cả mọi thứ lần nữa.

Trừ khi bạn cung cấp khu vực bẩn.

getHolder().lockCanvas(Rect dirty); 

Nếu bạn chỉ muốn vẽ lại khu vực được xác định bởi các Rect

Các vấn đề liên quan