D3D / DXGI xử lý chuyển đổi toàn màn hình


9

Tôi có một ứng dụng D3D11 và tôi muốn thêm suport toàn màn hình phù hợp. Bây giờ tôi có thể để DXGI chuyển cửa sổ của mình sang chế độ toàn màn hình cho tôi và tôi có ấn tượng rằng DXGI sẽ lo tất cả mọi thứ cần thiết để làm cho chuỗi trao đổi lật về phía trước và backbuffer thay vì làm mờ chúng.

Tuy nhiên, để DXGI thực hiện swich dường như không đáng tin cậy với thiết lập đa màn hình - màn hình thứ cấp hoàn toàn màu đen sau khi chuyển đổi rất nhiều thời gian, không có lý do hoặc mô hình rõ ràng nào với nó.

Có thể mất vài lần chuyển đổi qua lại trước khi tôi nhận được cửa sổ toàn màn hình phần còn lại của màn hình nền được hiển thị trên các màn hình khác.

Rõ ràng tôi không đơn độc với điều này, Battlefield 3 và WoW dường như có vấn đề tương tự đối với nhiều người.

Bây giờ, câu hỏi thực tế: Tôi đoán vì ngay cả những công ty phát triển trò chơi AAA đó cũng không thể làm việc này, hy vọng lớn nhất của tôi là tự mình thực hiện việc chuyển sang chế độ toàn màn hình.

Có bất cứ điều gì tôi có thể làm để nâng cửa sổ / trao đổi của mình thành chế độ toàn màn hình phù hợp, đệm không?


Tại thời điểm viết bài này, phiên bản hiện tại của World of Warcraft không còn các vấn đề về cấu hình / rò rỉ chế độ hiển thị mà bạn đã đề cập. Chúng chắc chắn có vấn đề nhưng đã được sửa vào ngày 7.3.2
Gazer

Câu trả lời:


3

Theo hiểu biết của tôi, điều duy nhất hoạt động là:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

khi bắt đầu ứng dụng của bạn và:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

trước khi bỏ thuốc Đối với việc chuyển đổi, tiến hành như bình thường. Tôi đã thử InvalidateRect(NULL, NULL, true)ngay sau khi chuyển sang toàn màn hình nhưng không có kết quả. Hi vọng điêu nay co ich.


Sau khi thử mọi thứ, có vẻ như bạn đã đúng. Chỉ vô hiệu hóa thành phần đáng tin cậy ngăn chặn điều này xảy ra. Không phải là câu trả lời tôi đã hy vọng, nhưng tốt hơn là tôi không nghĩ gì cả.

Lưu ý rằng Windows 8.1 trở lên bỏ qua cài đặt này. Bạn không thể tắt DWM.
Chuck Walbourn

1

Bạn thực sự không phải là người duy nhất phải đối mặt với vấn đề này . Điều đầu tiên cần kiểm tra: đảm bảo bạn đang sử dụng trình điều khiển mới nhất / beta / đỉnh cao cho thẻ video bạn đang sử dụng.

Bây giờ, tôi muốn nói rằng chỉ có một cơ hội nhỏ để bạn có thể làm việc này tốt hơn so với triển khai DXGI tự động. Loại vấn đề này phụ thuộc nhiều vào nhà cung cấp bộ điều hợp, phiên bản trình điều khiển và cấu hình màn hình. Vì vậy, bằng cách sửa nó trên một máy, bạn có thể sẽ phá vỡ nó nhiều hơn.

Tôi khuyên bạn không nên quay lại thời kỳ đen tối của DirectX 9 khi bạn phải làm mọi thứ bằng tay. Một ý tưởng tốt hơn sẽ là thử sửa chữa chuyển đổi tự động. Một số con đường để làm theo:

  • Đọc tài liệu (thưa thớt) cẩn thận.

  • Nếu bạn chưa làm điều đó, hãy thử phản hồi WM_SIZEsự kiện mà bạn nhận được khi chuyển từ / sang toàn màn hình, như được mô tả ở đây . Nếu bạn làm như vậy, hãy chắc chắn rằng bạn đang phát hành đúng tất cả các tham chiếu đến bộ đệm phía sau trước khi gọi ResizeBuffers, như được mô tả ở đó . Không làm như vậy có thể gây ra loại vấn đề bán kỳ lạ này.

  • Cố gắng bắt đầu trực tiếp trên toàn màn hình và để tạo chuỗi trao đổi của bạn với một trong các chế độ hiển thị được liệt kê . Nếu điều này hoạt động mọi lúc, điều này có thể có nghĩa là bạn không sử dụng một trong các chế độ hiển thị được liệt kê khi xử lý WM_SIZE(hoặc không hoàn toàn, những thứ như tốc độ làm mới có thể quan trọng).

  • Hãy thử mucking xung quanh với hiệu ứng hoán đổi và số lượng bộ đệm của mô tả chuỗi trao đổi của bạn . Bạn có thể nên sử dụng DXGI_SWAP_EFFECT_SEQUENTIALvà a BufferCount> = 2. Có thể trình điều khiển của bạn có hỗ trợ kém cho các tùy chọn "kỳ lạ" hơn.


Thay đổi kích thước bộ đệm hoạt động tốt. Tôi cũng đã thử tất cả các hiệu ứng hoán đổi, chúng dường như không tạo ra sự khác biệt và tôi luôn sử dụng 2 bộ đệm. Tôi sẽ thử điều toàn màn hình, (mặc dù tôi không biết ý của bạn là gì khi "sử dụng một trong các chế độ hiển thị được liệt kê" - khi trả lời WM_SIZE tất cả những gì tôi làm là ResizeBuffers, không có nơi nào để chuyển chế độ hiển thị làm đối số ) nhưng tôi tự cài đặt windows 8 và đoán xem, tôi không thể sao chép vấn đề ngay bây giờ ..

Đã quay trở lại với windows7 và đã thử tạo hoán đổi ở chế độ toàn màn hình ngay từ đầu, nhưng vấn đề vẫn tồn tại.
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.