วิธีปฏิบัติที่ดีที่สุดสำหรับการตั้งค่าพารามิเตอร์ Effect ใน XNA


13

ฉันต้องการถามว่ามีวิธีปฏิบัติที่ดีที่สุดสำหรับการตั้งค่าEffectพารามิเตอร์ใน XNA หรือไม่ pass.Apply()หรือกล่าวอีกนัยหนึ่งว่าสิ่งที่เกิดขึ้นเมื่อผมเรียก ฉันจินตนาการถึงหลาย ๆ สถานการณ์:

  1. ทุกครั้งที่Applyมีการเรียกพารามิเตอร์เอฟเฟกต์ทั้งหมดจะถูกถ่ายโอนไปยัง GPU และดังนั้นจึงไม่มีผลต่อความถี่ที่ฉันตั้งค่าพารามิเตอร์
  2. แต่ละครั้งApplyจะถูกเรียกเฉพาะพารามิเตอร์ที่ได้รับการรีเซ็ตจะถูกถ่ายโอน ดังนั้นการแคช Set-actions ที่ไม่ได้ตั้งค่าใหม่ควรหลีกเลี่ยง
  3. แต่ละครั้งApplyจะถูกเรียกเฉพาะพารามิเตอร์ที่มีการเปลี่ยนแปลงเท่านั้นที่จะถูกถ่ายโอน ดังนั้นการแคชการตั้งค่าจึงไม่มีประโยชน์
  4. คำถามทั้งหมดนี้ไม่มีข้อบกพร่องเนื่องจากไม่มีวิธีการใดวิธีหนึ่งที่กล่าวถึงผลกระทบต่อประสิทธิภาพของเกม

ดังนั้นคำถามสุดท้าย: มีประโยชน์หรือไม่หากใช้การแคชของชุดการดำเนินการเช่น:

private Matrix _world;
public Matrix World
{
    get{ return _world; }
    set 
    {
        if (value == world) return;
        _effect.Parameters["xWorld"].SetValue(value);
        _world = value;
    }
}

ขอบคุณในความคาดหมาย


ฉันเพิ่มแท็ก DirectX บนพื้นฐานที่ว่านี่คือฟังก์ชั่นระดับต่ำกว่า XNA
Andrew Russell

ฉันได้พบหลักฐานว่าหัวข้อที่อยู่ในมือเป็นไปได้มาก ดูเหมือนว่าหากคุณฉลาดในการตั้งค่าพารามิเตอร์เอฟเฟกต์ของคุณคุณสามารถเพิ่มจำนวนการเรียกการดึง (นั่นเป็นวิธีที่รวดเร็วในการประมวลผลบน CPU) มากกว่าสองครั้ง ฉันยังอยู่ในขั้นตอนการทดสอบนี้คุณสามารถอ่านคำถามของฉันได้ที่นี่: gamedev.stackexchange.com/questions/66932/…
cubrman

คำตอบ:


8

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

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

(เนื่องจากสถานการณ์ # 2 เป็นไปได้จึงควรหลีกเลี่ยงการตั้งค่าพารามิเตอร์ที่ไม่เปลี่ยนแปลง)

บอกตามตรงฉันไม่แน่ใจจริงๆว่าคนขับทั่วไปทำอะไร ส่วนใหญ่เป็นเพราะมันไม่เคยเกิดขึ้นจริง ๆ เป็นปัญหา ฉันไม่เคยได้ยินว่ามีใครตั้งค่าพารามิเตอร์เอฟเฟกต์เป็นคอขวด อาจเป็นไปได้ในทางทฤษฎี แต่ก็ยังมีอื่น ๆ อีกมากมายสิ่งที่พบต้องกังวลเกี่ยวกับ

แน่นอนว่าอย่าเริ่มใช้การปรับให้เหมาะสมเช่นนี้โดยไม่วัดประสิทธิภาพและทำความเข้าใจกับสิ่งที่เกิดขึ้น

นอกจากนี้การเปรียบเทียบMatrixกับ==วูดูก็ไม่ดีเช่นกัน A Matrixประกอบไปด้วยfloats และการเปรียบเทียบความเท่าเทียมกันของจุดลอยตัวมีแนวโน้มที่จะล้มเหลวในหลาย ๆ กรณี

และการพูดโดยทั่วไปรูปแบบจะช้ากว่าเพียงแค่if(x != y) x = y;x = y


จุดที่น่าสนใจที่ผู้ขับขี่ควรใส่ใจในเรื่องนี้ ขอบคุณสำหรับลิงค์ (และลิงค์ใหม่)
0xBADF00D

ฉันเพิ่งมาในรูปทรงเรขาคณิต instancing เช่นจากMSDN การรีเซ็ตเรนเดอร์เดิม (ด้วยค่าเดียวกัน) หลายครั้งต่อเฟรมทำให้กระบวนการเรนเดอร์ช้าลงอย่างมากสองหรือสามครั้ง ดังนั้นการแบตช์รัฐจึงเป็นประโยชน์อย่างยิ่ง น่าเสียดายที่ฉันไม่แน่ใจว่าสภาพอากาศเช่นนี้เกิดขึ้นกับการตั้งค่าพารามิเตอร์เอฟเฟ็กต์ด้วยเช่นกัน แต่ฉันต้องการแบ่งปันข้อมูลของฉัน
0xBADF00D

4

สิ่งหนึ่งที่น่าสนใจที่ฉันพบเกี่ยวกับหัวข้อนี้

จาก msdn:

คุณสามารถใช้คุณสมบัติการทำดัชนีพารามิเตอร์บนเอฟเฟกต์เพื่อเข้าถึงพารามิเตอร์เอฟเฟกต์ใด ๆ แต่สิ่งนี้ช้ากว่าการใช้ EffectParameters ด้วยเหตุผลนี้คุณควรสร้าง EffectParameter สำหรับพารามิเตอร์ effect แต่ละตัวที่เปลี่ยนบ่อย

และ

การสร้างและการกำหนดอินสแตนซ์ EffectParameter สำหรับแต่ละเทคนิคในเอฟเฟกต์ของคุณนั้นเร็วกว่าการใช้คุณสมบัติการทำดัชนีพารามิเตอร์ในเอฟเฟกต์

นั่นหมายความว่า_effect.Parameters["xWorld"].SetValue(value);ช้ากว่าอย่างเห็นได้ชัดwordlParam.SetValue(value);

ดังนั้นคุณควรแคชพารามิเตอร์เช่นนี้

public EffectParameter wordlParam;
wordlParam = _effect.Parameters["xWorld"];

แต่ฉันไม่พบเกณฑ์มาตรฐานที่แท้จริง

แหล่งที่มา:

http://msdn.microsoft.com/en-us/library/Microsoft.Xna.Framework.Graphics.EffectParameter%28v=xnagamestudio.40%29.aspx http://msdn.microsoft.com/en-us/library /bb976060%28v=xnagamestudio.31%29.aspx


เพิ่งทดสอบสิ่งนี้กับเครื่องจำลอง Monogame และ WP - ฉันสามารถยืนยันได้ว่ามีความแตกต่างอย่างมีนัยสำคัญ (ระหว่าง 5-15% ในกรณีของฉัน) มีลูกเล่นอื่น ๆ อีกมากมายที่ช่วยในการแสดงบ้างไหม?
Konrad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.