2011-01-07 42 views
5

Tôi đã làm việc trên một trò chơi cho Android và gỡ lỗi nó trên N1 của tôi. Hiệu suất đã được vá lúc đầu. Sau đó tôi đã làm việc để dọn dẹp tất cả các phân bổ để ngăn chặn việc thu gom rác thải. Điều này cải thiện rất nhiều, nhưng tôi vẫn thấy một số bộ sưu tập rác xảy ra gây ra tạm dừng rất ngắn trong hoạt hình.Phát triển trò chơi Android và Bộ sưu tập rác

Sau khi kéo tóc ra một lúc, sau đó tôi nhận thấy các ID quá trình đang thực hiện thu thập rác (GC_FOR_MALLOC) không phải là id quá trình của tôi. Id quá trình thuộc về "Hệ thống Android" và android.process.acore (được xác định bằng cách sử dụng ứng dụng "Thông tin hệ thống Android" từ thị trường). Quá trình acore được gắn với một widget desktop gọi là đồng hồ kỹ thuật số. Tôi đã gỡ cài đặt tiện ích và gần như đã thực hiện nó thông qua toàn bộ trò chơi mà không bị tạm dừng. Có một tạm dừng rất ngắn cho GC cho "Hệ thống Android".

Xin lỗi vì lời giải thích dài, nhưng bây giờ cho câu hỏi của tôi:

  1. Làm thế nào mà các game khác không thỉnh thoảng có tạm dừng do quá trình hệ thống của GC (một cái gì đó ngoài tầm kiểm soát của nhà phát triển)?
  2. Dọc theo dòng câu hỏi đầu tiên, làm cách nào để xử lý một ứng dụng khác khiến GC làm chậm quá trình của tôi và gây trục trặc trong trò chơi của tôi?

Tôi chỉ cảm thấy có điều gì đó mà tôi đang bỏ lỡ vì các trò chơi khác không gặp vấn đề này.

Cảm ơn

+1

Nếu ứng dụng của bạn nhạy cảm với bộ thu gom rác, bạn đang làm sai. – Falmarri

+0

Bạn có thể có may mắn hơn tại http://gamedev.stackexchange.com/ cho các câu hỏi cụ thể về trò chơi dành cho nhà phát triển. Tôi không chắc có một câu trả lời dễ dàng cho điều này. Bạn không thể ngăn chặn gc, chỉ cần giảm thiểu chúng. 2.3 bao gồm gc đồng thời, nhưng điều đó không giúp bạn nhiều nếu bạn muốn nhắm mục tiêu các nền tảng trước đó. –

Trả lời

3

Bạn có thể giảm tốc độ khung hình của trò chơi không? Có lẽ nó đang sử dụng 100% của CPU để bất cứ điều gì khác mà tiêu thụ CPU sẽ làm cho nó tụt hậu. Các thiết bị này không nhanh như máy tính trung bình của bạn. Bạn cũng có thể xem xét việc giảm CPU cần thiết để tạo ra mỗi khung hình để giữ tốc độ khung hình đủ cao để được mịn màng.

+0

Bạn đóng đinh chính xác. Trò chơi của tôi đã sử dụng CPU 100%. Điều lớn nhất tôi đã làm để sửa chữa đó là thay đổi cách nền được rút ra để không xử lý độ trong suốt (chức năng dưới đây). CPU của tôi ngay lập tức giảm xuống từ đó. Một khi CPU không được cố định, tôi chưa bao giờ nhận thấy việc thu gom rác. thx – Steve0212

+0

Một chút muộn cho bữa tiệc, nhưng tôi có một vấn đề tương tự. Làm thế nào để bạn thực sự sử dụng ít hơn 100% CPU, khác hơn là chỉ đơn giản là ngủ ở cuối mỗi khung? Và bạn đang sử dụng công cụ nào để đo lường việc sử dụng CPU? Ngoài ra, không phải là minh bạch/không minh bạch thực sự là một người sử dụng GPU, không phải CPU? Cảm ơn! – Tenfour04

+0

@ TenFour04: Hầu như theo định nghĩa, bạn sử dụng ít CPU hơn bằng cách đảm bảo thực hiện càng ít công việc càng tốt. Đôi khi điều đó có nghĩa là sử dụng định dạng hình ảnh khác (alpha đắt tiền, đặc biệt nếu bạn có GPU crappy hoặc không có gì cả), đôi khi nó có nghĩa là lưu trữ một tham chiếu đến nội dung để bạn không phải tra cứu mọi lúc ... nó có nghĩa là chờ đợi cho đến khi bạn biết bạn phải làm một cái gì đó trước khi bạn làm điều đó. Các chi tiết cụ thể khác nhau, nhưng tất cả đều bị "không lãng phí các chu kỳ CPU". Oh, và ngủ là một điều tốt - nếu làm tốt, nó giữ tốc độ khung hình tương đối ổn định. – cHao

0
private static Bitmap GetNonTransparentBitmap(int Id) { 
    // no transparency 
    Drawable tmp = myContext.getResources().getDrawable(Id); 

    Bitmap retval = Bitmap.createBitmap(tmp.getMinimumWidth(), tmp.getMinimumHeight(), Bitmap.Config.RGB_565); 
    Canvas canvas = new Canvas(retval); 
    tmp.setBounds(0, 0, tmp.getMinimumWidth(), tmp.getMinimumHeight()); 
    tmp.draw(canvas); 
    return retval; 
} 
Các vấn đề liên quan