เมื่อฉันเขียนโปรแกรมในเครื่องยนต์ฉันมักจะเกี่ยวข้องกับการแก้ไขn
: ฉันมีพาร์ติชันพิเศษที่ จำกัด จำนวนของวัตถุที่ได้รับupdate()
, physics()
และrender()
ประมาณเหล่านั้นบนหน้าจอและพื้นที่โดยรอบ ขนาดแบทช์สูงสุดมักจะถูกกำหนดไว้ค่อนข้างดีต่อเกมแม้ว่ามันจะมีขนาดใหญ่กว่าที่คุณวางแผนไว้เล็กน้อย
ในกรณีนี้ฉันไม่เกี่ยวข้องกับ big-O มากเท่าที่ฉันกังวลกับตัวคูณตัวคูณคงที่และคำสั่งซื้อที่ต่ำกว่า สำหรับฟังก์ชั่นที่มีรันไทม์เช่นa*n^2 + b*n + c
(ซึ่งเป็นO(n^2)
) ผมมักจะกังวลมากขึ้นด้วยการลดและอาจจะกำจัดa
c
ค่าติดตั้งหรือค่าการฉีกขาดc
n
อาจจะกลายเป็นเมื่อเทียบกับขนาดใหญ่ตามสัดส่วนที่มีขนาดเล็ก
อย่างไรก็ตามนี่ก็ไม่ได้หมายความว่า big-O (หรือมากกว่านั้นโดยเฉพาะอย่างยิ่งbig-theta ) เป็นตัวบ่งชี้กลิ่นรหัสที่ดี ดูที่O(n^4)
อื่นหรือแย่กว่าO(k^n)
นั้นคือเวลาที่มีรูปทรงเรขาคณิตและถึงเวลาที่จะต้องแน่ใจว่าคุณกำลังพิจารณาทางเลือกอื่น ๆ
โดยทั่วไปฉันกังวลมากขึ้นเกี่ยวกับการเพิ่มประสิทธิภาพของบิ๊กโอและกระโดดผ่านห่วงเพื่อค้นหาอัลกอริธึมที่มีบิ๊กโอต่ำกว่าเมื่อฉันจัดการกับเครื่องมือสร้างข้อมูล ในขณะที่จำนวนของวัตถุในระดับ / พื้นที่การสตรีมที่กำหนดโดยทั่วไปจะถูกกำหนดไว้อย่างดีจำนวนรวมของวัตถุ / สินทรัพย์ศิลปะ / ไฟล์การกำหนดค่า / etc ในเกมทั้งหมดอาจจะไม่ นอกจากนี้ยังมีจำนวนมากขึ้น แม้การเรียกใช้ข้อมูลให้ขนานเรายังคงรอคำสั่งของนาทีที่ (ฉันรู้ว่าสะอื้นสะอื้น - ข้อมูลทำให้คอนโซลสามารถใช้เวลาชั่วโมง - เราเกมพกพาขนาดเล็กส่วนใหญ่) ไปผ่านjam data-clean && jam data
วงจร
ในการให้ตัวอย่างที่เฉพาะเจาะจง: สิ่งนี้หลุดมือไปแล้วด้วยอัลกอริธึมสตรีมเรียงภาพไทล์พื้นหลังซึ่งสตรีมแบบเรียงต่อกันขนาด 8x8 256 สี การใช้บัฟเฟอร์การสตรีมมิ่งร่วมกันระหว่าง "เลเยอร์" ในพื้นหลังและเราอาจมีมากถึง 6 รายการในระดับที่กำหนดซึ่งแบ่งใช้บัฟเฟอร์เดียวกัน ปัญหาคือการประมาณขนาดของบัฟเฟอร์ที่ต้องการนั้นขึ้นอยู่กับตำแหน่งที่เป็นไปได้ของทั้ง 6 เลเยอร์ - และหากพวกเขามีอัตราความกว้าง / ความสูง / สกรอลล์จำนวนเฉพาะจำนวนมากคุณจะเริ่มค้นหาอย่างละเอียด เริ่มเข้าใกล้O(6^numTiles)
- ซึ่งอยู่ในหมวดหมู่ "นานกว่าเอกภพ" โชคดีที่กรณีส่วนใหญ่เป็นเพียง 2-3 เลเยอร์ แต่ถึงอย่างนั้นเราก็มีเวลารันไทม์ครึ่งชั่วโมง ในขณะนี้เราสุ่มตัวอย่างย่อย ๆ น้อย ๆ ของความเป็นไปได้เหล่านี้เพิ่มความละเอียดจนกว่าจะถึงเวลาที่กำหนด (หรือเราได้ทำงานให้เสร็จซึ่งอาจเกิดขึ้นสำหรับการกำหนดค่าเลเยอร์สองชั้นเล็ก ๆ ) เราชนประมาณนี้ขึ้นอยู่กับสถิติก่อนหน้านี้ว่าเราได้รับการพิสูจน์แล้วว่าผิดบ่อยแค่ไหนและจากนั้นเพิ่มช่องว่างเสริมเล็กน้อยเพื่อการวัดที่ดี
ตัวอย่างหนึ่งที่สนุกอื่น ๆ : ในเกมพีซีในขณะที่กลับวิศวกรนำทดลองในขณะที่มีรายชื่อเฮี๊ยบ หน่วยความจำค่าใช้จ่ายปลายขึ้นก่อให้เกิดผลแคชมากขึ้นซึ่งจะเพิ่มการจัดเรียงของตัวคูณที่ไม่คงที่เพื่อให้เรื่องทั้งหมด - n
ดังนั้นพวกเขากำลังจริงๆไม่ได้เป็นทางเลือกที่ดีเลยสำหรับขนาดเล็ก แต่สำหรับรายการที่เรียงลำดับขนาดใหญ่ขึ้นซึ่งมีการค้นหาบ่อยครั้งพวกเขาก็ให้ประโยชน์
(ฉันมักจะพบว่าอัลกอริธึมไร้เดียงสานั้นมีค่าสูงกว่าบิ๊กโอเร็วกว่าในชุดข้อมูลขนาดเล็กและง่ายต่อการเข้าใจยิ่งซับซ้อน / ซับซ้อนมากขึ้น (เช่น patricia trie) ยากสำหรับคนที่จะเข้าใจและบำรุงรักษา ชุดข้อมูล)