2009-07-14 27 views
6

Tôi đang viết một ứng dụng sử dụng ngón tay của bạn để vẽ các biểu đồ đơn giản. Tôi có nó làm việc cho hầu hết các phần nhưng bây giờ tôi đang cố gắng tối ưu hóa hiệu suất của nó. Khi người dùng vuốt nhanh ngón tay của họ, tôi không thể chụp đủ các sự kiện chạm để vẽ một đường trơn tru.Tối ưu hóa ứng dụng vẽ (có chạm ngón tay) cho iPhone SDK

Dưới đây là cách tiếp cận hiện tại của tôi:

1) Tôi subclassed một UIView và thêm một poroperty đến một CGLayer (được tạo ra một cách lười biếng và có kích thước tương tự như UIView của tôi). 2) Lớp con UIView của tôi phản hồi các sự kiện chạm bằng cách lưu trữ các điểm tiếp xúc hiện tại và cuối cùng trong các biến mẫu. 3) Chế độ xem của tôiNếu màn hình được gọi và trong chế độ hòa âm, hãy thực hiện theo các bước sau: - vẽ một đường từ vị trí cảm ứng trước đó đến vị trí cảm ứng hiện tại tới CGLayer - vẽ toàn bộ CGLayer vào ngữ cảnh của tôi trong một lần

Vấn đề chính là khi người dùng lướt nhanh, tôi nhận được ít sự kiện liên lạc, vì vậy các đường tôi vẽ giữa các lần chạm dài và làm cho đường đi trông lởm chởm không mượt mà.

Câu hỏi của tôi:

1) Liệu drawRect (trên phân lớp UIView của tôi) và xử lý sự kiện liên lạc của tôi trên phân lớp UIView của tôi được gọi trong cùng một thread? I E. Tôi có thể có chủ đề thực hiện (một trong một sự kiện liên lạc và thứ hai trong rect vẽ của tôi)?

Nếu các sự kiện liên lạc không thực hiện được xếp hàng đợi trong khi drawRect đang được gọi? Và làm cách nào để cải thiện hiệu suất - chỉ cần cải thiện hiệu suất của drawRect?

Nếu có - làm thế nào tôi có thể nhận được nhiều sự kiện chạm để xảy ra để tôi có thể vẽ một con đường mượt mà hơn?

Cảm ơn.

Trả lời

4

Một cách tiếp cận khác là nội suy đường cong giữa các điểm mẫu. Khi quá trình kéo ngón tay bắt đầu, hãy bắt đầu thu thập các điểm lấy mẫu. Khi số điểm tăng, vẽ lại đường. Với hai điểm, vẽ một đường thẳng, với ba hoặc nhiều hơn vẽ một đường cong. Bạn có thể bắt đầu lại quá trình khi hai điểm được lấy mẫu nằm trong khoảng cách xác định. Điều này sẽ cho phép bạn vẽ hai vòng cung (giống như một 'm') trong một chuyển động - bạn tự nhiên dừng ở giữa khi bạn thay đổi hướng, có thể đủ dài cho hai hoặc nhiều mẫu.

3

drawRect được gọi trên chuỗi chính. Nhưng bạn không phải làm điều này. Bạn có thể sử dụng chuỗi chính để thu thập sự kiện giao diện người dùng và thực hiện thao tác vẽ trên chuỗi nền. Chủ đề nền được thông báo bất cứ khi nào có chạm mới và bắt đầu thao tác vẽ trong CGBitmapContext của riêng nó. Sau đó, bạn tạo một CGImage và đưa nó cho View: view.layer.contents = drawingImage.

Nếu bạn cần hiệu suất nhiều hơn, hãy cân nhắc việc vẽ bằng cách sử dụng OpenGL.

+0

Vì vậy, cả trình xử lý sự kiện drawRect và cảm ứng của tôi đều được gọi trên chuỗi chính? Bạn có gợi ý rằng mỗi khi sự kiện chạm xảy ra, tôi nên bắt đầu một chuỗi mới và vẽ bản vẽ của tôi trong chuỗi đó? – aloo

+1

Tôi đang đề xuất có ** một ** chuỗi công nhân. Nó bắt đầu vẽ bất cứ khi nào nó được hoàn thành với cái cũ và ít nhất một chạm mới có sẵn. –

1

Aloo, bạn đã tìm được giải pháp cho mình vì tôi cũng gặp vấn đề tương tự. Tôi cũng tìm thấy hướng dẫn agreat http://www.ipodtouchfans.com/forums/showthread.php?t=132024 nhưng nó cũng có cùng một vấn đề mà nếu bạn vẽ nhanh, nói một vòng tròn, bản vẽ không phải là rất trơn tru. Nó gần giống như iPhone chỉ không thể theo kịp, tiếc là điều này đã sử dụng các công cụ đồ họa cốt lõi.

0

Tôi đã thử thêm

CGContextSetLineJoin(UIGraphicsGetCurrentContext(), kCGLineJoinRound); 

nhưng điều này đã không làm gì. Có vẻ như chúng tôi sẽ phải tìm ra các đường cong bezier

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