ที่ที่ฉันเคยทำงานเรามักใช้การทำโปรไฟล์หลายระดับ หากคุณพบปัญหาคุณเพียงแค่เลื่อนรายการลงไปอีกเล็กน้อยจนกว่าคุณจะเข้าใจว่าเกิดอะไรขึ้น:
- "การสร้างโปรไฟล์ของมนุษย์" หรือที่รู้จักเพียงแค่เล่นเกม ; มันรู้สึกช้าหรือ "ผูกปม" เป็นครั้งคราว? สังเกตเห็นภาพเคลื่อนไหวกระตุก? (ในฐานะนักพัฒนาซอฟต์แวร์โปรดทราบว่าคุณจะมีความไวต่อปัญหาประสิทธิภาพบางประเภทและไม่สนใจผู้อื่นวางแผนการทดสอบเพิ่มเติมตามลำดับ)
- เปิดจอแสดงผล FPSซึ่งเป็นหน้าต่างเลื่อน FPS เฉลี่ย 5 วินาที ค่าใช้จ่ายน้อยมากในการคำนวณและแสดงผล
- เปิดแถบโปรไฟล์ซึ่งเป็นเพียงชุดของสี่คน (สี ROYGBIV) ที่แสดงถึงส่วนต่าง ๆ ของเฟรม (เช่น vblank, preframe, update, collision, render, postframe) โดยใช้ตัวจับเวลา "นาฬิกาจับเวลา" รอบ ๆ แต่ละส่วนของรหัส . เพื่อเน้นสิ่งที่เราต้องการเราได้ตั้งค่าความกว้างของหน้าจอหนึ่งแถบเพื่อเป็นตัวแทนของเฟรมเป้าหมาย 60Hz ดังนั้นจึงเป็นเรื่องง่ายที่จะดูว่าคุณเช่น 50% ภายใต้งบประมาณ (เพียงครึ่งบาร์) หรือ 50% มากกว่า ( แถบนั้นจะพันและจะกลายเป็นหนึ่งและครึ่งแท่ง) มันค่อนข้างง่ายที่จะบอกว่าสิ่งที่กินเฟรมส่วนใหญ่โดยทั่วไป: red = render, yellow = update ฯลฯ ...
- สร้างเครื่องมือสร้างพิเศษที่แทรก "นาฬิกาจับเวลา" เช่นโค้ดรอบ ๆ แต่ละฟังก์ชั่น (โปรดทราบว่าคุณอาจต้องใช้ประสิทธิภาพการทำงานขนาดใหญ่, dcache, และ icache hit เมื่อทำสิ่งนี้ดังนั้นจึงเป็นการล่วงล้ำอย่างแน่นอน แต่ถ้าคุณขาด profiler การสุ่มตัวอย่างที่เหมาะสมหรือการสนับสนุน CPU ที่เหมาะสมนี่เป็นตัวเลือกที่ยอมรับได้ เกี่ยวกับการบันทึกข้อมูลขั้นต่ำเกี่ยวกับฟังก์ชั่นการเข้า / ออกและการสร้าง calltraces ใหม่ในภายหลัง) เมื่อเราสร้างเราเราเลียนแบบรูปแบบเอาต์พุตส่วนใหญ่ของgprof
- ดีที่สุดของทั้งหมดใช้การสร้างโปรไฟล์การสุ่มตัวอย่าง ; VTune และ CodeAnalyst พร้อมใช้งานสำหรับ x86 และ x64 คุณมีสภาพแวดล้อมการจำลองหรือการจำลองที่อาจให้ข้อมูลกับคุณที่นี่
(มีเรื่องราวสนุก ๆ จาก GDC โปรแกรมเมอร์ในปีที่ผ่านมาซึ่งถ่ายภาพตัวเองสี่ภาพ - มีความสุขไม่แยแสรำคาญและโกรธ - และแสดงภาพที่เหมาะสมในมุมของการสร้างภายในที่อิง framerate ผู้สร้างเนื้อหาการเรียนรู้ได้อย่างรวดเร็วจะไม่เปิดให้เฉดสีที่ซับซ้อนสำหรับทั้งหมดของวัตถุและสภาพแวดล้อมของพวกเขาที่พวกเขาต้องการให้โปรแกรมเมอร์โกรธดูเถิดอำนาจของข้อเสนอแนะ.).
โปรดทราบว่าคุณสามารถทำสิ่งที่สนุกสนานเช่นกราฟ "แถบโปรไฟล์" อย่างต่อเนื่องเพื่อให้คุณเห็นรูปแบบสไปค์ ("เราจะสูญเสียเฟรมทุก ๆ 7 เฟรม") หรือคล้ายกัน
ที่จะตอบคำถามของคุณโดยตรง แต่ในประสบการณ์ของผมในขณะที่มันดึงดูด (และมักจะให้รางวัล - ฉันมักจะเรียนรู้สิ่ง) ที่จะเขียนฟังก์ชั่นเดียว / โมดูลไปยังหมายเลขที่เพิ่มประสิทธิภาพของคำสั่งหรือ icache หรือประสิทธิภาพ dcache และเราทำจริงต้องที่จะทำ นี้บางครั้งเมื่อเรามีปัญหาประสิทธิภาพการทำงานที่น่ารังเกียจโดยเฉพาะอย่างยิ่งส่วนใหญ่ของปัญหาประสิทธิภาพการทำงานที่เราจัดการกับเป็นประจำลงมาออกแบบ ตัวอย่างเช่น:
- เราควรแคชใน RAM หรือโหลดจากเฟรมภาพเคลื่อนไหว "โจมตี" สถานะสำหรับผู้เล่นหรือไม่? แล้วศัตรูแต่ละคนล่ะ? เราไม่มี RAM ให้ทำทั้งหมด แต่การโหลดดิสก์มีราคาแพง! คุณสามารถเห็น hitching ถ้า 5 หรือ 6 ศัตรูที่แตกต่างกันปรากฏในครั้งเดียว! (โอเคแล้ววิธีการวางไข่ที่ตุปัดตุเป๋?)
- เรากำลังทำการผ่าตัดชนิดเดียวกับอนุภาคทั้งหมดหรือการดำเนินการทั้งหมดในอนุภาคเดี่ยวหรือไม่? (นี่คือ icache / dcache tradeoff และคำตอบนั้นไม่ชัดเจนเสมอไป) วิธีดึงอนุภาคทั้งหมดออกจากกันและเก็บตำแหน่งไว้ด้วยกัน ("โครงสร้างของอาร์เรย์" ที่มีชื่อเสียง) เทียบกับการเก็บข้อมูลอนุภาคทั้งหมดในที่เดียว (" อาร์เรย์ของ structs ")
คุณได้ยินมันจนกว่ามันจะน่ารังเกียจในหลักสูตรวิทยาศาสตร์คอมพิวเตอร์ระดับมหาวิทยาลัย แต่: มันเป็นเรื่องของโครงสร้างข้อมูลและอัลกอริธึมจริงๆ การใช้เวลากับอัลกอริธึมและการออกแบบการไหลของข้อมูลจะช่วยให้คุณได้รับเงินมากขึ้น (ตรวจสอบให้แน่ใจว่าคุณได้อ่านข้อผิดพลาดที่ยอดเยี่ยมของสไลด์การเขียนโปรแกรมเชิงวัตถุจาก Sony Developer Services เพื่อดูข้อมูลเชิงลึกที่นี่) สิ่งนี้ไม่ "รู้สึก" เหมือนการเพิ่มประสิทธิภาพ เวลาส่วนใหญ่ใช้กับเครื่องมือไวท์บอร์ดหรือ UML หรือสร้างต้นแบบจำนวนมากแทนที่จะทำให้โค้ดปัจจุบันทำงานได้เร็วขึ้น แต่โดยทั่วไปแล้วมันก็คุ้มค่ากว่ามาก
และอีกหนึ่งการแก้ปัญหาที่มีประโยชน์: หากคุณอยู่ใกล้กับ "แกนกลาง" ของเครื่องยนต์คุณอาจต้องใช้ความพยายามพิเศษและการทดลองเพื่อเพิ่มประสิทธิภาพ (เช่นปรับเวกเตอร์คูณเมทริกซ์เหล่านั้น!) ยิ่งห่างจากแกนกลางมากเท่าไหร่คุณก็ยิ่งกังวลน้อยลงเว้นแต่เครื่องมือทำโปรไฟล์ของคุณจะบอกคุณเป็นอย่างอื่น