2009-10-23 31 views
5

Hoạt ảnh chính sử dụng chuỗi nền để thực hiện công việc. Bây giờ vấn đề là điều này: Tôi có một tính toán nặng đang diễn ra trong chủ đề chính. Core Animation ngay lập tức đóng băng cho đến khi tính toán được thực hiện. Và sau đó nó tiếp tục hoàn thành hình ảnh động của nó. Tôi nhớ đọc trong một tài liệu mà CA có ưu tiên thấp trong thời gian xử lý, có nghĩa là bất kỳ chủ đề chính nào muốn làm là prio cao và sẽ được thực hiện nhiều khả năng hơn bất kỳ hoạt ảnh ưa thích nào cùng một lúc.Có cách nào để buộc Core Animation chạy chuỗi đó không?

Tôi muốn ép Lõi hoạt ảnh để lên lịch chuỗi nền của nó độc đáo với chuỗi chính trong mọi trường hợp. Hoặc cách khác là một luồng riêng biệt sẽ chạy phép tính nặng bên ngoài luồng chính. Tôi đã thử điều đó rồi, nhưng CA vẫn đóng băng cho đến khi xong. Tôi hy vọng bộ lập lịch để chuyển đổi thời gian xử lý nhanh chóng giữa CA và tính toán đó.

CA có thể bị buộc phải tiếp tục làm việc như thế nào? Nếu mọi thứ diễn ra chậm hơn một chút thì tốt thôi. Nhưng điều quan trọng nhất là tất cả mọi thứ tiếp tục đi từ quan điểm của người dùng.

Trả lời

5

Không chạy các phép tính nặng trên chuỗi chính, vì chúng sẽ chặn giao diện người dùng và dẫn đến trải nghiệm người dùng kém. Chạy chúng trong một chủ đề nền.

Điều đó nói rằng, iPhone là một hệ thống lõi đơn, do đó, nếu tính toán là chốt CPU trong một chủ đề, hiệu suất của mỗi chủ đề khác có thể xay đến gần tạm dừng. Nếu bạn có thể, hãy thử chia nhỏ tính toán của bạn thành các phần tử nhỏ hơn và chạy chúng dưới dạng NSOperations trong NSOperationQueue. Nếu bạn đảm bảo rằng các phân đoạn tính toán không quá nhỏ đến mức chi phí của việc tạo NSOperation cho chúng trở nên quá lớn, điều này có thể cung cấp phương tiện điều chỉnh một chút để hoạt ảnh của bạn không bị chậm lại.

Hoạt ảnh chính có xu hướng thực hiện một số phép tính trả trước, trước khi hoạt ảnh có thể chạy, vì vậy, các hoạt ảnh đó có thể bị làm chậm bởi chuỗi tính toán nặng của bạn. Bạn cũng có thể bắt đầu tính toán nặng của mình trong phương thức -animationDidStart: delegate cho CAAnimation của bạn, việc tính toán chỉ khởi động khi hoạt ảnh đang được tiến hành. Tôi tin rằng tiến trình của một hoạt ảnh sử dụng ít tính toán hơn so với khởi đầu của nó, vì vậy nó có thể tốt hơn khả năng cùng tồn tại với tính toán nặng của bạn.

+0

Cảm ơn. NSOperations có khả năng tạo thời gian chờ không? Tính toán của tôi đã được chia nhỏ thành từng mảnh. Mỗi cái được lên lịch với độ trễ là 0,05 giây. Vì vậy, thực sự có một số thời gian rảnh rỗi inbetween. Tuy nhiên, khi CA phải thực hiện precalclations ngay từ đầu, ý tưởng của bạn về việc chờ đợi -animationDidStart là goog. Tôi đã thử nó bằng cách trì hoãn cuộc gọi để bắt đầu với khối tính toán đầu tiên trong 1 giây. CA bắt đầu hoạt hình, sau đó các calclations nặng đi vào vị trí, và CA đóng băng. Nó không giúp được gì. Tôi đang chạy các tính toán trong một chủ đề mới. –

+0

Vấn đề là sau khi tính toán từng khối dữ liệu, có một cập nhật trong giao diện người dùng đang diễn ra. Những cập nhật này nhanh và mượt mà như mong đợi. Nó sẽ là hoàn hảo khi có một cách để sắp xếp tất cả điều này theo cách mà CA chia sẻ thời gian CPU với điều này ... sẽ có một cái nhìn tại những thứ NSOperationQueue, mặc dù họ không có vẻ như họ sẽ cung cấp timeouts như bị trì hoãn thực hiệnCác cuộc gọi gọi đến (?) –

+0

NSOperationQueue tạo chủ đề cho NSOperations của bạn, nếu cần.Đó là thông minh hợp lý về quản lý những nhiệm vụ được thực hiện khi, nhưng tôi không biết nếu nó có cùng một loại nhận thức cấp hệ thống trên iPhone mà nó làm trên Snow Leopard (nơi nó được phủ lên trên đầu của GCD). Nó cũng hỗ trợ các phụ thuộc giữa các tác vụ, mà bạn có thể sử dụng để lợi thế của bạn ở đây. –

-1

Tôi không chắc chắn, nhưng bạn có thể thử gọi [NSThread setThreadPriority:1.0] nếu bạn chạy CA của mình trong một chuỗi khác.

+0

không vấn đề gì nếu tôi gọi CA trong chủ đề khác? theo như tôi biết, CA duy trì quy trình và chuỗi của riêng nó cho loại công cụ này (hoặc ít nhất là chuỗi riêng, với cài đặt ưu tiên rất thấp) –

7

Bạn có thể sử dụng [CATransaction flush] để tuôn ra hình ảnh động cốt lõi nếu bạn không để cho các runloop tham dự khoá học của nó

+0

Mặc dù điều đó dường như chỉ hoạt động trên iOS 4.0 trở lên. Trước đó nó không buộc vẽ lại đúng cách, nhưng cũng không gây ra vấn đề gì. – monkeydom

+0

Tôi biết điều này là cũ, nhưng liệu bạn có thể giải thích cách thức '[Truyền dịch chuyển]' giúp với vấn đề luồng không? – Warpling

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