คำถามติดแท็ก c++

C ++ เป็นภาษาเขียนโปรแกรมแบบสแตติกแบบหลายกระบวนทัศน์รวบรวมภาษาโปรแกรมอเนกประสงค์

7
วิธีหลีกเลี่ยงวัตถุเกมลบโดยไม่ตั้งใจใน C ++
สมมติว่าเกมของฉันมีสัตว์ประหลาดที่สามารถโจมตีได้ด้วยระเบิด เรามาเลือกชื่อสัตว์ประหลาดตัวนี้แบบสุ่ม: Creeper ดังนั้นCreeperคลาสมีวิธีการที่มีลักษณะดังนี้: void Creeper::kamikaze() { EventSystem::postEvent(ENTITY_DEATH, this); Explosion* e = new Explosion; e->setLocation(this->location()); this->world->addEntity(e); } เหตุการณ์ไม่ได้เข้าคิวพวกเขาจะถูกส่งทันที ซึ่งทำให้วัตถุที่จะได้รับการลบบางภายในการเรียกร้องให้Creeper postEventบางสิ่งเช่นนี้ void World::handleEvent(int type, void* context) { if(type == ENTITY_DEATH){ Entity* ent = dynamic_cast<Entity*>(context); removeEntity(ent); delete ent; } } เพราะCreeperวัตถุที่ได้รับการลบในขณะที่วิธีการที่จะยังคงทำงานก็จะมีปัญหาเมื่อพยายามที่จะเข้าถึงkamikazethis->location() ทางออกหนึ่งคือการจัดคิวเหตุการณ์ลงในบัฟเฟอร์และส่งต่อในภายหลัง นั่นเป็นวิธีแก้ปัญหาทั่วไปในเกม C ++ ใช่ไหม รู้สึกเหมือนแฮ็คสักหน่อย แต่นั่นอาจเป็นเพราะประสบการณ์ของฉันกับภาษาอื่นที่มีการจัดการหน่วยความจำที่แตกต่างกัน ใน C ++ มีวิธีแก้ปัญหาทั่วไปที่ดีกว่าสำหรับปัญหานี้หรือไม่ที่วัตถุจะลบตัวเองออกจากภายในหนึ่งในวิธีการใด …
20 c++  scene-graph 

6
ค้นหาทิศทางของการเดินทางในโลกที่มีขอบล้อมรอบ
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เนื่องจากสามารถตอบได้ใน Game Exchange Stack Exchange อพยพ 8 ปีที่ผ่านมา ฉันต้องการค้นหาทิศทางระยะทางที่สั้นที่สุดจากจุดหนึ่งในโลก 2 มิติของฉันไปยังอีกจุดที่ขอบถูกห่อ (เช่นดาวเคราะห์น้อย ฯลฯ ) ฉันรู้วิธีหาระยะทางที่สั้นที่สุด แต่ฉันพยายามหาทิศทางที่มันอยู่ ระยะทางที่สั้นที่สุดจะได้รับจาก: int rows = MapY; int cols = MapX; int d1 = abs(S.Y - T.Y); int d2 = abs(S.X - T.X); int dr = min(d1, rows-d1); int dc = min(d2, cols-d2); …
20 c++  algorithm 

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

2
วิธีที่ดีที่สุดในการรับประสบการณ์การทำงาน C ++ สำหรับงานในเกม (มาจาก C #) [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้จะเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน6 ปีที่ผ่านมา ฉันเป็นนักพัฒนาซอฟต์แวร์ที่มีประสบการณ์กับ C # (ประสบการณ์ 5 ปี) พร้อมกับภาษาอื่น ๆ "งานในฝัน" ของฉันทำงานในวิดีโอเกมในฐานะนักพัฒนาซอฟต์แวร์ งานส่วนใหญ่ต้องการความรู้เกี่ยวกับ C ++ ซึ่งฉันยังไม่มีในขณะนี้ (ยกเว้นพื้นฐานบางอย่าง) ฉันได้ดูไปรอบ ๆ และ บริษัท เกมใหญ่ ๆ ส่วนใหญ่ต้องการบางสิ่งในช่วง 3-5 ปีที่ผ่านมาของ C ++ คำถามของฉันคือ - อะไรจะเป็นเส้นทางที่ดีในการรับตัวเองสู่ระดับประสบการณ์ที่จำเป็นนี้มาจาก C # ฉันคิดถึงวิธีที่เป็นไปได้ที่จะทำ: รับความรู้เพิ่มเติมเกี่ยวกับ C ++ จากหนังสือ เข้าร่วมในโครงการโอเพนซอร์ซที่เขียนด้วย C ++ อะไรจะเป็นวิธีที่ดีที่สุดในการเรียนรู้ C ++ …

8
การกำหนดแฮนด์โป๊กเกอร์
ฉันได้ทำเกม Texas Hold'Em เป็นส่วนหนึ่งของการประเมินและฉันครุ่นคิดถึงวิธีการตรวจสอบไพ่ที่มีอยู่ทั้ง 7 ใบและตัดสินว่ามือมีอยู่จริงหรือไม่ วิธีเดียวที่เป็นไปได้ที่ฉันคิดได้คือเรียงไพ่เป็นตัวเลขจากนั้นตรวจสอบกลุ่มที่เป็นไปได้ 5 ใบและตรวจสอบว่าตรงกับรายการของมือที่เป็นไปได้ทุกใบหรือไม่ ซึ่งจะใช้เวลานาน snd จะเป็นไปได้สำหรับการหาคู่เท่านั้นเนื่องจากชุดไม่เกี่ยวข้อง ไพ่แต่ละสายประกอบด้วยตัวเลข / a / j / q / k และชุดสูท(char)3(ที่ทำสัญลักษณ์โพดำเล็กน้อย) ไม่มีใครมีคำแนะนำสูตรหรือลิงก์ที่ฉันสามารถใช้เพื่อช่วยสร้างระบบการวิเคราะห์ด้วยมือได้หรือไม่? ไม่ต้องกังวลเกี่ยวกับการจัดอันดับมือซึ่งกันและกันนั่นคือปลากาต้มน้ำที่แตกต่างกัน
19 c++  card-game  poker 

4
เหตุใดอุตสาหกรรมจึงเปลี่ยนจาก C เป็น C ++ [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ก่อนอื่นฉันต้องการคำตอบที่แท้จริงฉันพยายามหาข้อมูลเพิ่มเติมจากแหล่งข้อมูลและบทความต่าง ๆ เสมอและเมื่อฉันอ่านสิ่งต่าง ๆ เช่นC ++ ช้าเพราะมีฟังก์ชั่นเสมือนจริงและเพราะC นี้ดีกว่าฉันจริงๆ ไม่รู้จะพูดอะไรและคิดว่าเป็นมนุษย์ด้วยสมอง ดังนั้นโปรดหลีกเลี่ยงระดับนี้ในคำตอบ / s ของคุณ คำถามของฉันเกี่ยวกับการเปลี่ยนเป็น C ++ ขนาดใหญ่ที่เสร็จสมบูรณ์ไม่มากก็น้อยเมื่อใช้ Doom 3 สิ่งที่น่าสนใจสำหรับฉันก็คือว่าก่อนที่จะก้าวนี้ส่วนใหญ่ของเกมเครื่องมือและเกมของตัวเองถูกเขียนใน C เช่นเดียวกับที่มันเป็นมาตั้งแต่ยุคยวบ เป็นที่น่าสนใจที่จะทราบว่าซอฟต์แวร์ ID ตัดสินใจที่จะเขียนรหัสฐานใหม่สำหรับ IdTech 4 ใน C ++ ซึ่งเป็นงานที่มีจำนวนมหาศาลซึ่งโดยสุจริตฉันไม่สามารถเข้าใจได้หากไม่มีเหตุผลที่ดี ฉันมุ่งเน้นไปที่ Doom 3 เพราะฉันสนใจในโลกของ OpenGL เป็นส่วนใหญ่และในการเดินทางของฉันฉันพยายามจดจ่อกับหัวข้อนี้ดังนั้นฉันจึงอ่านมากเกี่ยวกับเรื่องนี้ แต่ฉันคิดว่าคำถามเช่นนั้นสามารถทำให้เป็น API ได้ - ปราศจากปัญหามากเกินไป ทำไมในช่วงเวลาหนึ่งอุตสาหกรรมจึงเปลี่ยนมาใช้ …
19 c++  c 

4
Opcodes ใดเร็วกว่าในระดับ CPU [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Game Exchange Stack Exchange ปิดให้บริการใน3 ปีที่ผ่านมา ในทุกภาษาการเขียนโปรแกรมมีชุดของรหัสที่แนะนำให้คนอื่น ฉันพยายามที่จะแสดงรายการไว้ที่นี่ตามลำดับความเร็ว bitwise การบวก / การลบจำนวนเต็ม การคูณ / การหารจำนวนเต็ม การเปรียบเทียบ การควบคุมการไหล การเพิ่ม / ลบลอย การคูณ / หารลอย ในกรณีที่คุณต้องการรหัสประสิทธิภาพสูง C ++ สามารถปรับให้เหมาะกับมือในการประกอบใช้คำสั่ง SIMD หรือการควบคุมการไหลที่มีประสิทธิภาพมากขึ้นประเภทข้อมูล ฯลฯ ดังนั้นฉันจึงพยายามที่จะเข้าใจว่าประเภทข้อมูล (int32 / float32 / float64) หรือ การดำเนินงานที่ใช้ ( *, +, &) ส่งผลกระทบต่อผลการดำเนินงานในระดับซีพียู CPU จะช้าลงกว่าการเพิ่มหรือไม่ …

7
คุณมีความสำคัญต่อความปลอดภัยของข้อยกเว้นในรหัส C ++ ของคุณหรือไม่
ทุกครั้งที่ฉันพิจารณาที่จะสร้างรหัสของฉันอย่างยิ่งยกเว้นที่ปลอดภัยฉันจะไม่ทำเพราะมันจะใช้เวลามาก ลองพิจารณาตัวอย่างข้อมูลที่ค่อนข้างง่าย: Level::Entity* entity = new Level::Entity(); entity->id = GetNextId(); entity->AddComponent(new Component::Position(x, y)); entity->AddComponent(new Component::Movement()); entity->AddComponent(new Component::Render()); allEntities.push_back(entity); // std::vector entityById[entity->id] = entity; // std::map return entity; ในการใช้การรับประกันข้อยกเว้นพื้นฐานฉันสามารถใช้ตัวชี้ที่กำหนดขอบเขตบนการnewโทร วิธีนี้จะป้องกันการรั่วไหลของหน่วยความจำหากมีการเรียกใด ๆ ที่จะทำให้เกิดข้อยกเว้น อย่างไรก็ตามสมมติว่าฉันต้องการใช้การรับประกันข้อยกเว้นที่รัดกุม อย่างน้อยฉันจะต้องใช้ตัวชี้ที่ใช้ร่วมกันสำหรับบรรจุของฉัน (ฉันไม่ได้ใช้ Boost) nothrow Entity::Swapสำหรับการเพิ่มส่วนประกอบอะตอมและการจัดเรียงบางส่วนของสำนวนสำหรับอะตอมเพิ่มทั้งและVector Mapสิ่งเหล่านี้ไม่เพียงใช้เวลานานในการติดตั้ง แต่ยังมีราคาแพงเนื่องจากต้องใช้การคัดลอกมากกว่าโซลูชันที่ไม่ปลอดภัยยกเว้น ในที่สุดฉันรู้สึกเหมือนว่าเวลาที่ใช้ในการทำทั้งหมดนั้นจะไม่ถูกต้องเพียงเพื่อให้CreateEntityฟังก์ชั่นที่เรียบง่ายนั้นปลอดภัยอย่างยิ่งยกเว้น ฉันอาจต้องการให้เกมแสดงข้อผิดพลาดและปิดที่จุดนั้นต่อไป คุณใช้เวลานานแค่ไหนในโครงการเกมของคุณเอง? โดยทั่วไปเป็นที่ยอมรับได้หรือไม่ในการเขียนรหัสที่ไม่ปลอดภัยสำหรับโปรแกรมที่อาจผิดพลาดเมื่อมีข้อยกเว้น

3
อัปเกรดเวอร์ชัน OpenGL บน Windows หรือไม่
ฉันจะอัปเดตเวอร์ชันของ OpenGL บน Windows เพื่อให้ฉันสามารถใช้สิ่งใดที่ใหม่กว่าไฟล์ส่วนหัวเวอร์ชัน 1.1 ที่รวมอยู่ใน Platform SDK ได้อย่างไร แม้แต่เวอร์ชั่น 7.0A ของ SDK สำหรับ Windows 7 จะมีเพียง GL.h และ GLU.h สำหรับ OpenGL เวอร์ชัน 1.1 เท่านั้น ฉันได้ติดตั้งไดรเวอร์ NVidia สำหรับบอร์ดของฉันที่รองรับ OpenGL 4.1 แล้ว แต่ฉันไม่เห็นไฟล์ส่วนหัวที่รวมอยู่ในแพ็คเกจนี้
19 c++  opengl 

12
ทฤษฎี 3 มิติก่อนกราฟิค API? [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นไปตามหัวข้อสำหรับ Game Exchange Stack Exchange ปิดให้บริการใน5 ปีที่ผ่านมา ฉันเป็นวิศวกรซอฟต์แวร์และฉันหวังว่าจะย้ายอาชีพของฉันไปสู่การพัฒนาเกม ตอนนี้ฉันกำลังอ่านหนังสือ 2 มิติโดยใช้ C ++ / DirectX เมื่อฉันเข้าสู่ 3D ฉันรู้ว่าฉันต้องการทำอย่างถูกต้อง ตัวอย่างเช่นฉันไม่รู้อะไรเลยเกี่ยวกับพื้นที่ 3 มิติ ดังนั้นถ้าฉันเรียนรู้ API เพียงอย่างเดียวฉันอาจจะรู้ แต่ฉันไม่รู้ว่าฉันจะสามารถพัฒนาโลกแบบมินิ 3 มิติได้หรือไม่ ฉันจะไม่เรียกตัวเองว่าประสบความสำเร็จเพียงแค่มีลังหมุนที่มีตัวห่อล่าสุด ฯลฯ ทักษะคณิตศาสตร์ของฉันขึ้นอยู่กับพีชคณิตเชิงเส้น / เชิงเส้นและยังอยู่ในวิทยาลัย ฉันรู้ว่าคณิตศาสตร์กำลังจะมา ฉันควรอ่านหนังสือทฤษฎีสามมิติก่อนที่จะหยิบมาใช้ใน OpenGL / Direct3D หรือคำแนะนำอื่น ๆ หรือไม่? ฉันเพิ่งรู้ว่า API จะไม่สอนการพัฒนาเกม 3 มิติและไม่ต้องการที่จะสูญเสียในภายหลัง ฉันชอบหนังสือมากดังนั้นก็ดีถ้ามีคำแนะนำอยู่ด้วย …
19 graphics  c++  opengl  directx 

7
ทำไมความละเอียดของจำนวนจุดลอยตัวจึงลดลงมากกว่าเดิม?
ฉาก OpenGL ของฉันมีวัตถุที่อยู่ในตำแหน่งที่ห่างไกลจากจุดกำเนิด เมื่อฉันดูวัตถุเหล่านี้และแพน / หมุน / ซูมกล้องรอบ ๆ วัตถุพวกเขาจะกระวนกระวายใจ นั่นคือจุดยอดที่ประกอบไปด้วยวัตถุดูเหมือนจะหมุนไปรอบ ๆ ตารางคะแนนสามมิติในจินตนาการ ฉันได้อ่านสิ่งนี้เป็นปัญหาที่พบบ่อยเนื่องจากจำนวนข้อมูลที่สามารถจัดเก็บโดยใช้ความแม่นยำจุดลอยตัว (ซึ่ง OpenGL และทุกอย่างอื่นใช้) ฉันไม่เข้าใจว่าทำไมสิ่งนี้ถึงเกิดขึ้น เมื่อค้นหาวิธีแก้ปัญหาฉันเจอปัญหา 'ต้นกำเนิดแบบลอยตัว' ที่เรียบง่ายมากและดูเหมือนว่าจะใช้งานได้ ฉันแค่แปลงทุกอย่างเพื่อให้วัตถุของฉันอยู่ในตำแหน่งเดียวกัน แต่สิ่งที่กล้องของฉันดูอยู่ใกล้กับจุดกำเนิด ฉันพบคำอธิบายที่นี่: http://floatingorigin.com/แต่ฉันทำตามไม่ได้ ดังนั้น ... ใครบางคนสามารถอธิบายได้ว่าทำไมการวางฉากของฉันให้ห่างไกลมาก (พูดถึง 10 ล้านหน่วย) จากจุดกำเนิดทำให้เกิดพฤติกรรมที่ผิดปกติที่ฉันสังเกตเห็น? และทำไมการย้ายไปอยู่ใกล้กับจุดเริ่มต้นช่วยแก้ปัญหา
19 c++  opengl 

2
การจัดสรรและเพิ่มหน่วยความจำขนาดใหญ่เมื่อเริ่มต้นใช้งาน“ ล้างหน่วยความจำหรือไม่”
หนังสือเกมการเข้ารหัสเสร็จสมบูรณ์ฉบับที่สี่บทที่ 5 (การเริ่มต้นเกมและการปิดระบบ ) ส่วนการตรวจสอบหน่วยความจำมีตัวอย่างโค้ดที่น่าสนใจนี้: bool CheckMemory(const DWORDLONG physicalRAMNeeded, const DWORDLONG virtualRAMNeeded) { MEMORYSTATUSEX status; GlobalMemoryStatusEx(&status); if (status.ullTotalPhys < physicalRAMNeeded) { // you don’t have enough physical memory. Tell the player to go get a // real computer and give this one to his mother. GCC_ERROR("CheckMemory Failure: Not enough physical …
18 c++  memory 

3
คุณเตรียมตัวอย่างไรสำหรับเงื่อนไขหน่วยความจำไม่เพียงพอ?
นี้จะเป็นเรื่องง่ายสำหรับเกมที่มีขอบเขตกำหนดไว้อย่างดี แต่คำถามคือเกี่ยวกับเกม sandbox ที่ที่ผู้เล่นจะได้รับอนุญาตให้สร้างและสร้างอะไร เทคนิคที่เป็นไปได้: ใช้พูลหน่วยความจำที่มีขีด จำกัด สูงสุด ลบวัตถุที่ไม่ต้องการเป็นระยะ ๆ จัดสรรจำนวนหน่วยความจำเพิ่มเติมที่จุดเริ่มต้นเพื่อให้สามารถเป็นอิสระในภายหลังเป็นกลไกการกู้คืน ฉันจะบอกว่าประมาณ 2-4 MBs สิ่งนี้มีแนวโน้มที่จะเกิดขึ้นในแพลตฟอร์มมือถือ / คอนโซลซึ่งหน่วยความจำมักจะถูก จำกัด ไม่เหมือนกับพีซีขนาด 16 GB ของคุณ ฉันสมมติว่าคุณสามารถควบคุมการจัดสรร / การจัดสรรคืนหน่วยความจำได้อย่างสมบูรณ์และไม่มีการรวบรวมขยะ นั่นเป็นเหตุผลที่ฉันกำลังติดแท็กสิ่งนี้เป็น C ++ โปรดทราบว่าฉันไม่ได้พูดถึงรายการ C ++ ที่มีประสิทธิภาพ 7 "เตรียมพร้อมสำหรับเงื่อนไขหน่วยความจำไม่เพียงพอ"แม้ว่าจะเกี่ยวข้องกัน แต่ฉันต้องการดูคำตอบเพิ่มเติมเกี่ยวกับการพัฒนาเกมซึ่งคุณมักจะควบคุมสิ่งที่มากกว่า สิ่งที่เกิดขึ้น เพื่อสรุปคำถามคุณจะเตรียมตัวอย่างไรสำหรับเงื่อนไขหน่วยความจำไม่เพียงพอสำหรับเกมแซนด์บ็อกซ์เมื่อคุณกำหนดเป้าหมายแพลตฟอร์มด้วยคอนโซลหน่วยความจำ / อุปกรณ์เคลื่อนที่ จำกัด

2
การใช้ C ++ 11 สำหรับการพัฒนา Game Engine ข้ามแพลตฟอร์ม
หมายเหตุ:นี่ไม่ใช่คำถาม 'ให้ความเห็นของคุณ' เกี่ยวกับ C ++ 03 และ C ++ 11 เอ็นจิ้นเกมของเราเขียนด้วย C ++ 03 ออกแบบมาเพื่อรวบรวมบน Windows, OSX และ iOS การสนับสนุน Linux มีการวางแผนสำหรับ (มาก) ในอนาคตอันใกล้ ประสบการณ์ของเรามี จำกัด เมื่อพูดถึงคอนโซลซึ่งเป็นสาเหตุที่ฉันถามคำถามนี้ ขณะนี้เรากำลังถกเถียงกันว่าการเปลี่ยนไปใช้ C ++ 11 และการใช้คุณสมบัติที่ไม่เข้ากันได้ของมาตรฐาน C ++ 11 อาจมีปัญหาในอนาคตอันใกล้นี้หรือไม่เมื่อเราจำเป็นต้องย้ายเครื่องยนต์ของเราไปยังคอนโซลคอนโซลปัจจุบัน คอมไพเลอร์ที่สนับสนุนโดยคอนโซลบางตัวยังไม่สนับสนุน C ++ 11 ใช่ไหมเราไม่รู้ ... ) ดังนั้นนักพัฒนาเกมที่มีประสบการณ์ในหลายแพลตฟอร์มและคอนโซลคุณคิดว่าเราควรติดกับ C ++ 03 จนกว่าคอนโซลรุ่นใหม่จะมาถึงและทุกคนส่วนใหญ่เปลี่ยนไปใช้มาตรฐาน C ++ …

6
Vector3 ควรสืบทอดจาก Vector2 หรือไม่
ฉันกำลังสร้างคู่ของชั้นเรียนVector2(X & Y) และVector3(X, Y และ Z) แต่ผมไม่ทราบว่าจะทำให้การVector3สืบทอดมาจากVector2หรือไม่ว่าการดำเนินการอีกครั้งตัวแปรสมาชิกm_xและm_yอีกครั้ง? ข้อดีและข้อเสียของแต่ละด้านคืออะไร แก้ไข:ฉันใช้ C ++ (VS2010)
18 c++  architecture 

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