2013-06-23 26 views
8

Vì vậy, tôi đang cố gắng hiểu cách sử dụng đúng khả năng tăng tốc phần cứng (nếu có) trong tùy chỉnh View liên tục hoạt ảnh. Đây là tiền đề cơ bản của onDraw() tôi:Sử dụng Lớp phần cứng trong Chế độ xem tùy chỉnh trênDraw

canvas.drawColor(mBackgroundColor); 

for (Layer layer : mLayers) { 
    canvas.save(); 
    canvas.translate(layer.x, layer.y); 

    //Draw that number of images in a grid, offset by -1 
    for (int i = -1; i < layer.xCount - 1; i++) { 
     for (int j = -1; j < layer.yCount - 1; j++) { 
      canvas.drawBitmap(layer.bitmap, layer.w * i, layer.h * j, null); 
     } 
    } 

    //If the layer's x has moved past its width, reset back to a seamless position 
    layer.x += ((difference * layer.xSpeed)/1000f); 
    float xOverlap = layer.x % layer.w; 
    if (xOverlap > 0) { 
     layer.x = xOverlap; 
    } 

    //If the layer's y has moved past its height, reset back to a seamless position 
    layer.y += ((difference * layer.ySpeed)/1000f); 
    float yOverlap = layer.y % layer.h; 
    if (yOverlap > 0) { 
     layer.y = yOverlap; 
    } 

    canvas.restore(); 
} 

//Redraw the view 
ViewCompat.postInvalidateOnAnimation(this); 

Tôi đang tạo điều kiện cho các lớp phần cứng trong onAttachedToWindow() và vô hiệu hóa chúng trong onDetachedFromWindow(), nhưng tôi đang cố gắng để hiểu hay không Tôi thực sự sử dụng nó. Về cơ bản, vòng lặp i/j gọi drawBitmap() không bao giờ thay đổi; điều duy nhất thay đổi là bản dịch Canvas. Có phải Bitmap được lưu tự động vào GPU dưới dạng kết cấu đằng sau hậu trường hay không hoặc có điều gì tôi cần thực hiện theo cách thủ công để làm như vậy không?

+0

Tôi có thể đã hiểu nhầm câu hỏi nhưng bạn có đặt 'setLayerType (View.LAYER_TYPE_HARDWARE, null);' cho chế độ xem của bạn không? GPU Caches các hình ảnh chỉ miễn là người dùng đang tích cực di chuyển nhưng không khác, như là một sự cân bằng cho tiêu thụ tài nguyên ít hơn. – Slartibartfast

+0

@Slartibartfast Vâng, tôi đã đặt loại lớp thành phần cứng. Người dùng sẽ không bao giờ thực sự cuộn; chế độ xem đang di chuyển nội dung của chính nó liên tục. Tôi có thể hiểu nhầm về tăng tốc HW, nhưng tôi cảm thấy như lưới của bitmap tôi đang vẽ sẽ có thể được đưa vào một lớp phần cứng và chỉ dịch thay vì vẽ lại các ảnh bitmap trên mọi khung hình. – kcoppock

Trả lời

6

Trên (các) chế độ xem nào bạn đang đặt View.LAYER_TYPE_HARDWARE chính xác? Nếu bạn đang thiết lập một lớp phần cứng trên khung nhìn có chứa mã vẽ được hiển thị ở trên, bạn đang làm cho hệ thống làm nhiều việc hơn mức cần thiết. Vì bạn chỉ vẽ bitmap mà bạn không cần phải làm gì ở đây. Nếu bạn gọi Canvas.drawBitmap(), khung làm việc sẽ lưu kết quả OpenGL kết quả thay cho bạn.

Tuy nhiên, bạn có thể tối ưu hóa mã của mình nhiều hơn một chút. Thay vì gọi số drawBitmap(), bạn có thể sử dụng chế độ xem con. Nếu bạn di chuyển các trẻ này bằng cách sử dụng phương thức offset*() (hoặc setX()/setY()), khung sẽ áp dụng các tối ưu hóa khác để tránh gọi lại phương thức draw().

Nói chung, các lớp phần cứng nên được đặt trên các chế độ xem đắt tiền để vẽ và nội dung của chúng sẽ không thay đổi thường xuyên (rất nhiều điều ngược lại với những gì bạn đang thực hiện)

+0

Cảm ơn @RomainGuy. Tôi đã đặt 'LAYER_TYPE_HARDWARE' trên' Chế độ xem' được hiển thị ở trên. Vì vậy, kết cấu sẽ tự động được lưu trữ? Đó là những gì tôi đang tìm kiếm. Vì vậy, bạn đang nói rằng thực sự hiệu quả hơn khi thêm hai chế độ xem con và sử dụng bản dịch trên các chế độ xem con đó, thay vì vẽ các bitmap trên canvas trực tiếp? Tôi sẽ xem xét điều đó. Cảm ơn! – kcoppock

+1

Có, kết cấu sẽ tự động được lưu vào bộ nhớ cache. Bạn có thể truy vấn trạng thái của các bộ đệm khác nhau từ dòng lệnh bằng cách sử dụng adb shell dumpsys gfxinfo com.your.app.Sử dụng Views * hiệu quả hơn trong trường hợp của bạn *, bởi vì bạn đang di chuyển bitmap rất nhiều. Chúng tôi phát hiện tình huống này với Chế độ xem và thay vì gọi lại phương thức draw(), chúng tôi chỉ thiết lập thuộc tính gốc trong trình kết xuất đồ họa. Nó gần như miễn phí. –

1

Bạn có thể sử dụng Tracer for OpenGL ES của Android để xem liệu chế độ xem có phát các lệnh OpenGL hay không.

Từ developer.android.com

Tracer là một công cụ để phân tích OpenGL Embedded Systems (ES) mã trong ứng dụng Android của bạn. Công cụ này cho phép bạn chụp các lệnh OpenGL ES và khung hình ảnh khung để giúp bạn hiểu các lệnh đồ họa của bạn đang được thực hiện như thế nào.

Ngoài ra còn có một hướng dẫn về Android Performance Study Romain Guy trong đó mô tả việc sử dụng nó gần như từng bước một.