VSync / 30FPS thực trên Android


8

Tôi đang làm việc trên một trò chơi không thể chạy ở tốc độ tối đa trên một số thiết bị. Trên Tegra2, với nhiều tối ưu hóa, hiệu suất đạt gần 40 khung hình / giây. Tốc độ khung hình ổn định nhưng hình ảnh động không đủ mượt, vì vậy tôi cần một vsync.
Với 2.3 SDK Android, chúng ta có thể sử dụng thư viện EGL nguyên bản. Vì vậy, tôi cố gắng sử dụng eglSwapInterval nhưng không thành công. Trong bài viết GDC này , dường như Tegra2 có thể làm điều đó.

Ps: Thread.s ngủ () để buộc FPS không đổi không phải là giải pháp chấp nhận được


Tôi chưa phát triển bất cứ điều gì cho Android, vì vậy tôi không thể nói chắc chắn liệu điều đó có thể hay không ảnh hưởng đến khoảng thời gian trao đổi của nó, mặc dù điều đó có vẻ đáng ngờ. Vì vậy, nếu việc nói lắp hoạt hình xuất phát từ sự khác biệt lớn về thời gian logic của nó, có lẽ bạn nên thử tính thời gian trung bình cho một loạt khung hình? Như thế này , có thể sử dụng khoảng thời gian 5-6 khung hình. Đây không phải là câu trả lời cho câu hỏi vsync của bạn, nhưng có lẽ nó sẽ giúp ích cho hoạt hình của bạn mà không đưa ra dấu thời gian kết xuất cố định.
EnoughTea

1
Vì Tegra2 là trình kết xuất ngay lập tức (không phải là ô xếp), tôi có thể kiểm tra xem thời gian đã trôi qua trước eglSwapBuffer là <1/60s chưa. Nếu không, tôi đợi 1ms nhiều hơn 16ms và thực hiện eglSwapBuffer. Điều đó thật kinh khủng !!! Thật kỳ lạ khi họ nói về chức năng này tại Google IO 2011 nếu nó không được thực hiện.
Ellis

Câu trả lời:


2

Theo chủ đề này trên một số điểm chuẩn của opengl es, hầu hết các trình điều khiển của thiết bị chỉ cần bỏ qua eglSwapInterval, nhưng tegra2 nên bật vsync theo mặc định (và eglSwapInterval có thể được sử dụng để tắt nó).

Có lẽ tốc độ vsync trên thiết bị của bạn sao cho việc nói lắp của bạn đến từ đôi khi nhấn, đôi khi thiếu thời gian khung hình? Bạn đã thử nếu vô hiệu hóa vsync sẽ thực sự cải thiện vấn đề?


Tôi đã không cố gắng vô hiệu hóa vsync. Tôi đã thử eglSwapInterval (..., 2) nhưng không thành công. Tôi sẽ cố gắng càng sớm càng tốt.
Ellis

Tham số hoán đổi xác định số lượng khung hình tối thiểu phải đi qua, do đó, có thể bạn đang thấy tình trạng nói lắp như 2,2,3,2,2,3,2,2,2,3 .. giả sử toàn bộ hoạt động, mà dường như không được đảm bảo =)
Jari Komppa

Đây là một nugget nhỏ khác: "khoảng thời gian được âm thầm kẹp vào các giá trị phụ thuộc thực hiện tối thiểu và tối đa trước khi được lưu trữ; các giá trị này được xác định bởi các thuộc tính EGLConfig EGL_MIN_SWAP_INTERVAL và EGL_MAX_SWAP_INTERVAL."
Jari Komppa

eglSwapInterval (, 2) không thay đổi tốc độ khung hình 42fps của tôi và EGL_MIN_SWAP_INTERVAL là 0 và MAX 10.
Ellis

Chỉ có điều khác tôi có thể nghĩ đến để thử là trải qua các giá trị 0 đến 10 và xem liệu có bất kỳ thay đổi nào không. Nếu không, tốt, chức năng bị hỏng. (Hoặc tốt, các giá trị 0,1,9 và 10)
Jari Komppa

0

Đã xuất bản một mẫu làm 30FPS bằng API biên đạo múa. https://github.com/googlesamples/android-ndk/tree/master/choreogologists-30fps Điều đó có hiệu quả với bạn không?


1
Mặc dù liên kết của bạn có thể hữu ích (tôi chưa xem qua), nhưng điều này được ưu tiên trên trang web này là các liên kết được tóm tắt trong câu trả lời trong trường hợp liên kết chết và để những người khác biết những gì mong đợi từ nó. Bạn có thể bao gồm một phần hữu ích hoặc mô tả mẫu trong câu trả lời của bạn không?
Jibb thông minh

Và liên kết trên thực tế đã chết :)
Karu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.