OpenGL: Khung nhảy một phần qua lại [đóng]


8

Tôi đang làm việc trên một dự án với SDL và OpenGL. Trò chơi hoạt động rất tốt trên Windows, Linux, OS X và iOS. Tuy nhiên, phiên bản Android đang hiển thị một vấn đề trên điện thoại của tôi nói riêng. Tôi đã thử nghiệm một thiết bị khác và nó cũng hoạt động rất tốt.

Vấn đề tôi gặp phải là một trục trặc hình ảnh. Nó xảy ra theo cụm: ví dụ: 90 khung hình ổn và sau đó 40 khung hình trục trặc. Bản thân trục trặc là loại khó diễn tả nhưng tôi sẽ thử. Màn hình đang được cập nhật một phần chính xác (từ đỉnh điện thoại của tôi xuống khoảng một nửa) và nhấp nháy một phần. Hiệu ứng nhấp nháy là một số loại nhảy qua lại. Tôi nghĩ rằng nó có liên quan đến bộ đệm đôi. Tôi nghĩ rằng bởi vì những gì tôi có thể nhìn thấy trên màn hình đang nhảy qua nhảy lại từng khung hình. Nó giống như một nửa màn hình là một khung hình trong thời gian và khung hình tiếp theo trễ 2 khung hình. Khá giống như một đám rước của Echternach, tôi đoán bạn có thể nói. Nếu tôi vẽ nó trong một biểu đồ nơi thời gian trôi qua khi di chuyển xuống biểu đồ, tôi nghĩ rằng tôi

          left half | right half  (phone is in landscape)
         ------------------------
time  1 |      1           1
time  2 |      2           2
time  3 |      3           1
time  4 |      4           4
time  5 |      5           3
time  6 |      6           6
time  7 |      7           5
time  8 |      8           8
time  9 |      9           7

Vì vậy, nửa bên phải là một khung thời gian và khung tiếp theo, nó hiển thị khung trước đó. Điều này hỗ trợ lý thuyết của tôi rằng có một vấn đề với bộ đệm đôi. Có vẻ như bằng cách nào đó, chúng ta không thể cập nhật hoàn toàn backbuffer trước khi nó được đưa lên màn hình, hoặc một cái gì đó.

Ngoài ra, sự phân chia giữa tốt và trục trặc trên màn hình khác nhau từ khung hình này sang khung hình khác, điều mà tôi nghĩ chứng minh đó là vấn đề đồng bộ hóa và phụ thuộc nhiều vào thời gian của những gì đang diễn ra. Thêm glFinish();trước khi SDL_GL_SwapWindow();cuộc gọi không giúp đỡ.

Thông tin phiên bản: SDL báo cáo vsync sẽ được bật. Tuy nhiên, tôi tin rằng điều này không rách. Điện thoại của tôi là Samsung Galaxy S3 mini và đang chạy Android 5.1.1 (CM12) và GPU (Mali-400) hỗ trợ OpenGL ES 2.0. Các trò chơi khác chạy ổn trên điện thoại của tôi.


Mẫu điện thoại là gì?
Concept3d

Samsung Galaxy s3 nhỏ. Chạy CyanogenMod 12.
Martijn Courteaux

Tôi phát hiện ra nó ở mọi nơi trong điện thoại của tôi, nhưng tinh tế hơn. Ngay cả trong giao diện người dùng cũng cuộn qua các menu.
Martijn Courteaux

2
Âm thanh này giống như một lỗi trong điện thoại của bạn. Tôi đoán là một bản cập nhật firmware là cách có khả năng nhất để giải quyết nó.
rolobo

@rolobo: Vâng, thực sự. Tuy nhiên tôi rất hài lòng với mọi thứ khác và điện thoại của tôi chỉ là một thiết bị thử nghiệm cho dự án này và không phải là một phần của quá trình phát triển chính của tôi.
Martijn Courteaux

Câu trả lời:


0

Một phần của readme nói về nó:

Một lưu ý liên quan đến việc sử dụng kỹ thuật kết xuất "hình chữ nhật bẩn"

[...] khi bạn chỉ cập nhật một phần màn hình trên mỗi khung hình, bạn có thể nhận thấy nhiều trục trặc hình ảnh trên Android, không có trên các nền tảng khác. Điều này là do SDL sử dụng EGL làm hệ thống hỗ trợ để xử lý các bối cảnh OpenGL ES / ES2, đặc biệt là việc sử dụng chức năng eglSwapBuffers. Như đã nêu trong tài liệu cho chức năng "Nội dung của bộ đệm phụ trợ luôn không được xác định sau khi gọi eglSwapBuffers".

Việc đặt thuộc tính EGL_SWAP_BEHAVIOR của bề mặt thành EGL_BUFFER_PRESERVED là không thể đối với SDL vì nó yêu cầu EGL 1.4, chỉ có sẵn ở cấp API, do đó cách khắc phục duy nhất có sẵn trên nền tảng này là vẽ lại toàn bộ màn hình mỗi khung hình.


Vui lòng bao gồm một bản tóm tắt các thông tin liên quan từ liên kết đó và một lời giải thích về cách thông tin trả lời câu hỏi.
tyjkenn

... câu hỏi ban đầu không nói gì về việc thực hiện kết xuất "hình chữ nhật bẩn"?
Trevor Powell
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.