โดยทั่วไปฉันควรเพิ่มประสิทธิภาพรหัสของฉันบ่อยแค่ไหนและเมื่อไหร่?


13

ในขั้นตอนการเพิ่มประสิทธิภาพการเขียนโปรแกรมธุรกิจ 'ปกติ' มักจะถูกทิ้งไว้จนจำเป็นจริงๆ หมายความว่าคุณไม่ควรยกเลิกการเลือกจนกว่าจะจำเป็นจริงๆ

จำสิ่งที่Donald Knuthพูดว่า "เราควรลืมประสิทธิภาพเล็ก ๆ น้อย ๆ พูดถึง 97% ของเวลา: การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด"

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

นอกจากนี้สิ่งที่ฉันควรวัดการเพิ่มประสิทธิภาพ? เห็บ? อัตราเฟรม? เวลารวม?

คำตอบ:


18

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

  • "การสร้างโปรไฟล์ของมนุษย์" หรือที่รู้จักเพียงแค่เล่นเกม ; มันรู้สึกช้าหรือ "ผูกปม" เป็นครั้งคราว? สังเกตเห็นภาพเคลื่อนไหวกระตุก? (ในฐานะนักพัฒนาซอฟต์แวร์โปรดทราบว่าคุณจะมีความไวต่อปัญหาประสิทธิภาพบางประเภทและไม่สนใจผู้อื่นวางแผนการทดสอบเพิ่มเติมตามลำดับ)
  • เปิดจอแสดงผล 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 หรือสร้างต้นแบบจำนวนมากแทนที่จะทำให้โค้ดปัจจุบันทำงานได้เร็วขึ้น แต่โดยทั่วไปแล้วมันก็คุ้มค่ากว่ามาก

และอีกหนึ่งการแก้ปัญหาที่มีประโยชน์: หากคุณอยู่ใกล้กับ "แกนกลาง" ของเครื่องยนต์คุณอาจต้องใช้ความพยายามพิเศษและการทดลองเพื่อเพิ่มประสิทธิภาพ (เช่นปรับเวกเตอร์คูณเมทริกซ์เหล่านั้น!) ยิ่งห่างจากแกนกลางมากเท่าไหร่คุณก็ยิ่งกังวลน้อยลงเว้นแต่เครื่องมือทำโปรไฟล์ของคุณจะบอกคุณเป็นอย่างอื่น


6
  1. ใช้โครงสร้างข้อมูลและอัลกอริทึมที่ถูกต้องล่วงหน้า
  2. อย่าปรับให้เหมาะสมจนกว่าคุณจะโพรไฟล์และรู้ว่าฮอตสปอตของคุณอยู่ที่ไหน
  3. ไม่ต้องกังวลกับการเป็นคนฉลาด คอมไพเลอร์ทำตามเคล็ดลับเล็กน้อยที่คุณคิดไว้แล้ว ("โอ้! ฉันต้องคูณด้วยสี่! ฉันจะเลื่อนไปทางซ้ายสองครั้ง!")
  4. ใส่ใจแคชคิดถึง

1
การใช้คอมไพเลอร์นั้นฉลาดแค่จุดเดียว ใช่มันจะทำการเพิ่มประสิทธิภาพตาแมวที่คุณไม่คิด (และไม่สามารถทำได้โดยไม่ต้องใช้ชุดประกอบ) แต่มันไม่มีส่วนเกี่ยวข้องกับอัลกอริทึมของคุณที่ควรจะทำ นอกจากนี้คุณจะประหลาดใจว่าคุณสามารถชนะได้มากเพียงใดด้วยการใช้รหัสที่สำคัญในแอสเซมบลีหรืออินทิลิตี้ .... ถ้าคุณรู้ว่าคุณกำลังทำอะไรอยู่ คอมไพเลอร์ไม่ได้ฉลาดเท่าที่พวกเขาทำพวกเขาไม่รู้สิ่งที่คุณทำจนกว่าคุณจะบอกพวกเขาทุกที่อย่างชัดเจน (เช่นใช้ 'จำกัด ' อย่างเคร่งครัด)
Kaj

1
และอีกครั้งฉันต้องแสดงความคิดเห็นว่าถ้าคุณเพียงมองหาจุดร้อนที่คุณจะพลาดในรอบมากเพราะคุณจะไม่พบรอบ ๆ เล็ดลอดออกมาทั่วกระดาน (เช่น smartpointers .... dereferences ที่ไหนไม่เคยปรากฏ ในฐานะฮอตสปอตเพราะประสิทธิภาพของโปรแกรมทั้งหมดของคุณคือฮอตสปอต)
Kaj

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

5

ยังจำได้อย่างไร ในขณะที่ไม่จำเป็นต้องไปที่ฮาร์ดคอร์ในทุกบรรทัดของรหัส แต่มีเหตุผลสำหรับการตระหนักว่าคุณกำลังทำงานในเกมซึ่งมีผลกระทบต่อประสิทธิภาพในเวลาจริง
ในขณะที่ทุกคนบอกให้คุณวัดและเพิ่มประสิทธิภาพฮอตสปอตเทคนิคนั้นจะไม่แสดงประสิทธิภาพที่หายไปในที่ซ่อน ตัวอย่างเช่นหากการดำเนินการ '+' ทุกครั้งในโค้ดของคุณจะใช้เวลานานเท่าที่ควรจะไม่แสดงเป็นฮ็อตสป็อตดังนั้นคุณจะไม่เพิ่มประสิทธิภาพหรือตระหนักถึงอย่างไรก็ตามในขณะที่ใช้งาน อาจทำให้คุณเสียประสิทธิภาพมาก คุณจะประหลาดใจว่ามีกี่รอบที่ไหลเวียนโดยไม่ถูกตรวจพบ ดังนั้นจงระวังสิ่งที่คุณทำ
นอกจากนั้นฉันมักจะโพรไฟล์เป็นประจำเพื่อให้ได้ความคิดเกี่ยวกับสิ่งที่อยู่ที่นั่นและเวลาที่เหลือต่อเฟรม สำหรับฉันแล้วเวลาต่อเฟรมนั้นสมเหตุสมผลที่สุดเพราะมันบอกฉันโดยตรงว่าฉันอยู่ที่ไหนด้วยเป้าหมายที่ตั้งเป้าไว้ ลองค้นหาว่าจุดสูงสุดอยู่ที่ใดและเป็นสาเหตุอะไร - ฉันชอบ framerate ที่มีเสถียรภาพมากกว่า framerate สูงที่มี spikes


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

1
ถ้าอย่างนั้นคุณก็ไม่เข้าใจความคิดเบื้องหลังการสูญเสียหยดน้ำ '+' (เช่นเดียวกับตัวอย่าง) เรียกว่าหลายแสนครั้งต่อเฟรมไม่ใช่แค่การวนซ้ำแน่น ถ้ามันหายไปสักสองสามรอบทุกครั้งที่คุณสูญเสียรอบจำนวนมากในกระดาน แต่มันจะไม่ปรากฏเป็นฮอตสปอตเนื่องจากการโทรจะถูกกระจายไปทั่ว codebase / เส้นทางการดำเนินการของคุณอย่างสม่ำเสมอ ดังนั้นคุณไม่ได้พูดถึงหนึ่งในสิบของไมโครวินาที แต่แท้จริงแล้วเป็นพันเท่าของจำนวนไมโครวินาทีที่เพิ่มขึ้นเป็นมิลลิวินาที หลังจากไปหาผลไม้แขวนต่ำ (ลูปแน่น) ฉันได้รับมิลลิวินาทีด้วยวิธีนี้มากกว่าหนึ่งครั้ง
Kaj

มันเหมือนกับก๊อกน้ำที่หยดลงมา ทำไมต้องกังวลเกี่ยวกับการบันทึกการตกเล็กน้อย - "ถ้า Faucet ของคุณหยดด้วยอัตราหนึ่งหยดต่อวินาทีคุณสามารถคาดหวังให้เสีย 2700 แกลลอนต่อปี"
Kaj

โอ้ฉันคิดว่ามันไม่ชัดเจนว่าฉันหมายถึงเมื่อโอเปอเรเตอร์ + โอเวอร์โหลดดังนั้นมันจะส่งผลต่อ '+' ทุกรหัสในรหัส - แน่นอนคุณไม่ต้องการเพิ่มประสิทธิภาพทุก '+' ในรหัส ตัวอย่างที่ไม่ดีฉันเดาว่า .... ฉันหมายถึงมันเป็น exaple สำหรับ 'ฟังก์ชั่นหลักที่ได้รับการเรียกทั่วสถานที่ซึ่งการใช้งานอาจช้ากว่าที่คาดไว้โดยเฉพาะอย่างยิ่งเมื่อซ่อนตัวดำเนินการโอเวอร์โหลด
Kaj

3

เมื่อเกมพร้อมที่จะเปิดตัว (ไม่ว่าจะเป็นเวอร์ชั่นสุดท้ายหรือเบต้า) หรือช้าลงอย่างเห็นได้ชัดนั่นอาจเป็นเวลาที่ดีที่สุดในการสร้างโปรไฟล์แอปของคุณ แน่นอนคุณสามารถเรียกใช้ตัวสร้างโปรไฟล์ได้ทุกเมื่อ แต่ใช่การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด การเพิ่มประสิทธิภาพที่ไม่มีมูลความจริงเช่นกัน; คุณต้องการข้อมูลจริงเพื่อแสดงว่าบางรหัสช้าก่อนที่คุณควรลอง "เพิ่มประสิทธิภาพ" มัน ผู้สร้างโปรไฟล์ทำเพื่อคุณ

หากคุณไม่รู้เกี่ยวกับผู้สร้างโปรไฟล์ให้เรียนรู้! นี่คือโพสต์บล็อกที่ดีแสดงให้เห็นถึงประโยชน์ของ profiler

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

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


ในขณะที่ผลไม้ที่แขวนอยู่ในระดับต่ำมีแนวโน้มที่จะอยู่ใน 10% ของรหัสและถูกจับได้อย่างง่ายดายโดยการทำโปรไฟล์ในตอนท้ายการทำงานอย่างแท้จริงโดยการทำโปรไฟล์นี้จะทำให้คุณพลาดกิจวัตรที่เรียกว่ามาก แต่มีเพียงเล็กน้อย โค้ดที่ไม่ดีเล็กน้อยแต่ละอัน - พวกเขาจะไม่ปรากฏในโปรไฟล์ของคุณ แต่มีจำนวนรอบต่อการโทรหนึ่งครั้ง มันเพิ่มขึ้นจริงๆ
Kaj

@Kaj ผู้สร้างโปรไฟล์ที่ดีรวมการประหารชีวิตหลายร้อยครั้งของอัลกอริทึมที่ไม่ดีและแสดงยอดรวมทั้งหมด ต่อไปคุณจะพูดว่า "แต่ถ้าคุณมีวิธีการที่ไม่ถูกต้อง 10 วิธีและทั้งหมดเรียกว่าความถี่ที่ 1 / 10th" หากคุณใช้เวลาทั้งหมดของคุณกับวิธีการทั้ง 10 วิธีคุณจะพลาดผลไม้ที่แขวนอยู่ในระดับต่ำซึ่งคุณจะได้รับผลตอบแทนที่มากขึ้น
John McDonald

2

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

มันเป็นความคิดที่ดีที่จะออกจากการวิเคราะห์ประสิทธิภาพและการปรับให้เหมาะสมจนถึงช้าเกินไป หากคุณสร้างเกมขึ้นมาแล้วและคุณมีงบประมาณ CPU ถึง 200% และคุณไม่สามารถหามันได้จากการปรับให้เหมาะสม

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

ดังนั้นสร้างสถิติประสิทธิภาพบางอย่างตั้งแต่วันแรก

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

เลือกผลไม้ที่แขวนอยู่ในระดับต่ำในขณะที่คุณไปพร้อมรับมือกับสิ่งที่ยิ่งใหญ่เป็นระยะและคุณควรจะดี


ในการเพิ่มไปยังตัวสร้างโปรไฟล์ในเกม (ซึ่งฉันเห็นด้วยโดยสิ้นเชิง) การขยายตัวติดตั้งเกมเพื่อแสดงหลายแถบ (สำหรับหลายเฟรม) ช่วยให้คุณเชื่อมโยงพฤติกรรมของเกมเข้ากับเดือยและอาจช่วยให้คุณพบปัญหาคอขวดที่ไม่ปรากฏ ด้วย profiler
Kaj

2

ถ้าดูที่คำพูดของ Knuth ในบริบทของเขาเขาจะอธิบายต่อไปว่าเราควรปรับให้เหมาะสม แต่ด้วยเครื่องมือเช่น profiler

คุณควรโพรไฟล์และโปรไฟล์หน่วยความจำอย่างต่อเนื่องแอปพลิเคชันของคุณหลังจากวางโครงสร้างพื้นฐานมาก

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

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


1

สำหรับโครงการของฉันฉันมักจะใช้การเพิ่มประสิทธิภาพที่จำเป็นมากในเครื่องมือพื้นฐานของฉัน ตัวอย่างเช่นฉันมักจะใช้การใช้งาน SIMD ที่มั่นคงโดยใช้ SSE2 และ 3DNow! สิ่งนี้ทำให้มั่นใจว่าคณิตศาสตร์จุดลอยตัวของฉันอยู่ในตำแหน่งที่ฉันต้องการให้เป็น การฝึกฝนที่ดีอีกวิธีหนึ่งคือการสร้างนิสัยให้เกิดประโยชน์สูงสุดจากการที่คุณเขียนโค้ดแทนที่จะกลับไป เวลาส่วนใหญ่การฝึกฝนเล็กน้อยเหล่านี้ใช้เวลานานเท่ากับสิ่งที่คุณเข้ารหัสอยู่แล้ว ก่อนการเข้ารหัสคุณลักษณะให้แน่ใจว่าคุณวิจัยวิธีที่มีประสิทธิภาพที่สุดในการทำมัน

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


0

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


0

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

คุณจะต้องการเพิ่มประสิทธิภาพเมื่อ framerate ของคุณลดลงถึงจุดที่เกมเริ่มประสบ ผู้ร้ายที่เป็นไปได้มากที่สุดคือ CPU ของคุณมีการใช้งานมากเกินไป (100%)


ฉันว่า GPU น่าจะเป็นซีพียู จริง ๆ แล้วขึ้นอยู่กับว่าสิ่งต่าง ๆ เข้าด้วยกันอย่างแน่นหนามันเป็นไปได้อย่างสิ้นเชิงที่จะมีซีพียูจำนวนมากถูกผูกไว้ในครึ่งเฟรม การทำโปรไฟล์แบบโง่อาจแสดงการใช้งานน้อยกว่า 100% ตรวจสอบให้แน่ใจว่าการทำโปรไฟล์ของคุณนั้นละเอียดพอที่จะแสดงให้เห็นว่า (แต่ไม่ละเอียดมากจนเกินไปที่จะล่วงล้ำ!)
JasonD

0

คุณควรเพิ่มประสิทธิภาพรหัสของคุณ ... บ่อยเท่าที่คุณต้องการ

สิ่งที่ฉันทำในอดีตเป็นเพียงการรันเกมอย่างต่อเนื่องโดยเปิดการทำโปรไฟล์ (ที่เคาน์เตอร์ตัวกรองเฟรมอย่างน้อยที่สุดตลอดเวลา) หากเกมช้าลง (ต่ำกว่าเป้าหมายของคุณกำหนดอัตราเฟรมไว้บนเครื่อง min spec ของคุณ) ให้เปิด profiler และดูว่ามีฮอตสปอตใด ๆ ปรากฏขึ้นหรือไม่

บางครั้งมันไม่ใช่รหัส ปัญหามากมายที่ฉันเคยพบเจอในอดีตนั้นได้รับการมุ่งเน้นไปที่ gpu (ได้รับนี่คือบน iPhone) ปัญหาการเติมการโทรออกจำนวนมากเกินไปไม่ได้สร้างรูปทรงเรขาคณิตที่เพียงพอและมีเฉดสีที่ไม่มีประสิทธิภาพ ...

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


0

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

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