2015-07-21 31 views
6

Ứng dụng của tôi UIKit lưu trữ một số thứ như 100 (100x100) jpeg tệp, giả sử được sử dụng làm "hình mẫu". kích thước trung bình cho mỗi hình ảnh đôi khi giống như 20~40 kb.IOS - Phương pháp hay nhất để xử lý số lượng lớn hình ảnh (Hiệu suất + Kích thước trên đĩa)

Tôi cũng là nhà phát triển cocos2d-x. Trong môi trường coco, tôi đang sử dụng plist để "liên kết" từng hình ảnh và cắt nó qua plist. Đây là hiệu suất tuyệt vời và tiết kiệm kích thước, nhưng theo như tôi biết nó không thể trên UIKit. Vì vậy, câu hỏi của tôi là, Có cách nào tốt hơn để lưu trữ/kéo hình ảnh này để cải thiện dung lượng đĩa và tăng hiệu suất, ngoài việc kéo và thả tệp vào XCode và sử dụng nó như bình thường không? Không.

+0

100 100x100 hình ảnh không phải là nhiều bộ nhớ. Giả sử tất cả được nạp vào, đó là (100 * 100 * 100 * 4) byte bộ nhớ khi được giải mã, chỉ có 4MB. UIKit sẽ xử lý việc sao chép tài nguyên của bạn, cũng như lưu vào bộ nhớ đệm/giải phóng chúng trong môi trường bộ nhớ thấp, vì vậy tôi nghĩ đây chỉ là tối ưu hóa sớm. –

+0

Richard là đúng trong số lượng bộ nhớ không phải là quá xấu, nhưng nếu bạn thực sự cần thiết, bạn có thể làm cho những hình ảnh thành một sprite duy nhất và sau đó gọi nó bằng cách sử dụng coords. Tôi đã sử dụng trang web này trước đây để tạo CSS Sprite http://spritegen.website-performance.org – Cole

+0

@Cole không tốt cho hiệu suất trên iOS - mức tăng bạn nhận được cho địa phương bộ nhớ cache là tối thiểu và như tôi đã đề cập trước UIKit thực hiện một số kỹ thuật lưu trong bộ nhớ đệm nâng cao để đảm bảo rằng chỉ những hình ảnh được sử dụng được lưu lại trong bộ nhớ tại bất kỳ thời điểm nào. Ngoài ra, hình ảnh trên 1024x1024 hoạt động rất kém trên các thiết bị cũ hơn (do giới hạn phần cứng trong bộ đệm kết cấu, hình ảnh phải được UIKit lát gạch). –

Trả lời

2

[bất kỳ số lượng] hình ảnh nào thực sự không phải là vấn đề trên iOS vì có hệ thống bộ nhớ đệm nâng cao được đặt đúng chỗ để chăm sóc việc sử dụng lại hình ảnh. Ngoài ra hệ thống rendering của iOS là khá tuyệt vời, do đó bạn không phải lo lắng về nó.

Mặc dù có thể lập trình hệ thống cho sprites, tôi sẽ không khuyên bạn làm điều đó. Phương pháp này chủ yếu được sử dụng trong Phát triển Web (vì mỗi hình ảnh phải được phục vụ với yêu cầu mới * chú thích no longer true with HTTP/2) và rõ ràng là để phát triển trò chơi (vì kết cấu ít ràng buộc gọi bạn càng tốt).

Có một ví dụ hay về lý do không sử dụng sprites - nếu bạn đang phát triển ứng dụng Xem và bạn muốn làm hoạt ảnh, bạn làm điều đó thông qua hình ảnh kiểu bảng lật (chuỗi ảnh có tên là 1.png - 100.png) và không phải bằng cách sử dụng bản đồ lớn của hình ảnh. Trong khi nó sẽ được đoán là tại sao họ quyết định làm theo cách đó (tôi đoán là vì nó hoạt động tốt như thế nào trong nội bộ + thông lượng của bluetooth), rõ ràng rằng nó cũng là lựa chọn ưa thích của Apple và vì vậy chúng ta nên làm theo .

Đối với iOS, có một số cạm bẫy mà bạn nên biết:

  • Bất kỳ hình ảnh được tải từ trang Web không nên nạp vào chủ đề chính, như vậy thực sự đi với tất cả các hình ảnh đó không phải là mặt tại tải của màn hình (hình ảnh trong UITableViewCell là ví dụ tuyệt vời, bởi vì bạn có thể thấy mini đóng băng nếu hình ảnh lớn khi bạn cuộn qua)
  • Nếu bạn có nhiều lớp, hình ảnh với kênh alpha! = 1 giảm hiệu suất rất nhiều (nhưng thường không thể tránh khỏi)
  • Hình nền được tạo với UIColor.colorWithPatternImage() phải b e sử dụng một cách thận trọng, vì phương pháp này được coi là có vấn đề (details here)

Bây giờ như đối với tải không đồng bộ của các hình ảnh, tôi đề nghị bạn hãy nhìn vào thư viện sau:

Cả hai đều lớn nên nó thực sự là vấn đề sở thích (tôi thích Haneke Bett er), nhưng chúng cho phép bạn tải hình ảnh về các chủ đề khác nhau, có thể là từ Web hoặc từ gói của bạn. Họ cũng có phần mở rộng cho UIImageView cho phép bạn sử dụng chức năng 1 dòng để tải tất cả hình ảnh một cách dễ dàng.

Hy vọng điều đó sẽ hữu ích!

+0

Cảm ơn bạn đã trả lời của bạn, Rò rỉ bộ nhớ mà colorWithPatternImage có thể tạo ra là chi tiết rất hữu ích, cũng như về thông tin phụ :) Cảm ơn bạn! –

+0

luôn sẵn sàng trợ giúp! –

1

Sẽ có trong iOS 9 nếu tính;) Được gọi là Tài nguyên theo yêu cầu và cho phép bạn lưu trữ nội dung bằng Apple và tải xuống nội dung khi cần thiết cho cấp độ, v.v. những gì họ sử dụng làm ví dụ tại WWDC.

Kiểm tra xem tại đây: https://developer.apple.com/library/prerelease/ios/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/

+0

Thông tin rất hữu ích, cảm ơn bạn đã trả lời @Drmorgan! –

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