2013-01-15 22 views
9

Tôi đang tìm kiếm trợ giúp về sự cố hiệu suất trong ứng dụng iOS dựa trên Mục tiêu-C.Làm cách nào để tôi có thể ghi lại màn hình với hiệu suất có thể chấp nhận được trong khi vẫn giữ nguyên giao diện người dùng?

Tôi có ứng dụng iOS chụp nội dung của màn hình bằng phương thức renderInContext của CALayer. Nó cố gắng chụp đủ khung màn hình để tạo video bằng AVFoundation. Việc ghi màn hình sau đó được kết hợp với các yếu tố khác cho mục đích nghiên cứu về khả năng sử dụng. Trong khi màn hình đang được chụp, ứng dụng cũng có thể hiển thị nội dung của UIWebView, đi qua mạng để tìm nạp dữ liệu, v.v ... Nội dung của chế độ xem Web không nằm trong tầm kiểm soát của tôi - đó là nội dung tùy ý từ Web.

Thiết lập này đang hoạt động nhưng như bạn có thể tưởng tượng, nó không trơn nhẵn. Vì lớp phải được hiển thị trên chuỗi chính, có nhiều giao diện người dùng hơn tôi muốn. Những gì tôi muốn làm là để có một thiết lập, nơi đáp ứng của giao diện người dùng được ưu tiên hơn chụp màn hình. Ví dụ: nếu người dùng đang cuộn chế độ xem Web, tôi muốn thả khung trên bản ghi hơn là có trải nghiệm cuộn khủng khiếp.

Tôi đã thử nghiệm một số kỹ thuật, từ dispatch_source phối hợp để gửi yêu cầu chụp khung dưới dạng các khối đến hàng đợi chính tới CADisplayLink. Cho đến nay tất cả họ dường như thực hiện về giống nhau. Việc chụp khung hiện đang được kích hoạt trong drawRect của giao diện chính của màn hình.

Những gì tôi yêu cầu ở đây là: được đưa ra ở trên, bạn sẽ gợi ý những kỹ thuật gì để đạt được mục tiêu của mình? Tôi nhận ra câu trả lời có thể là không có câu trả lời tuyệt vời ... nhưng tôi muốn thử bất cứ điều gì, tuy nhiên wacky nó có thể âm thanh.

LƯU Ý: Dù kỹ thuật nào cần phải thân thiện với App Store. Không thể sử dụng một cái gì đó giống như CoreSurface hack mà Display Recorder sử dụng/sử dụng.

Cảm ơn sự giúp đỡ của bạn!

+0

Điều này có được thực hiện trong Mục tiêu-C không? Bất kể, quá trình ghi âm có khả thi hay không và nếu yêu cầu cuối cùng mất quá lâu thì dừng ghi hình cho các khung X (chọn một số)? Tôi không có điểm kinh nghiệm của iOS, nhưng đây là điều đầu tiên tôi nghĩ đến. – Jared

+0

Xin chào - vâng, tất cả Obj-C ... Vì 'quá dài' thay đổi đáng kể giữa các thiết bị do sự khác biệt của CPU, điều này có thể sẽ ít chính xác hơn mức cần thiết. – Hunter

+0

Có thể làm điều gì đó tương tự như một cuộc gỡ lỗi javascript? https://github.com/pixelspring/NKBlueprint-Obj-C-Mix-Edition hoặc có thể giám sát việc sử dụng CPU trước cuộc gọi? http://stackoverflow.com/questions/12889422/ios-cpu-usage-for-each-process-using-sysctl – Jared

Trả lời

1

"Vì lớp phải được hiển thị trên chuỗi chính", điều này không đúng, miễn là bạn không chạm vào UIKit.

Vui lòng xem https://stackoverflow.com/a/12844171/136305

+0

Bạn đã sử dụng phương pháp này với thành công chưa? – Hunter

+0

Các thử nghiệm ban đầu của tôi cho thấy rằng renderInContext của CALayer: không * không * hoạt động đáng tin cậy trên một chuỗi nền. Tai nạn ngẫu nhiên rất nhiều. – Hunter

+0

Tôi không gặp khó khăn khi hiển thị trong chuỗi nền. Trong thực tế, việc hiển thị một CALayer trong một chuỗi nền là thực hành chuẩn cho cách tiếp cận CATiledLayer, được sử dụng trong nhiều ứng dụng. Chỉ cần chắc chắn rằng bạn dính vào các phương pháp CG ... và tránh các phương thức UI ... Nhưng sau đó một lần nữa, tôi chưa bao giờ thực hiện một video trong nền. – fishinear

0

Có thể bạn có thể ghi ở độ phân giải một nửa để tăng tốc độ, nếu điều đó phù hợp với yêu cầu?

+0

Làm cách nào bạn chụp màn hình ở độ phân giải một nửa? – Hunter

+0

@Hunter: nếu bạn không gọi 'UIGraphicsBeginImageContextWithOptions' trước khi bạn gọi' UIGraphicsGetCurrentContext', thì bạn đã chụp ảnh không phải võng mạc (tức là một nửa độ phân giải) khi chạy trên thiết bị võng mạc. – MusiGenesis

+0

@MusiGenesis Bạn đang đề cập đến các tài sản quy mô? Các thử nghiệm của tôi dường như chỉ ra rằng trong khi ngữ cảnh có thể nhận được các nội dung khác nhau, renderInContext của CALayer dường như thực hiện tương tự cho cả 1.0 và 2.0 khi được đặt cho thang đo. Bạn có thông tin khác không? – Hunter

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