วิธีที่ดีที่สุดในการรับประสบการณ์การทำงาน C ++ สำหรับงานในเกม (มาจาก C #) [ปิด]


19

ฉันเป็นนักพัฒนาซอฟต์แวร์ที่มีประสบการณ์กับ C # (ประสบการณ์ 5 ปี) พร้อมกับภาษาอื่น ๆ

"งานในฝัน" ของฉันทำงานในวิดีโอเกมในฐานะนักพัฒนาซอฟต์แวร์

งานส่วนใหญ่ต้องการความรู้เกี่ยวกับ C ++ ซึ่งฉันยังไม่มีในขณะนี้ (ยกเว้นพื้นฐานบางอย่าง)

ฉันได้ดูไปรอบ ๆ และ บริษัท เกมใหญ่ ๆ ส่วนใหญ่ต้องการบางสิ่งในช่วง 3-5 ปีที่ผ่านมาของ C ++

คำถามของฉันคือ - อะไรจะเป็นเส้นทางที่ดีในการรับตัวเองสู่ระดับประสบการณ์ที่จำเป็นนี้มาจาก C #

ฉันคิดถึงวิธีที่เป็นไปได้ที่จะทำ:

รับความรู้เพิ่มเติมเกี่ยวกับ C ++ จากหนังสือ เข้าร่วมในโครงการโอเพนซอร์ซที่เขียนด้วย C ++ อะไรจะเป็นวิธีที่ดีที่สุดในการเรียนรู้ C ++ และมีประสบการณ์ระดับทำงานโดยเฉพาะอย่างยิ่งสำหรับอุตสาหกรรมเกม?


1
ขอบคุณฉันจะตรวจสอบ แม้ว่าฉันไม่แน่ใจว่านี่เป็นคำถามเดียวกันแน่นอนเพราะฉันไม่ใช่ผู้เริ่มต้นในการเขียนโปรแกรม
spaceOwl

3
ไม่มีใครสนใจว่าคุณจะได้รับประสบการณ์จากที่ไหนหรือว่าคุณได้รับค่าตอบแทนหรือไม่ หากคุณต้องการประสบการณ์ใน C ++ ให้เริ่มต้นการเขียนโปรแกรม C ++
Maik Semder

@liortal Repost: ดูเพิ่มเติมมีเคล็ดลับที่ดีอะไรสำหรับผู้เริ่มต้นบ้าง? (บางคนแปลกลบความคิดเห็นของฉันทั้งหมดในหัวข้อนี้)
bobobobo

คำตอบ:


29

ในฐานะนักพัฒนาเกมข้อกังวลหลักของฉันในการว่าจ้างผู้ชาย C # ก็คือการขาดความรู้ระดับต่ำ

ดังนั้นให้พิจารณาโครงการที่งานของคุณมีการปรับให้เหมาะสมในระดับต่ำเช่นจัดเรียงเค้าโครงข้อมูลของคลาสหรือการเขียนรหัสใหม่เพื่อใช้ประโยชน์จากคำสั่ง SIMD ใช้เกมโอเพ่นซอร์ส C ++ เพิ่มประสิทธิภาพและโพสต์การเพิ่มขึ้นอย่างมากของเรซูเม่ของคุณ

ถ้าฉันสัมภาษณ์คุณฉันจะสนใจเรื่อง C ++ น้อยลงในเรซูเม่ของคุณและเพิ่มเติมเกี่ยวกับว่าคุณสามารถตอบคำถามสัมภาษณ์ C / C ++ / ระดับต่ำของฉันได้หรือไม่ ฉันจะใช้คำถามสัมภาษณ์มาตรฐานที่คุณอาจมีปัญหา (คำเตือน: ฉันไม่ใช่ผู้เชี่ยวชาญ C #):

  • คลาส C ++ มีการจัดวางในหน่วยความจำอย่างไร วาดไดอะแกรมของไบต์ รวม voin pointers และ padding / alignment ของตัวแปรสมาชิก แล้วคลาสที่ได้รับล่ะ สิ่งที่เกี่ยวกับชั้นเรียนคูณ
  • การเรียกใช้ฟังก์ชันเสมือนเกิดขึ้นในระดับต่ำได้อย่างไร พูดเกี่ยวกับการประกอบชิ้นงานเช่นการอ่านค่าในหน่วยความจำและกระโดดไปยังที่อยู่
  • รู้เกี่ยวกับการโยนสไตล์ C, static_cast และ dynamic_cast ระหว่างตัวชี้ไปยังประเภทที่มีความสัมพันธ์ในการสืบทอดที่หลากหลาย ตัวอย่างเช่นคลาส B และ C ทั้งคู่เกิดขึ้นจากคลาส A จะเกิดอะไรขึ้นเมื่อคุณพยายามที่จะแคสต์จาก A * ถึง B * (หรือ B * ถึง C *) โดยใช้ casts ต่างๆเหล่านี้? (ฉันพูดถึงเพราะฉันไม่คิดว่า C # จะยอมให้ใช้ cast เฉพาะเหล่านี้)
  • ทำไมการส่งเวกเตอร์ stl ด้วยค่าแทนที่จะดีกว่าโดยอ้างอิง? (ฉันพูดถึงเพราะประเภทส่วนใหญ่ใน C # เป็นประเภทอ้างอิงและดังนั้นจึงเป็นไปไม่ได้ที่จะทำผิดประเภทนี้ใน C #)
  • มันหมายถึงอะไรสำหรับโครงสร้างหรือฟังก์ชั่นที่จะเป็นมิตรกับแคช? ทำไมโครงสร้างของอาร์เรย์อาจทำงานได้ดีกว่าโครงสร้างอาร์เรย์?
  • ทำความเข้าใจกับกองกองและหน่วยความจำแบบคงที่ หากมีการจัดสรรวัตถุใหม่สิ่งนั้นจะอยู่ในหน่วยความจำของกระบวนการหรือไม่ แล้วตัวแปรท้องถิ่นล่ะ ตัวแปรระดับโลก?
  • หน่วยความจำรั่วคืออะไร อะไรคือแนวทางปฏิบัติที่ดีที่สุดในการหลีกเลี่ยง (ฉันพูดถึงเพราะไม่มีการลบใน C #!)
  • คุณจะดีบักข้อผิดพลาดการละเมิดการเข้าถึงหน่วยความจำได้อย่างไร แล้วถ้าเกิดความผิดพลาดขึ้นในไลบรารี่มิดเดิลแวร์ที่คุณไม่มีซอร์สโค้ดล่ะ

1
โพสต์ใหม่: ฉันรู้ถึงประโยชน์ของการรู้ว่าตัวชี้ vtable อยู่ในหน่วยความจำเพราะฉันพบข้อผิดพลาดที่เกี่ยวข้องก่อนหน้านี้ อย่างไรก็ตามคำถามที่ 2 มีประโยชน์อย่างไรบ้าง? การรู้ "การดำเนินการระดับแอสเซมบลีเช่นการอ่านค่าลงในหน่วยความจำ" ทำให้หนึ่งเป็นโปรแกรมเมอร์ C ++ ที่มีความสามารถอย่างไร
bobobobo

การสัมภาษณ์ Blizzard ของฉันสำหรับจุดฝึกงาน WoW UI แตะที่จุด 1, 2, 3 (ระดับน้อยกว่า), 5 และ 7 เขายังถามคำถามเกี่ยวกับการดีบัก / ทดสอบ (คล้ายกับจุดที่ 8) ฉันคิดว่าคำตอบนี้ตรง แม้ในกรณีทั่วไปสำหรับ บริษัท พัฒนาเกมระดับบน
Dean Knight

2
@DeanKnight ฉันไม่สงสัยเลย แต่ฉันยังต้องการทราบว่า OP คิดว่าคำถามแบบนั้นทำให้ใครบางคนเป็นโปรแกรมเมอร์ C ++ ที่ดี (คำถามดั้งเดิมเกี่ยวกับวิธีการเป็นโปรแกรมเมอร์ C ++ ที่ดีกว่า) ไม่ใช่แค่ช่วยให้ใครสักคนสัมภาษณ์
bobobobo

2
คุณฟังดูไม่น่าเชื่อ bobobobo แต่ลิงก์ของคุณเกี่ยวกับบั๊กตัวชี้ vtable เป็นตัวอย่างที่ดีของการรู้ว่า internals ของการเรียกฟังก์ชันเสมือนมีประโยชน์อย่างไร พิจารณาข้อผิดพลาดที่คล้ายกันที่แทนของ vtable ชี้เป็นnullมันของขยะ วิธีหนึ่งในการตระหนักถึงขยะคือการก้าวผ่านการแยกส่วนของการเรียกฟังก์ชันเสมือนและดูว่าโปรแกรมของคุณไปที่ใดแทนที่จะไปที่ vtable ที่ถูกต้องหรือวิธีที่ถูกต้อง
Eric Undersander

1

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

ฉันจะระวังหนังสือเก่า ๆ ด้วย ฉันเองชอบฟอรัม / เว็บไซต์ที่เชื่อถือได้ stackoverflow / isocpp


ขอบคุณ ฉันกำลังมองหาคำแนะนำที่กว้างกว่า / คำแนะนำทั่วไปเกี่ยวกับสิ่งที่ต้องทำมากกว่าเฉพาะภาษาเพื่อการศึกษา
spaceOwl

"การหลีกเลี่ยงnew" ไม่ใช่คำแนะนำที่สมเหตุสมผล คุณใช้newเมื่อคุณมีพอยน์เตอร์ ถ้าเป็นclass Derived : Baseเช่นนั้นBase var = Derived();จะผิดกฎหมาย แต่Base *var = new Derived();ถูกกฎหมาย คุณต้องมีพอยน์เตอร์เพื่อให้ polymorphism ทำงานได้ถูกต้องมาก
bobobobo

ใช่ แต่คุณสามารถใช้ std :: unique_ptr เพื่อให้เกิด polymorphism และหลีกเลี่ยงการใช้ตัวชี้เปล่า (แม้ว่าคุณจะยังคงมีคำหลักใหม่ในตัวสร้าง unique_ptr)
Eric B

ฉันขอโทษฉันทำผิดพลาดในความคิดเห็นด้านบน Base var = Derived() จะทำงานแต่มันจะถูกหั่นvarและถิ่นคุณข้อมูลหายไปใน เพื่อแก้ไขปัญหาการแบ่งส่วนคุณสามารถใช้ตัวชี้
bobobobo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.