2012-07-11 34 views
6

Tôi đang cố gắng để có được một hình ảnh ra khỏi một chế độ xem nơi người dùng có thể vẽ trên hoặc thêm một số chế độ xem khác. Với iPad1 & 2 mọi thứ đang hoạt động tốt cho đến nay. Nhưng trên iPad3 nó chạy như một con chó. Tôi chỉ sử dụng phương thức renderInContext của lớp.iPad 3 renderInContext chậm - Hiệu suất kết xuất kém

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
    UIGraphicsBeginImageContextWithOptions(self.viewDrawableViewContainer.frame.size, NO, [UIScreen mainScreen].scale); 
else 
    UIGraphicsBeginImageContext(self.viewDrawableViewContainer.frame.size); 
[self.viewDrawableViewContainer.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Tôi biết điều này có thể là do cpu tương đương với ipad2, nhưng phải mất khoảng 1 giây. Càng nhiều người dùng vẽ hoặc thêm, thì càng mất nhiều thời gian để hiển thị. Đôi khi lên đến 5 giây mà thực sự là không thể chấp nhận. Vì vậy, có bất kỳ tùy chọn nào để cải thiện hiệu suất không? Bất kỳ cơ hội nào để có thể đặt chất lượng hiển thị nhỏ hơn - Tôi không cần hiển thị ở độ phân giải cao nhất ...

Tôi sẽ đánh giá cao bất kỳ trợ giúp nào! Cảm ơn trước

+1

Bạn có thể dự đoán chế độ xem nào sẽ được vẽ không? Nếu vậy bạn có thể thực hiện thao tác vẽ trong nền và lưu vào bộ nhớ cache kết quả, điều này sẽ không làm đóng băng thiết bị. –

+0

Được rồi, cảm ơn vì gợi ý, tôi có thể tạo hình ảnh ở chế độ nền nhưng vấn đề là, người dùng có thể viết một số văn bản và nhấn vào khi di chuyển. Sau đó, tôi sẽ phải thực hiện bản vẽ ngay lập tức sau khi người dùng tương tác vì chế độ xem sẽ bị đóng sau khi nhấn vào khi di chuyển. Nhưng cảm ơn, có lẽ tôi có thể hiển thị trong khi hoạt ảnh đóng đang hoạt động. Tôi sẽ thử ... Vì vậy, không có cách nào khác để cải thiện hiệu suất hiển thị? – Alexander

+0

Không may mắn thay, tung ra 4 lần về cơ bản cùng một CPU với nhiều pixel chỉ đơn giản là giết hiệu suất. Masking nó với hình ảnh động là một cách tuyệt vời để giải quyết vấn đề, và là cách Apple làm điều đó. Nếu bạn cho phép người dùng vẽ vào chế độ xem, bạn đang vẽ gì? Không có UIImage nào sao lưu chế độ xem mà bạn có thể kéo ra ngay lập tức thay vì hiển thị chế độ xem theo ngữ cảnh không? –

Trả lời

9

Bạn có thể tăng tốc độ bằng cách hiển thị ở độ phân giải thấp hơn. Sử dụng hệ số tỷ lệ UIGraphicsBeginImageContextWithOptions nhỏ hơn 1.0, ví dụ: 0,5.

Ngoài ra, nếu bạn không cần alpha, bạn có thể tăng tốc độ nhỏ bằng cách chuyển YES cho cờ mờ đục. Tôi đã không tự mình định thời gian.

+0

đã thử điều này. Tôi đã sử dụng NSDate * d1 = [Ngày NSDate]; ... NSDate * d2 = [Ngày NSDate]; [d2 timeIntervalSinceDate: d1]; để đo thời gian cần và không có sự khác biệt. iPad 3 chỉ chậm hơn nhiều so với iPad2 (~ 0.3 giây đến ~ 1.7 giây) – Nadav

16

Bạn cũng có thể tăng tốc độ hiển thị bằng cách sửa đổi chất lượng nội suy trong ngữ cảnh của bạn trước khi bạn gọi kết xuất trong ngữ cảnh. Tôi đã có thể nhận được ảnh chụp màn hình tốc độ cao hơn nhiều với thay đổi này bằng cách thay đổi hệ số tỷ lệ.

Tất nhiên bạn có thể sử dụng cả hai và bạn không phải đặt chất lượng thành Không, Thấp vẫn là một cải tiến đối với tôi.

CGContextSetInterpolationQuality(ctx, kCGInterpolationNone); 

Ngoài ra, đối với yếu tố quy mô như đã đề cập trong các câu trả lời trước đảm bảo yếu tố quy mô mới của bạn là một bội số của bản gốc Ví dụ: nếu quy mô màn hình là 1.0 bạn nên làm một cái gì đó giống như .5 và không .8. Sử dụng .8 sẽ làm cho render có tính toán nhiều thông tin hơn (vì nó không phải là một quy mô thậm chí) và do đó làm cho nó chậm hơn so với sử dụng 1.0 bởi vì.

Tất nhiên đây không phải là giải pháp tốt cho mọi người.

+2

'CGContextSetInterpolationQuality' làm cho những điều tuyệt vời! Trong trường hợp của tôi, tôi đang hiển thị lớp 'UICollectionView' với hình ảnh trong ô - thay đổi chất lượng nội suy cao thành trung bình/thấp tăng tỷ lệ khung hình khi cuộn rất đáng kể. – brigadir

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