Chúng tôi sử dụng tải Tải xuống Google Gava cho bitmap trong ứng dụng Android. Trong ứng dụng, tôi đang chạy một Thread vẽ, vẽ các bitmap trong bộ nhớ cache đến một Canvas. Nếu một bitmap cụ thể không có trong bộ nhớ cache, nó sẽ không được rút ra để không tải sẽ bao giờ chặn Chủ đề vẽ.Hiệu suất kém với Bộ nhớ cache ổi trên Android
Tuy nhiên, kết quả vẽ trong nói lắp hình ảnh và tốc độ khung hình trên giây không phải là cách chúng tôi muốn. Tôi đóng đinh nó xuống phương thức của bộ nhớ cache getIfPresent()
. Điều đó một mình chiếm hơn 20% tổng số ứng dụng của CPU. Trong getIfPresent()
LocalCache$Segment.get()
mất hơn 80% thời gian:
Ghi nhớ, đây chỉ là một tra cứu của một bitmap đã hiện diện. Sẽ không bao giờ xảy ra tải trong get()
. Tôi đã tìm thấy sẽ có một chi phí sổ sách kế toán trong get()
cho hàng đợi LRU quyết định việc trục xuất nào xảy ra nếu phân đoạn đầy. Nhưng điều này ít nhất là một đơn đặt hàng có cường độ chậm hơn so với mức Key-Lookup
trong số LRU-LinkedHashmap.get()
sẽ cho tôi.
Chúng tôi sử dụng bộ nhớ cache để tra cứu nhanh nếu phần tử nằm trong bộ nhớ cache, nếu tra cứu chậm, không có điểm nào trong bộ đệm ẩn. Tôi cũng đã thử getAllPresent(a)
và asMap()
nhưng nó mang lại hiệu suất như nhau.
Library phiên bản là: ổi-11.0.1.jar
LoadingCache được định nghĩa như sau:
LoadingCache<TileKey, Bitmap> tiles = CacheBuilder.newBuilder().maximumSize(100).build(new CacheLoader<TileKey,Bitmap>() {
@Override
public Bitmap load(TileKey tileKey) {
System.out.println("Loading in " + Thread.currentThread().getName() + " "
+ tileKey.x + "-" + tileKey.y);
final File[][] tileFiles = surfaceState.mapFile.getBuilding()
.getFloors().get(tileKey.floorid)
.getBackground(tileKey.zoomid).getTileFiles();
String tilePath = tileFiles[tileKey.y][tileKey.x].getAbsolutePath();
Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
return BitmapFactory.decodeFile(tilePath, options);
}
});
Câu hỏi của tôi là:
- Tôi sử dụng nó sai rồi?
- Việc triển khai có thực sự không khả thi đối với Android không?
- Tôi có bỏ lỡ tùy chọn cấu hình không?
- Đây có phải là sự cố đã biết với Cache đang được thực hiện không?
Cập nhật:
Sau khoảng 100 khung sơn các CacheStats là:
I/System.out(6989): CacheStats{hitCount=11992, missCount=97,
loadSuccessCount=77, loadExceptionCount=0, totalLoadTime=1402984624, evictionCount=0}
Sau missCount mà vẫn về cơ bản giống như gia hitCount. Trong trường hợp này, bộ nhớ cache đủ lớn để tải xuống xảy ra thưa thớt, nhưng getIfPresent chậm không nontheless.
Vui lòng không in đậm mọi cụm từ khác; rất khó đọc nên tôi đã gửi một bản chỉnh sửa để lấy nó ra. – simchona
Cảm ơn bạn, simchona đã chỉnh sửa nó để làm cho nó dễ đọc hơn. – user643011
Bạn có thể đăng các kết quả của 'tiles.cacheStats()'? –