2012-04-06 18 views
6

Trong một ứng dụng Windows, tôi có nhiều cửa sổ OpenGL mở cùng một lúc. Lý tưởng nhất là tôi muốn mỗi trong số này để vẽ ở tốc độ 60 khung hình/giây, đồng bộ hóa với màn hình làm mới.Đồng bộ hóa nhiều cửa sổ OpenGL với vsync

Đối với mỗi ngữ cảnh hiển thị, tôi gọi số wglSwapIntervalEXT(1) để bật vsync. Mỗi cửa sổ có chuỗi hiển thị riêng của nó, sẽ vẽ khung và sau đó gọi SwapBuffers để cập nhật.

Nó chỉ ra rằng các cửa sổ đang 'chiến đấu' với nhau: có vẻ như các cuộc gọi SwapBuffers được đồng bộ và chờ cho nhau, mặc dù chúng nằm trong các chủ đề riêng biệt. Tôi đang đo thời gian khung-khung hình của mỗi cửa sổ và với hai cửa sổ, tốc độ này giảm xuống 30 khung hình/giây, với từ 3 đến 20 khung hình/giây, v.v.

Nếu tôi tắt tính năng đồng bộ hóa với wglSwapIntervalEXT(0), chúng vui vẻ làm mới ở 60 fps cho dù tôi mở bao nhiêu cửa sổ. Nhưng với một cửa sổ mở, điều này không phải là gần như trơn tru như với vsync bật.

Có cách nào để thực hiện những gì tôi muốn với OpenGL không?

+0

Nếu bạn nghĩ về sự cố, bạn sẽ nhận ra rằng họ phải đồng bộ hóa với nhau nếu bạn đang đồng bộ hóa tất cả với tỷ lệ làm mới. Không có sự kiện làm mới duy nhất cho mỗi cửa sổ bạn nhìn thấy. Giải pháp duy nhất tôi có thể nghĩ đến (gần như chắc chắn là không khởi động) là sử dụng một cửa sổ và tạo trình quản lý cửa sổ của riêng bạn bên trong nó bằng cách sử dụng khung nhìn. – Robinson

+0

Nếu SwapBuffers chỉ báo hiệu rằng các bộ đệm cần phải được hoán đổi, nó có thể trở lại ngay lập tức (cho đến khi bộ đệm đệm mới được ghi vào, mà sẽ cần phải chặn). Một thread riêng biệt thuộc sở hữu của trình điều khiển hiển thị sau đó có thể chờ đợi cho vsync và trao đổi tất cả các bộ đệm được đánh dấu là cần phải hoán đổi vào đúng thời điểm. Tuy nhiên, rõ ràng đây không phải là cách mọi thứ hoạt động ... –

Trả lời

0

Bạn có thể lấy thiết bị đầu ra và sử dụng chức năng WaitForVBlank trong một vòng lặp từ một chuỗi. Sau đó, có thể đăng tin nhắn hoặc sự kiện tín hiệu cho mỗi cửa sổ mà bạn quan tâm.

+0

Vấn đề là tôi không kiểm soát trực tiếp các cửa sổ OpenGL khác. –

1

Trong Linux, rất nhiều hành vi lạ xảy ra với ứng dụng của tôi vì gọi các chức năng video từ nhiều chủ đề khác nhau.

Tôi đã giải quyết các vấn đề này bằng cách chỉ sử dụng một chuỗi để hiển thị từ khi bắt đầu ứng dụng, tạo cửa sổ, tạo glcontext, v.v ... và sử dụng các ẩn dụ và hàng đợi để chia sẻ dữ liệu giữa chuỗi này và các chủ đề khác.