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?
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
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 ... –