2011-02-04 38 views
7

Tôi đã làm việc trên một trò chơi Android trong 6 tháng qua hoặc lâu hơn và đã đăng lên đây nhiều lần về các vấn đề tụt hậu khác nhau mà tôi không thể loại bỏ được.Có thể làm cho trò chơi Android không bị gián đoạn không? Tôi đang phát điên ở đây

Tôi đã kết thúc lấy ví dụ LunarLander và bỏ nó xuống thành phần cốt lõi của nó để xem tôi có thể làm được gì không. Tất cả nó thực sự là thay đổi số lượng canvas được dịch từng khung hình, và sau đó vẽ một nền vào khung vẽ. NGAY CẢ NÀY, đơn giản như bạn có thể nhận được cho một ứng dụng surfaceView - stutters ...

Trò chơi của tôi là một trò chơi di chuyển liên tục lên màn hình (nghĩ về trò chơi bay), nhưng cách hiện tại làm các kết quả nền trong nói lắp liên tục mỗi giây hoặc lâu hơn cho khoảng 50-100ms. Đây không phải là trò chơi phá vỡ, nhưng nó là rất mất tập trung và làm cho trò chơi có vẻ như thể nó được lập trình bởi một moron hoàn chỉnh (mặc dù tôi bắt đầu nghi ngờ điều này có thể là trường hợp).

Không, nó không phải là bộ thu gom rác, không có đối tượng mới nào được tạo ra trong suốt vòng chạy của trò chơi và GC hầu như không bao giờ chạy trong khi trò chơi của tôi đang chạy.

Tôi đang thực sự xé tóc ra với sự thất vọng. Tôi đã dành hơn 40 giờ chỉ cố gắng để thoát khỏi sự chậm trễ trên ví dụ ứng dụng đơn giản này trong tuần qua một mình và nó là lái xe cho tôi điên. Làm thế nào một ứng dụng đơn giản như một ứng dụng tôi đã liên kết có thể có vấn đề về độ trễ? Bạn sẽ không nghĩ rằng nền cuộn có thể đơn giản hơn nhiều ...

LƯU Ý: Trình diễn này liên tục nhận được khoảng 60 khung hình/giây trên điện thoại của tôi (Một mốc Motorola). Bỏ ghi chú mã FPS trong ví dụ để xem FPS.

TL; DR: Chương trình cực kỳ đơn giản chỉ là nền cuộn hiển thị nói lắp. Hãy có một cái nhìn ...

liên kết để tải về đơn giản ví dụ nói lắp dựa trên ví dụ LunarLander: http://dl.dropbox.com/u/4972001/LunarLander.rar

+0

Liệu các bản demo JetBoy có nói lắp khi nó chạy trên điện thoại của bạn? http://developer.android.com/resources/samples/JetBoy/index.html – jhouse

+0

Traceview đã cho bạn biết điều gì? Ngoài ra, trong tương lai, xin vui lòng bỏ qua các tiêu đề ngọn lửa-mồi. – CommonsWare

+0

Xin lỗi về ngọn lửa-mồi, tôi đã rất thất vọng khi tôi đã viết ra (như tôi chắc chắn bạn có thể nói). Traveview cho thấy không có gì khác thường. Có khoảng cách bằng nhau giữa tất cả các cuộc gọi draw/updatePhysics. Nó có vẻ là cái gì đó có thể nhìn thấy nhưng không thể đo lường được, điều này gây nhầm lẫn. Ngoài ra, có, JetBoy cũng có vấn đề nói lắp. – Smills

Trả lời

4

Tôi đã tải file RAR với nền di chuyển của bạn (trông giống như một sân cỏ thoáng), và cài đặt nó trên chiếc motorolla Droid của tôi.

Tôi có thể cảm nhận không nói lắp khi cuộn, tôi đã xem nó trong hơn một phút.

Dựa trên mô tả của bạn, tôi đặt cược phần cứng/nền tảng Milestone có một số vấn đề về vẽ/thời gian video lạ.

Có lẽ lời giải thích là điều gì đó dọc theo dòng này: Bằng cách làm mới số 60Hz (chỉ cần chọn một số ở đây, tôi không biết nó thực sự là gì), và tốc độ khung hình của bạn chỉ là một chút - nói 63 hoặc 57 Hz ... là nó không thể tưởng tượng được rằng khoảng một lần một giây thời gian của bạn rút ra, và thời gian của bản cập nhật phần cứng không phù hợp vừa đủ mà nền không có được một vẽ lại một thời gian, và phải đợi đến khung tiếp theo của bạn? Và đôi khi các dòng thời gian lên vừa đủ mà bạn có thể bỏ lỡ thời gian của hai hoặc ba trận hòa liên tiếp (tùy thuộc vào cách xa chu kỳ khung hình của bạn là từ chu kỳ làm mới màn hình thực tế).

CHỈNH SỬA: Thực ra, tôi đã xem nó trong một phút nữa mà tôi đã thấy một cảnh báo ngắn (chỉ có thể hiểu được).

+0

Đây là một trong những lý thuyết của tôi thực sự (tỷ lệ làm mới là một chút tắt FPS), nhưng tôi không có ý tưởng làm thế nào để sửa chữa mà ... Bạn có nghĩ rằng sẽ có cách nào dễ dàng để sửa chữa loại đó của một vấn đề? – Smills

+0

Không phải là tôi biết. Theo kinh nghiệm của tôi với trò chơi mã hóa trên các nền tảng khác trong những ngày của yor (ví dụ: playstation 1, sega saturn, v.v.) tốc độ khung hình được đồng bộ hóa với tốc độ hiển thị bằng cách thực sự nhận được móc ngắt phần cứng với trình điều khiển hiển thị. Không có ý tưởng làm thế nào bạn có thể làm điều đó với nền tảng Android. – jhouse

+0

Hmm, tôi cũng đã thấy nói lắp trên cả điện thoại của tôi và của một người bạn (Nokia N900 chạy Android 2.2). Tôi tự hỏi nếu nó chỉ ảnh hưởng đến một nhóm nhỏ các điện thoại. – Smills

0

Bạn có cho rằng đề xuất của jhouse về thời gian khung tối thiểu không?

Tôi đang sử dụng ý tưởng đó trên dự án hiện tại của mình.Tôi hy vọng phần cứng điện thoại đã có những cải tiến đáng kể trong một hoặc hai năm tới, điều này sẽ khiến trò chơi của bạn không thể chơi được trong tương lai.

Mã của tôi là như thế này:

long frameTime; // calculate time to process this frame 

    while (mSurfaceAvailable) { 
     // ensure minimum frame time can be calculated 
     frameTime = SystemClock.uptimeMillis(); 

     // code to move everything and display a single frame goes here 

     // ensure minimum frame time 
     frameTime = SystemClock.uptimeMillis() - frameTime; 
     if (frameTime < 0) frameTime = MIN_FRAME_TIME;  // cope with wrap-around of uptimeMillis 
     if (frameTime < MIN_FRAME_TIME) { 
      /*DEBUG*/Log.v(this.getClass().getName(), "run: Sleeping for "+(MIN_FRAME_TIME - frameTime)+"ms"); 
      try { 
       sleep(MIN_FRAME_TIME - frameTime); 
      } catch (InterruptedException e) { 
       /*DEBUG*/Log.i(this.getClass().getName(), "run: Thread sleep was interrupted (not a problem)"); 
      } 
     } else { 
      if (frameTime != MIN_FRAME_TIME) { 
       /*DEBUG*/Log.v(this.getClass().getName(), "run: System is too slow, by "+(frameTime - MIN_FRAME_TIME)+"ms per frame"); 
      } 
     } 

tôi đã xử lý từ một diễn đàn ngoại lệ giấc ngủ (có thể là thế này!) Nhưng chưa bao giờ thấy một ngoại lệ ném

+0

Điều này thật thú vị. Tôi đã triển khai mã ở trên của bạn, nếu tôi đặt trò chơi của mình thành 20ms MIN_FRAME_TIME thì độ trễ của nó sẽ chậm hơn đáng kể so với khi tôi đặt nó thành 33ms MIN_FRAME_TIME. Bạn có thể mong đợi điều ngược lại ... EDIT: Nó mượt mà hơn với 16ms MIN_FRAME_TIME.EDIT2: Nó vẫn còn stutters, tuy nhiên. Mặc dù có thể ít hơn trước. – Smills

+0

Ý của bạn là gì? MIN_FRAME_TIME càng lớn thì trò chơi sẽ càng chậm. Tôi không biết cách ghi nhật ký sẽ ảnh hưởng đến mọi thứ như thế nào, hãy thử thay thế tất cả/* DEBUG */bằng // DEBUG * / – FrinkTheBrave

1

Tôi đã có cùng này vấn đề lag trong trò chơi của tôi (và tôi đã làm một cái gì đó tương tự như bạn đã làm với vòng lặp LunarLander và đạt được một kết luận tương tự). Nếu bạn mở logcat, bạn có thể thấy rằng độ trễ xảy ra cùng với GC_FOR_MALLOC (50 ... 100 ms, thời gian trễ của chúng tôi). Tôi nghi ngờ nguồn gốc của vấn đề là bộ thu gom rác. Sau đó, tôi tìm thấy bài đăng này:

http://fanitis.com/2011/02/09/android-game-performance-garbage-collection/

tôi sẽ cố gắng giảm bớt việc sử dụng thu gom rác và xem nếu tôi đạt được một điều kiện hehehe lagless =]

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