D3D / DXGI จัดการการเปลี่ยนหน้าจอเต็ม


9

ฉันมีแอปพลิเคชั่น D3D11 และฉันต้องการเพิ่ม suport แบบเต็มหน้าจอที่เหมาะสม ตอนนี้ฉันสามารถให้ DXGI สลับหน้าต่างของฉันเป็นแบบเต็มหน้าจอสำหรับฉันและฉันรู้สึกว่า DXGI จะดูแลทุกอย่างที่จำเป็นเพื่อให้การสลับโซ่ด้านหน้าและด้านหลังแทนการ blitting

อย่างไรก็ตามการทำให้ DXGI ทำงานได้อย่างรวดเร็วดูเหมือนว่าไม่น่าเชื่อถือด้วยการติดตั้งจอภาพหลายจอ - หน้าจอที่สองยังคงเป็นสีดำทั้งหมดหลังจากการสลับเวลาเป็นอย่างมากโดยไม่มีเหตุผลหรือรูปแบบที่ชัดเจน

อาจต้องใช้การสลับไปมาสองสามครั้งก่อนที่ฉันจะได้รับหน้าต่างเต็มหน้าจอและส่วนที่เหลือของเดสก์ท็อปที่แสดงบนหน้าจออื่น

เห็นได้ชัดว่าฉันไม่ได้อยู่คนเดียวกับเรื่องนี้ Battlefield 3 และ WoW ดูเหมือนจะมีปัญหาที่คล้ายกันสำหรับผู้คนจำนวนมาก

ตอนนี้คำถามที่เกิดขึ้นจริง: ฉันเดาว่าแม้กระทั่ง บริษัท ผู้พัฒนาเกม AAA เหล่านั้นก็ไม่สามารถทำงานได้ความหวังที่ยิ่งใหญ่ที่สุดของฉันคือการเปลี่ยนไปใช้งานแบบเต็มหน้าจอด้วยตัวเอง

มีสิ่งใดบ้างที่ฉันสามารถทำได้เพื่อยกระดับหน้าต่าง / swapchain ของฉันให้อยู่ในโหมดเต็มหน้าจอแบบเต็มบัฟเฟอร์หรือไม่


ในขณะที่เขียนนี้ World of Warcraft รุ่นปัจจุบันไม่มีปัญหาเกี่ยวกับการกำหนดค่าโหมดการแสดงผล / หน่วยความจำรั่วไหลที่คุณกล่าวถึง พวกเขามีปัญหาอย่างแน่นอน แต่ได้รับการแก้ไขตั้งแต่ 7.3.2
Gazer

คำตอบ:


3

สำหรับความรู้ของฉันสิ่งเดียวที่ใช้ได้คือ:

 DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);

เมื่อเริ่มต้นแอปพลิเคชันของคุณและ:

DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);

ก่อนที่จะเลิก สำหรับช่วงการเปลี่ยนภาพให้ดำเนินการตามปกติ ฉันลองInvalidateRect(NULL, NULL, true)หลังจากเปลี่ยนไปใช้แบบเต็มหน้าจอแล้วก็ไม่มีประโยชน์ หวังว่านี่จะช่วยได้


หลังจากลองทุกอย่างดูเหมือนว่าคุณถูกต้อง การปิดใช้งานการจัดองค์ประกอบเท่านั้นที่เชื่อถือได้ป้องกันสิ่งนี้เกิดขึ้น ไม่ใช่คำตอบที่ฉันหวังไว้ แต่ดีกว่าไม่มีอะไรคิด

โปรดทราบว่า Windows 8.1 และหลังจากนั้นจะข้ามการตั้งค่านี้ คุณไม่สามารถปิดการใช้งาน DWM
Chuck Walbourn

1

คุณไม่ใช่คนเดียวที่ประสบปัญหานี้ สิ่งแรกที่ต้องตรวจสอบ: ตรวจสอบให้แน่ใจว่าคุณใช้ไดรเวอร์ล่าสุด / เบต้า / บนสุดสำหรับการ์ดแสดงผลที่คุณใช้

ตอนนี้ฉันจะบอกว่ามีโอกาสเล็กน้อยที่คุณจะสามารถทำงานได้ดีกว่าการใช้ DXGI อัตโนมัติ ปัญหาประเภทนี้ขึ้นอยู่กับผู้จำหน่ายอะแดปเตอร์รุ่นไดรเวอร์และการกำหนดค่ามอนิเตอร์เป็นอย่างมาก ดังนั้นโดยการแก้ไขบนเครื่องหนึ่งคุณอาจจะทำลายมันได้มากกว่านี้

ฉันแนะนำไม่ให้กลับไปสู่ยุคมืดของ DirectX 9 ที่คุณต้องทำทุกอย่างด้วยมือ ความคิดที่ดีกว่าคือพยายามแก้ไขการสลับอัตโนมัติ บางเส้นทางที่จะปฏิบัติตาม:

  • อ่าน (เบาบาง) เอกสารอย่างรอบคอบ

  • ถ้าคุณไม่ได้ทำมันแล้วพยายามที่จะตอบสนองต่อWM_SIZEเหตุการณ์ที่คุณได้รับเมื่อเปลี่ยนจาก / ไปแบบเต็มหน้าจอตามที่อธิบายไว้ที่นี่ ถ้าคุณทำเช่นนั้นให้แน่ใจว่าคุณกำลังถูกปล่อยอ้างอิงถึงกันชนหลังก่อนที่จะเรียกResizeBuffers, ตามที่อธิบายไว้ที่นั่น การไม่ทำเช่นนั้นอาจทำให้เกิดปัญหากึ่งประหลาดชนิดนี้

  • พยายามที่จะเริ่มต้นโดยตรงในแบบเต็มหน้าจอและเพื่อสร้างห่วงโซ่ของคุณสลับกับหนึ่งในโหมดการแสดงผลแจกแจง หากวิธีนี้ใช้งานได้ตลอดเวลาอาจหมายความว่าคุณไม่ได้ใช้โหมดการแสดงผลแบบระบุเมื่อจัดการWM_SIZE(หรือไม่ทั้งหมดสิ่งต่าง ๆ เช่นอัตราการรีเฟรชอาจมีความสำคัญ)

  • ลองสิรอบกับผลการแลกเปลี่ยนและนับกันชนของคุณคำอธิบายห่วงโซ่แลกเปลี่ยน คุณน่าจะใช้งานDXGI_SWAP_EFFECT_SEQUENTIALและBufferCount> = 2 บางทีไดรเวอร์ของคุณอาจให้การสนับสนุนตัวเลือก "แปลกใหม่" มากกว่านี้


การปรับขนาดบัฟเฟอร์ทำงานได้ดี ฉันได้ลองใช้เอฟเฟ็กต์การสลับพวกมันดูเหมือนจะไม่สร้างความแตกต่างและฉันก็ใช้บัฟเฟอร์ 2 ตัวเสมอ ฉันจะลองทำสิ่งเต็มหน้าจอ (แม้ว่าฉันไม่ทราบว่าคุณหมายถึงอะไรโดย "ใช้โหมดการแสดงผลแบบระบุ" - เมื่อตอบสนองต่อ WM_SIZE ทั้งหมดที่ฉันทำคือ ResizeBuffers ไม่มีโหมดการแสดงผลเป็นอาร์กิวเมนต์ ) แต่ฉันติดตั้ง windows 8 เองตามธรรมชาติและคาดเดาสิ่งที่ฉันไม่สามารถจำลองปัญหาได้ในขณะนี้ ..

กลับไปที่ windows7 และลองสร้าง swapchain ในแบบเต็มหน้าจอตั้งแต่เริ่มต้น แต่ปัญหายังคงมีอยู่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.