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

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

6
มันไม่เป็นมืออาชีพหรือไม่ที่จะปล่อยให้ทรัพยากรในเกมเปิดกว้าง?
ฉันยังคงมีปัญหาในการจัดเก็บทรัพยากรของฉันหลังจากผ่าน API ที่ซับซ้อนและโดยทั่วไปเพียงแค่ไฟล์ซิปที่ทำให้สมองของฉันหมดฉันคิดว่าฉันสามารถบรรจุเกมด้วยทรัพยากรที่มองเห็นได้ด้วยตามนุษย์ในโฟลเดอร์ง่าย ๆ นั่นจะไม่เป็นมืออาชีพหรือไม่? โดยส่วนตัวฉันไม่เคยเห็นเกมทำแบบนั้นโดยทั่วไปจะหมายความว่าผู้เล่นสามารถแก้ไขสิ่งที่เขาต้องการในเกมเช่นไปที่ map1.txt และเพิ่ม X เพื่อสร้างกำแพงหรือเปลี่ยนผู้เล่นสไปรต์ กับม้าใน MS PAINT
43 c++  assets 

1
ทำไมการเรียกฟังก์ชั่น OpenGL ทั้งหมดนำหน้าด้วย“ q” ในซอร์สโค้ด Doom 3
ทำไมการโทรทุก OpenGL นำหน้าด้วย "q" ในรหัสต้นฉบับ Doom 3 พวกเขามีฟังก์ชั่นที่กำหนดเองหรือห้องสมุดที่แตกต่างกันและถ้าเป็นเช่นนั้นทำไมใช้ที่มากกว่า OpenGL? การค้นหาของ Google ใด ๆ เกิดขึ้นกับโมดูล Qt OpenGL ซึ่งฉันคิดว่าไม่มีส่วนเกี่ยวข้องกับมัน
42 opengl  c++ 

7
ความแตกต่างของประสิทธิภาพระหว่างจำนวนเต็มที่ไม่ได้ลงนามและที่เซ็นชื่อมีอะไรบ้าง [ปิด]
ฉันตระหนักถึงประสิทธิภาพในการทำงานเมื่อผสม ints ที่เซ็นชื่อกับลอย มันแย่กว่าไหมถ้าจะผสม ints ที่ไม่ได้ลงนามกับ Floats? มีการเข้าชมใด ๆ เมื่อผสมการเซ็นชื่อ / ไม่ได้ลงชื่อโดยไม่มีการลอยหรือไม่? ขนาดแตกต่างกัน (u32, u16, u8, i32, i16, i8) มีผลกระทบต่อประสิทธิภาพหรือไม่? บนแพลตฟอร์มใด
42 c++  performance 

5
นักแสดงในเกมควรมีความรับผิดชอบในการวาดภาพตนเองหรือไม่?
ฉันยังใหม่ต่อการพัฒนาเกม แต่ไม่ได้เขียนโปรแกรม ฉัน (อีกครั้ง) เล่นกับเกมประเภท Pong โดยใช้canvasองค์ประกอบของ JavaScript ฉันสร้างPaddleวัตถุที่มีคุณสมบัติดังต่อไปนี้ ... width height x y colour ฉันยังมีPongวัตถุที่มีคุณสมบัติเช่น ... width height backgroundColour draw(). draw()วิธีการในปัจจุบันคือการรีเซ็ตcanvasและที่เป็นที่คำถามขึ้นมา ควรPaddleวัตถุมีdraw()วิธีการรับผิดชอบสำหรับการวาดภาพหรือควรdraw()ของPongวัตถุต้องรับผิดชอบสำหรับการวาดภาพของนักแสดง (ฉันคิดว่าเป็นคำที่ถูกต้องโปรดแก้ไขฉันหากฉันไม่ถูกต้อง) ฉันคิดว่ามันจะเป็น advantagous สำหรับPaddleการวาดตัวเองที่ผมยกตัวอย่างวัตถุสองและPlayer Enemyถ้ามันไม่ได้อยู่ในPongของdraw()ฉันจะต้องเขียนรหัสที่คล้ายกันสองครั้ง การปฏิบัติที่ดีที่สุดที่นี่คืออะไร? ขอบคุณ

6
เราจะแก้ปัญหาความต้องการหน่วยความจำวิดีโอขนาดใหญ่ในเกม 2D ได้อย่างไร
เราจะแก้ปัญหาความต้องการหน่วยความจำวิดีโอขนาดใหญ่ในเกม 2D ได้อย่างไร เรากำลังพัฒนาเกม 2D (Factorio) ใน allegro C / C ++ และเรากำลังเผชิญปัญหากับการเพิ่มความต้องการหน่วยความจำวิดีโอเมื่อเนื้อหาของเกมเพิ่มขึ้น ขณะนี้เรารวบรวมข้อมูลทั้งหมดเกี่ยวกับรูปภาพที่จะถูกใช้ก่อนทำการครอบตัดรูปภาพเหล่านี้ให้มากที่สุดเท่าที่จะทำได้และจัดระเบียบให้เป็นแผนที่ขนาดใหญ่ให้แน่นที่สุด แผนที่เหล่านี้จะถูกเก็บไว้ในหน่วยความจำวิดีโอขนาดขึ้นอยู่กับข้อ จำกัด ของระบบ ปัจจุบันมักจะมี 2 ภาพสูงสุด 8192x8192 ดังนั้นพวกเขาต้องการหน่วยความจำวิดีโอ 256Mb ถึง 512Mb ระบบนี้ใช้งานได้ดีสำหรับเราเช่นเดียวกับการปรับแต่งที่เหมาะสมและแยกเธรดการแสดงผลและการอัปเดตเราสามารถดึงภาพหลายหมื่นภาพบนหน้าจอใน 60 fps; เรามีวัตถุมากมายบนหน้าจอและการอนุญาตให้ซูมออกขนาดใหญ่เป็นข้อกำหนดที่สำคัญ เนื่องจากเราต้องการเพิ่มมากขึ้นอาจมีปัญหากับข้อกำหนดหน่วยความจำวิดีโอดังนั้นระบบนี้อาจไม่สามารถใช้งานได้ หนึ่งในสิ่งที่เราต้องการลองคือมีแผนที่หนึ่งที่มีรูปภาพที่พบบ่อยที่สุดและที่สองเป็นแคช ภาพจะถูกย้ายไปที่นั่นจากบิตแมปหน่วยความจำตามความต้องการ มีสองปัญหาเกี่ยวกับวิธีการนี้: รูปวาดจากบิตแมปหน่วยความจำไปยังบิตแมปวิดีโอช้าอย่างเจ็บปวดใน allegro มันเป็นไปไม่ได้ที่จะทำงานกับวิดีโอบิตแมปที่นอกเหนือจากเธรดหลักใน allegro ดังนั้นจึงไม่สามารถใช้งานได้จริง ต่อไปนี้เป็นข้อกำหนดเพิ่มเติมบางประการที่เรามี: เกมดังกล่าวจะต้องถูกกำหนดไว้ดังนั้นปัญหาด้านประสิทธิภาพ / เวลาในการโหลดจะไม่สามารถเปลี่ยนแปลงสถานะของเกม เกมดังกล่าวเป็นแบบเรียลไทม์และเร็ว ๆ นี้จะเป็นผู้เล่นหลายคนเช่นกัน เราจำเป็นต้องหลีกเลี่ยงแม้แต่การพูดติดอ่างที่เล็กที่สุดในค่าใช้จ่ายทั้งหมด เกมส่วนใหญ่เป็นโลกที่เปิดกว้างอย่างต่อเนื่อง การทดสอบประกอบด้วยการวาดภาพสไปรต์ 10,000 ชุดเป็นชุดขนาดตั้งแต่ …


7
วิธีหนึ่งสามารถใช้โมดูล C ++ แบบถอดเปลี่ยนได้?
เวลาในการทำซ้ำอย่างรวดเร็วเป็นกุญแจสำคัญในการพัฒนาเกมมากกว่ากราฟิกและเครื่องยนต์ที่มีคุณสมบัติมากมายในความคิดของฉัน ไม่น่าแปลกใจนักพัฒนาขนาดเล็กจำนวนมากเลือกภาษาสคริปต์ วิธี Unity 3D ในการหยุดเกมและแก้ไขเนื้อหาและรหัสจากนั้นดำเนินการต่อและให้การเปลี่ยนแปลงมีผลในทันทีเป็นสิ่งที่ยอดเยี่ยมสำหรับเรื่องนี้ คำถามของฉันคือมีใครใช้ระบบที่คล้ายกันในเครื่องมือเกม C ++? ฉันได้ยินมาว่าเอ็นจิ้นระดับไฮเอนด์บางตัวทำได้ แต่ฉันสนใจที่จะค้นหาว่ามีวิธีในเครื่องยนต์หรือเกมที่ปลูกในบ้านหรือไม่ เห็นได้ชัดว่ามีการแลกเปลี่ยนและฉันไม่สามารถจินตนาการได้ว่าคุณสามารถคอมไพล์โค้ดของคุณใหม่ได้ในขณะที่เกมหยุดชั่วคราวให้โหลดใหม่และทำงานภายใต้ทุกสถานการณ์หรือทุกแพลตฟอร์ม แต่อาจเป็นไปได้สำหรับการโปรแกรม AI และโมดูลตรรกะระดับง่าย ไม่ใช่ว่าฉันต้องการทำในโครงการใด ๆ ในระยะสั้น (หรือระยะยาว) แต่ฉันอยากรู้
39 c++  hot-reload 

1
ฉันจะสร้างอนุภาคที่ตอบสนองต่อผู้เล่นและศัตรูได้อย่างไร
ขณะนี้ฉันกำลังสร้างเกมด้วยเอ็นจิ้นเกมของฉันซึ่งฉันเขียนด้วย C ++ และฉันใช้ directx SDK ล่าสุด เกมดังกล่าวเป็นเกมยิงอวกาศจากบนลงล่าง (ด้วยการหมุนที่น่าสนใจมาก) และฉันกำลังมองหาเนบิวลาเอฟเฟกต์ที่ผู้เล่นจะต้องบินผ่าน ฉันอยากลองทำเล็บที่สัมผัสได้ดีกับอนุภาคหลายร้อยชิ้นที่เคลื่อนตัวออกจากทางของผู้เล่นขณะที่มันแล่นเข้าหาพวกมัน ค่อนข้างคล้ายกับว่าอนุภาคเคลื่อนที่ผ่านวิถีของผู้เล่นใน Geomtry Wars บน XBLA อย่างไร ฉันเป็นโปรแกรมเมอร์ที่มีประสบการณ์เมื่อพูดถึง C ++ อย่างไรก็ตามฉันไม่รู้ว่าจะเริ่มใช้เอฟเฟกต์นี้ได้อย่างไร ใครบ้างมีความคิดเจ๋ง ๆ หรือตัวเลือกการออกแบบที่ฉันอาจต้องการดู? อย่าลังเลที่จะตอบระดับความลึกที่คุณต้องการ
38 c++  directx  particles 

3
เมื่อหลาย ๆ คลาสจำเป็นต้องเข้าถึงข้อมูลเดียวกันข้อมูลจะถูกประกาศที่ไหน?
ฉันมีเกมป้องกันหอคอยพื้นฐาน 2 มิติใน C ++ แต่ละแผนที่เป็นคลาสที่แยกต่างหากซึ่งสืบทอดมาจาก GameState แผนที่จะมอบหมายตรรกะและรหัสการวาดภาพให้กับแต่ละวัตถุในเกมและตั้งค่าข้อมูลเช่นเส้นทางแผนที่ ในโค้ดหลอกส่วนลอจิกอาจมีลักษณะดังนี้: update(): for each creep in creeps: creep.update() for each tower in towers: tower.update() for each missile in missiles: missile.update() วัตถุ (ครีพหอคอยและขีปนาวุธ) ถูกเก็บไว้ในพอยน์เตอร์พอยน์เตอร์ หอคอยต้องมีการเข้าถึง vector-of-creeps และ vector-of-missiles เพื่อสร้างขีปนาวุธใหม่และระบุเป้าหมาย คำถามคือ: ฉันจะประกาศเวกเตอร์ได้ที่ไหน พวกเขาควรเป็นสมาชิกของคลาส Map หรือไม่และส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชัน tower.update ()? หรือประกาศทั่วโลก? หรือมีวิธีแก้ไขปัญหาอื่น ๆ ที่ฉันขาดไปทั้งหมดหรือไม่ เมื่อหลาย ๆ คลาสจำเป็นต้องเข้าถึงข้อมูลเดียวกันข้อมูลจะถูกประกาศที่ไหน?

4
ระบบส่วนประกอบ / ส่วนประกอบใน C ++ ฉันจะค้นหาชนิดและสร้างส่วนประกอบได้อย่างไร
ฉันกำลังทำงานกับระบบส่วนประกอบเอนทิตีใน C ++ ที่ฉันหวังว่าจะเป็นไปตามสไตล์ของอาร์ทิมิส (http://piemaster.net/2011/07/entity-component-artemis/) ในส่วนประกอบนั้นส่วนใหญ่เป็นถุงข้อมูลและเป็น ระบบที่มีตรรกะ ฉันหวังว่าจะใช้ประโยชน์จาก data-centess-ness ของวิธีการนี้และสร้างเครื่องมือเนื้อหาที่ดี อย่างไรก็ตามหนึ่งโคกที่ฉันเจอคือวิธีการใช้สตริงตัวระบุหรือ GUID จากไฟล์ข้อมูลและใช้เพื่อสร้างส่วนประกอบสำหรับ Entity เห็นได้ชัดว่าฉันสามารถมีฟังก์ชั่นการแยกวิเคราะห์ขนาดใหญ่ได้หนึ่งรายการ: Component* ParseComponentType(const std::string &typeName) { if (typeName == "RenderComponent") { return new RenderComponent(); } else if (typeName == "TransformComponent") { return new TransformComponent(); } else { return NULL: } } แต่นั่นน่าเกลียดจริงๆ ฉันตั้งใจจะเพิ่มและแก้ไขส่วนประกอบบ่อยครั้งและหวังว่าจะสร้าง ScriptedComponentComponent บางประเภทเช่นที่คุณสามารถนำส่วนประกอบและระบบมาใช้ใน Lua …

5
ใน 2D ฉันจะหาวัตถุที่ใกล้ที่สุดถึงจุดได้อย่างมีประสิทธิภาพได้อย่างไร
ฉันมีเอ็นจิ้นเกมขนาดใหญ่และฉันต้องการคุณสมบัติในการค้นหาจุดที่ใกล้ที่สุด ฉันสามารถใช้ทฤษฎีบทพีทาโกรัสในการค้นหาแต่ละระยะทางและเลือกหนึ่งขั้นต่ำ แต่นั่นต้องใช้การวนซ้ำทั้งหมด ฉันยังมีระบบการชนกันโดยที่ฉันจะเปลี่ยนวัตถุให้เป็นวัตถุขนาดเล็กบนกริดที่เล็กกว่า (เช่น minimap) และถ้าวัตถุมีอยู่ในกริดสเปซเดียวกันฉันจะตรวจสอบการชนกัน ฉันสามารถทำได้เพียงทำให้ระยะห่างของกริดใหญ่ขึ้นเพื่อตรวจสอบความใกล้ชิด (แทนที่จะตรวจสอบทุก ๆ ออบเจ็กต์) อย่างไรก็ตามมันจะทำการเซ็ตอัพเพิ่มเติมในคลาสฐานของฉัน มันคุ้มหรือไม่ มีบางสิ่งที่มีประสิทธิภาพและแม่นยำฉันสามารถใช้เพื่อตรวจจับวัตถุใดที่อยู่ใกล้ที่สุดโดยอิงจากรายการคะแนนและขนาด
35 c++  2d  algorithm  vector  picking 

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

1
แคชเอนทิตีระบบมีประสิทธิภาพอย่างไร?
เมื่อเร็ว ๆ นี้ฉันได้ทำการอ่านมากมายเกี่ยวกับระบบเอนทิตีเพื่อนำไปใช้ในเอ็นจิ้นเกม C ++ / OpenGL ของฉัน ประโยชน์หลักสองประการที่ฉันได้ยินอย่างต่อเนื่องเกี่ยวกับระบบเอนทิตีคือ การสร้างเอนทิตีแบบใหม่ ๆ ได้ง่ายเนื่องจากไม่ต้องยุ่งเกี่ยวกับลำดับชั้นการสืบทอดที่ซับซ้อนและ ประสิทธิภาพแคชซึ่งฉันมีปัญหาในการทำความเข้าใจ ทฤษฎีนี้เรียบง่ายแน่นอน แต่ละองค์ประกอบจะถูกเก็บไว้อย่างต่อเนื่องในบล็อกของหน่วยความจำดังนั้นระบบที่ใส่ใจเกี่ยวกับองค์ประกอบนั้นสามารถทำซ้ำในรายการทั้งหมดโดยไม่ต้องกระโดดไปรอบ ๆ ในหน่วยความจำและฆ่าแคช ปัญหาคือฉันไม่สามารถคิดถึงสถานการณ์ที่เป็นจริงได้ อันดับแรกให้ดูที่การจัดเก็บส่วนประกอบและวิธีการอ้างอิงซึ่งกันและกัน ระบบจำเป็นต้องทำงานกับส่วนประกอบได้มากกว่าหนึ่งองค์ประกอบนั่นคือทั้งระบบเรนเดอร์และระบบฟิสิกส์จำเป็นต้องเข้าถึงส่วนประกอบที่แปลงสภาพ ฉันได้เห็นการใช้งานที่เป็นไปได้หลายอย่างซึ่งกล่าวถึงเรื่องนี้และไม่มีสิ่งใดที่ทำได้ดี คุณสามารถมีพอยน์เตอร์เก็บส่วนประกอบไปยังส่วนประกอบอื่น ๆ หรือพอยน์เตอร์ไปยังเอนทิตีที่เก็บพอยน์เตอร์ไปยังส่วนประกอบ อย่างไรก็ตามทันทีที่คุณส่งพอยน์เตอร์ไปผสมคุณก็ฆ่าประสิทธิภาพของแคชแล้ว คุณสามารถมั่นใจได้ว่าทุกองค์ประกอบของอาเรย์นั้นมีขนาดใหญ่ 'n' โดยที่ 'n' คือจำนวนเอนทิตีที่มีอยู่ในระบบ สิ่งนี้ทำให้ยากมากในการเพิ่มประเภทส่วนประกอบใหม่ลงในเอ็นจิ้น แต่ยังคงทิ้งประสิทธิภาพของแคชไว้เพราะคุณกำลังกระโดดจากอาร์เรย์หนึ่งไปยังอีกอาร์เรย์หนึ่ง คุณสามารถแทรกเอนทิตี้ของอาร์เรย์แทนการเก็บอาร์เรย์แยกต่างหาก แต่คุณยังคงสูญเสียความจำ ทำให้ราคาแพงอย่างไม่น่าเชื่อในการเพิ่มส่วนประกอบหรือระบบใหม่ แต่ตอนนี้มีประโยชน์เพิ่มเติมของการทำให้ระดับเก่าทั้งหมดของคุณเป็นโมฆะและบันทึกไฟล์ นี่คือทั้งหมดที่สมมติว่าเอนทิตีถูกประมวลผลเชิงเส้นในรายการทุกเฟรมหรือติ๊ก ในความเป็นจริงนี่ไม่ใช่กรณี สมมติว่าคุณใช้เซกเตอร์ / พอร์ทัลเรนเดอร์หรืออ็อคทรีเพื่อทำการคัดแยก คุณอาจเก็บเอนทิตีต่อเนื่องกันภายในเซกเตอร์ / โหนด แต่คุณจะกระโดดไปมาไม่ว่าคุณจะชอบหรือไม่ก็ตาม จากนั้นคุณมีระบบอื่น ๆ ซึ่งอาจต้องการเอนทิตีที่จัดเก็บตามลำดับอื่น AI อาจไม่เป็นไรสำหรับการจัดเก็บรายการใหญ่จนกว่าคุณจะเริ่มทำงานกับ …

3
ลองจับหรือ ifs สำหรับการจัดการข้อผิดพลาดใน C ++
มีการใช้ข้อยกเว้นกันอย่างแพร่หลายในการออกแบบเกมเอ็นจิ้นหรือมันจะดีกว่าถ้าใช้ข้อความล้วน ๆ ? ตัวอย่างเช่นมีข้อยกเว้น: try { m_fpsTextId = m_statistics->createText( "FPS: 0", 16, 20, 20, 1.0f, 1.0f, 1.0f ); m_cpuTextId = m_statistics->createText( "CPU: 0%", 16, 20, 40, 1.0f, 1.0f, 1.0f ); m_frameTimeTextId = m_statistics->createText( "Frame time: 0", 20, 20, 60, 1.0f, 1.0f, 1.0f ); m_mouseCoordTextId = m_statistics->createText( "Mouse: (0, 0)", 20, …

5
คำถามเกี่ยวกับสถาปัตยกรรม / การออกแบบเกม - การสร้างเอนจิ้นที่มีประสิทธิภาพขณะเดียวกันก็หลีกเลี่ยงอินสแตนซ์ระดับโลก (เกม C ++)
ฉันมีคำถามเกี่ยวกับสถาปัตยกรรมเกม: วิธีที่ดีที่สุดในการสื่อสารด้วยส่วนประกอบต่าง ๆ กันคืออะไร? ฉันขอโทษจริง ๆ ถ้าคำถามนี้ถูกถามไปแล้วนับล้านครั้ง แต่ฉันไม่สามารถหาข้อมูลใด ๆ ที่ฉันต้องการได้ ฉันพยายามสร้างเกมตั้งแต่เริ่มต้น (C ++ ถ้าเป็นเรื่องสำคัญ) และได้สังเกตซอฟต์แวร์เกมโอเพ่นซอร์สเพื่อเป็นแรงบันดาลใจ (Super Maryo Chronicles, OpenTTD และอื่น ๆ ) ฉันสังเกตเห็นว่าการออกแบบเกมเหล่านี้จำนวนมากใช้อินสแตนซ์ระดับโลกและ / หรือซิงเกิลตันทั่วสถานที่ (สำหรับสิ่งต่าง ๆ เช่นการเรนเดอร์คิวผู้จัดการเอนทิตีผู้จัดการวิดีโอและอื่น ๆ ) ฉันพยายามหลีกเลี่ยงอินสแตนซ์ระดับโลกและซิงเกิลตันและสร้างเครื่องยนต์ที่มีการเชื่อมโยงอย่างหลวม ๆ เท่าที่จะเป็นไปได้ แต่ฉันตีสิ่งกีดขวางบางอย่าง (ส่วนหนึ่งของแรงจูงใจสำหรับโครงการนี้คือการแก้ไขปัญหานี้ :)) ฉันได้สร้างการออกแบบที่มีGameCoreวัตถุหลักหนึ่งชิ้นที่มีสมาชิกที่คล้ายกับอินสแตนซ์ทั่วโลกที่ฉันเห็นในโครงการอื่น ๆ (เช่นมีตัวจัดการอินพุตผู้จัดการวิดีโอวิดีโอGameStageวัตถุที่ควบคุมเอนทิตีและการเล่นเกมทั้งหมด สำหรับขั้นตอนใดก็ตามที่โหลดอยู่ ฯลฯ ) ปัญหาคือเนื่องจากทุกอย่างรวมอยู่ในGameCoreวัตถุฉันไม่มีวิธีง่าย ๆ สำหรับส่วนประกอบต่าง ๆ ในการสื่อสารซึ่งกันและกัน ยกตัวอย่างเช่นเมื่อมองจาก Super Maryo …
28 c++  architecture 

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