2012-03-08 22 views
18

Tôi đang làm việc trên một trò chơi android, và tôi bắt đầu nhận thấy một chút chậm chạp trong quá trình phát triển vì vậy tôi muốn cố gắng sử dụng đa luồng cho vui và học tập.Interpreting Multicore Performance Trace (Eclipse/Android)

Ứng dụng của tôi có 3 chủ đề:

  1. thread UI (nên chủ yếu là nhàn rỗi)
  2. game logic Chủ đề
  3. Graphics Chủ đề

tôi giảm thiểu phần quan trọng giữa các chủ đề 2 và 3 là tốt nhất tôi có thể, với ý tưởng rằng logic trò chơi có thể cập nhật độc lập với chuỗi hiển thị, và sau đó ở cuối của cả hai chủ đề tôi có thể có một cửa sổ ngắn nhất có thể, nơi tôi đẩy tất cả đồ họa cập nhật từ chuỗi logic đến vòng lặp trò chơi. Điều này sẽ cho phép hai luồng hoạt động độc lập trong phần lớn thời gian. Về lý thuyết, âm thanh như một chiến thắng hiệu suất.

Tuy nhiên, khi tôi bắt đầu triển khai, hiệu suất của tôi đã tăng mạnh. Nó tồi tệ hơn nhiều so với trước đây, một vòng lặp của việc cập nhật và kết xuất được lấy như 50 ms (20fps), do đó, nó trông giống như rác. Điều này chỉ là vẽ một số 20 hình tam giác và có thể là 20 điểm ảnh kết cấu, một khối lượng công việc thực sự đơn giản (tôi sợ nghĩ về những gì nó sẽ được khi tôi thực hiện đồ họa thích hợp).

Dù sao tôi đã theo dõi DDMS trong android để cấu hình mọi thứ đang diễn ra sai hoặc có thể được cải thiện.

trace1 http://i.stack.imgur.com/DDUYE.png

Đây là một cái nhìn của khoảng 3 khung hình của trò chơi của tôi. Cho đến nay nó có vẻ là làm những gì tôi mong đợi. Các phần được đánh dấu bằng màu xanh dương là phần bị khóa, trông giống như bên phải (giữ glThread chủ yếu chờ trong khi nó bị khóa). Tuy nhiên một khi tôi mở khóa nó, tôi sẽ thấy cả hai chủ đề làm việc cùng một lúc, và có vẻ như họ đang có, nhưng nếu tôi nhìn kỹ hơn:

trace2 http://i.stack.imgur.com/vukXQ.png

tôi đang làm phát triển của tôi trên một chiếc điện thoại lõi kép, nhưng nếu tôi hiểu dấu vết đúng, nó không giống như nó từng làm bất cứ điều gì song song, và những gì tồi tệ hơn nó dường như được chuyển đổi các chủ đề hoạt động hàng trăm lần mỗi mili giây! (trừ khi tôi giải thích điều này không chính xác). Tất cả sự chuyển đổi ngữ cảnh này dường như sẽ rất tệ cho hiệu suất, vì vậy tôi không chắc tại sao nó lại muốn chuyển đổi qua lại quá nhanh.

Vì vậy, sau khi giải thích hơi dài, tôi đang tự hỏi một vài điều:

  1. là hiểu biết của tôi đúng, rằng hình chữ nhật đầy trong các dấu vết là những chủ đề hoạt động, và các đường màu là chủ đề đang ngủ? Nếu không thì chúng có ý nghĩa gì?
  2. Tại sao tôi không bao giờ thấy chuỗi của mình chạy đồng thời trên điện thoại lõi kép được cho là?
  3. Tại sao chuyển đổi chuỗi hoạt động nhanh như vậy?
  4. Trong DDMS, tôi nhận được cảnh báo "CẢNH BÁO: trình gỡ lỗi đang hoạt động; kết quả dò tìm phương pháp sẽ bị lệch". Đây có phải là điều đáng lo lắng không? Làm thế nào tôi có thể loại bỏ cảnh báo này?(Tôi launced ứng dụng thông qua Run, không thông qua gỡ lỗi nếu nó làm cho một sự khác biệt)
+0

Bạn đã sử dụng phiên bản Android nào cho hồ sơ của mình? Tôi đã nhận thấy hành vi khác nhau trên các phiên bản khác nhau. – rmtheis

+0

... và bạn có đang sử dụng AsyncTask để tạo chủ đề không? – rmtheis

+0

@rmtheis - Android 2.3 và không có chúng không phải là asynctask. Thread là một chuỗi GLSurfaceView, và cái khác là một 'Thread' mới bắt đầu với' Thread.start() '. – Tim

Trả lời

4

Rất thoải mái câu hỏi, hãy để tôi bắt đầu với câu trả lời:

  1. Bạn đã lẫn lộn chủ đề/phương pháp/activeMethod. Mỗi dòng trong traceview là chuỗi (và nếu bạn đặt tên cho chủ đề của mình, bạn sẽ thấy tên của nó ở bên trái, như "GL Thread", "main", v.v.). Các hình chữ nhật (màu) đại diện cho hoạt động các phương thức thi hành bên trong mỗi luồng, trong khi các đường màu thể hiện các phương thức "tạm dừng" bên trong luồng. Bởi "tạm dừng", tôi có nghĩa là "phương pháp vẫn còn thực hiện, nhưng bối cảnh đã được chuyển sang một số chủ đề khác, và khi bối cảnh chuyển sang chủ đề này, phương pháp này sẽ tiếp tục hoạt động. Trong thuật ngữ bạn đã sử dụng trong câu hỏi của bạn, Các dòng là các phương thức của thread đang ngủ, và hình chữ nhật là phương thức thực hiện thread đang hoạt động Bạn có thể tìm thấy more info about DDMS traceview here.
  2. Phân phối chủ đề giữa các lõi là một câu chuyện khác và phụ thuộc rất nhiều vào các cơ chế hệ điều hành Android cơ bản. với SMP (Symmetric Multi-Processing) tùy chọn trên, đó là trường hợp mặc định cho điện thoại đa lõi, tôi đoán :), nhưng tôi không phải là chuyên gia trong những điều đó. ưu tiên, v.v. Thông tin thêm về những điều này bạn có thể find in this answers.
  3. Ngay cả khi bạn chạy ứng dụng ở chế độ không gỡ lỗi, khi bạn kết nối với DDMS và thực hiện những việc như Định dạng phương pháp, bạn sẽ kích hoạt các phần gỡ lỗi của davlik vm. More details about debugging here, section "Implementation".

Hy vọng bạn sẽ tìm thấy câu trả lời này hữu ích.

1

Cảm ơn câu hỏi. Câu trả lời đầy đủ của người trong cuộc cũng sẽ hữu ích cho tôi. Tôi sẽ nói những gì tôi biết.

  • Một số (tất cả?) Điện thoại có tùy chọn bật/tắt lõi thứ hai. Bạn đã kiểm tra xem máy của bạn đã được bật chưa? Trong ứng dụng của riêng tôi, tôi nhận thấy rằng chỉ đơn thuần là đi từ một chủ đề đến hai (trên một lõi) mà không có thay đổi trong tổng số công việc được thực hiện gây ra một yếu tố 1.5 chậm lại, do đó, rõ ràng luồng chính nó có một chi phí.

  • Đó là trong những tin tức rằng Intel đang kêu gọi Google ra tình hình thực hiện kém của đa lõi luồng:

    http://www.pcworld.com/article/257307/dual_core_processors_wasted_on_android_intel_claims.html

    Kết quả của bạn xác nhận này.

  • Một điều khác cần ghi nhớ là đa lõi không phải là đa bộ xử lý. Bạn đang chia sẻ băng thông bộ nhớ cache và bộ nhớ giữa các lõi. Người ta có thể gian hàng trong khi chờ người khác kết thúc bằng một tài nguyên được chia sẻ, đặc biệt để viết trên các dòng bộ nhớ cache dùng chung. Tuy nhiên, hiệu ứng này không nên tính đến luồng đơn bạn đang xem.

+0

Re: Bullet 1: Tôi không thể tìm thấy bất kỳ tùy chọn để kích hoạt/vô hiệu hóa lõi thứ hai dưới Gingerbread, và tôi nghi ngờ rằng bất cứ ai sẽ gửi một điện thoại lõi kép với lõi thứ hai bị vô hiệu hóa theo mặc định. – Tim

+0

Re # 3 và # 4, 'Triển khai kém' là một điều, nhưng 'triển khai bằng không' là một thứ khác. Không có một femto giây nào trong toàn bộ traceview, trong đó hai luồng cùng lúc hoạt động. Tôi cũng tin rằng những tuyên bố của Intel có thể liên quan nhiều hơn đến việc Intel đang cố gắng tiếp thị các bộ xử lý lõi đơn của mình hơn bất cứ thứ gì khác. Tôi tự hỏi nếu traceview chỉ không hoạt động đúng trên điện thoại đa lõi? Dù sao, cảm ơn phản hồi của bạn. – Tim

+1

Có thể "triển khai kém" có nghĩa là có những điều kiện khá hạn chế mà theo đó lõi thứ hai không được sử dụng. (OpenGL trình điều khiển cuộc gọi? JNI? Đây là những dự đoán hoang dã.) Một triển khai kém possibile sẽ được gán mối quan hệ cốt lõi cho mỗi quá trình chứ không phải là cho mỗi chủ đề. (Tôi đoán ứng dụng của bạn đang chạy trong một quy trình.) – Gene