2011-01-31 62 views
7

Tôi đang thêm vài CALayer làm lớp con của lớp UIView. Nội dung của mỗi lớp là một hình ảnh khác nhau được tải xuống từ máy chủ. Mỗi lớp được làm động từ màn hình ngoài đến vị trí được tạo ngẫu nhiên. Dữ liệu hình ảnh được tải xuống không đồng bộ. Mỗi hình ảnh có kích thước xấp xỉ 300x300 hoặc nhỏ hơn.Tối ưu hóa CALayer?

Do vị trí ngẫu nhiên, các lớp chồng lên nhau và một số bị che khuất bởi các lớp phía trên chúng. Tất cả đều tốt.

Tôi đang xóa các lớp khi chúng bị che khuất hoàn toàn khỏi chế độ xem bằng cách sử dụng đề xuất trong the answer to this question Các tính toán để xác định mức độ phù hợp xảy ra trên một chuỗi riêng biệt.

Tôi có UIPanGestureRecognizer cho phép người dùng kéo các lớp xung quanh trên màn hình.

Tôi gặp phải sự cố về hiệu suất khi số lượng lớp được thêm vào 25-30 và dần dần trở nên tồi tệ hơn. Các hình ảnh động trở nên choppy và thường hoàn toàn vắng mặt (các lớp mới được thêm vào chỉ đơn giản xuất hiện ở vị trí cuối cùng của chúng). Và cử chỉ pan bị bỏ qua hoặc dẫn đến việc tái định vị của lớp đã chọn.

Tôi giả sử rằng tôi đang giết GPU với tất cả các lớp chồng lên nhau và một lớp khác đang hoạt ảnh ở trên?

Bất kỳ đề xuất nào về cách cải thiện hiệu suất?

Thực tiễn tốt nhất để xử lý số lượng lớn các lớp?

Làm cách nào để lớp bắt đầu hoạt ảnh trong chế độ xem riêng biệt hơn các lớp đã thêm trước đó?

Cảm ơn!

Trả lời

4

Vài điều nhanh chóng để kiểm tra.

Chạy Công cụ hoạt ảnh chính và tìm độ mờ đục. Chỉ cần đặt cờ mờ của lớp thành YES là không đủ, nếu hình ảnh bên dưới có thành phần alpha thì lớp đó sẽ được xem xét.

Nếu dữ liệu bạn nhận được từ máy chủ của bạn có alpha thì bạn nên vẽ lại bằng Quartz và lưu tệp cục bộ ở định dạng mới không bao gồm alpha.

Đảm bảo chắc chắn rằng bạn không đặt 1 ảnh mega pixel vào các ô 100x100. Ngoài ra Core Animation Instrument, chuyển sang 'Color Misaligned Images' và tìm màu vàng.

30 đến 50 lớp sẽ không thành vấn đề.

+0

Cảm ơn Bill. Tôi sẽ cho nó một viên đạn. Tôi đã được ấn tượng rằng opaque đã bị bỏ qua khi cung cấp layer.contents (chỉ được sử dụng khi một lớp đang được vẽ trên?). Bit alpha sẽ phức tạp hơn - tôi đang sử dụng đường viền trong suốt rộng 2px xung quanh mép của hình ảnh để làm mịn các cạnh được xoay. Tắt đến các dụng cụ !! – TomH

+0

Hi Tom - yep opaque bị bỏ qua trừ khi vẽ, bạn có thể nghĩ nó là arg thứ 2 cho UIGraphicsBeginImageContextWithOptions, nếu nội dung của bạn có kênh alpha thì lớp sẽ trong suốt - nếu bạn có thời gian, hãy gửi lỗi về cờ edgeAntialiasingMask –

+1

Tuyệt vời.Tôi đã thêm kênh alpha vào UIImage của mình, thêm đường viền trong suốt 2px và sau đó sử dụng hình ảnh làm nội dung cho lớp. Perf được cải thiện rất nhiều bằng cách không thêm đường viền alpha và trong suốt - không có vấn đề gì với> 30 lớp. Thật không may, edgeAntialiasingMask dường như không có bất kỳ hiệu ứng nào. Tôi sẽ gửi một lỗi. – TomH

3

Nếu tất cả các lớp không vừa với bộ nhớ hoặc phần bộ nhớ của GPU, mọi thứ sẽ làm chậm rất nhiều. Tải và dỡ bộ nhớ GPU được báo cáo là khá chậm so với các lớp tổng hợp trong bộ nhớ GPU. Bạn sẽ phải thử nghiệm với giới hạn bộ nhớ này, vì các thiết bị cũ hơn có ít bộ nhớ GPU hơn các thiết bị gần đây hơn.