เคล็ดลับใด ๆ สำหรับการสร้างเกมข้ามแพลตฟอร์ม [ปิด]


คำตอบ:


44

ซ่อนอะไรเฉพาะแพลตฟอร์มไว้ข้างหลังเลเยอร์สิ่งที่เป็นนามธรรม

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

// FileSystem.h
class FileSystem {
public:
    FileHandle OpenFile(const char * path);
    // other stuff...
}

// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
    // call windows API...
}

จากนั้นกำหนดค่าการสร้างสำหรับแต่ละแพลตฟอร์มเพื่อสร้างกับไฟล์. cpp ที่เหมาะสม

ทำให้ไพพ์ไลน์เนื้อหาของคุณอ่านในเนื้อหาที่ไม่ขึ้นกับแพลตฟอร์มและเนื้อหาเฉพาะแพล็ตฟอร์มสำหรับแต่ละแพลตฟอร์ม

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

อย่าถือว่ารูปแบบหน่วยความจำหรือ endianness เฉพาะในข้อมูลของคุณ

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

ทดสอบบนแพลตฟอร์มทั้งหมดตลอดเวลา

คุณจะถูกกัดด้วยบั๊กเฉพาะแพล็ตฟอร์ม คุณค่อนข้างจะถูกกัดหรือตอนที่คุณพยายามจะออกไปข้างนอก?


2
ไม่มี#ifdef PLATFORM_WINftw
tenpn

คุณจะไม่มีทางหนีพ้นไปได้ คุณสามารถหวังที่จะย่อขนาดมันให้เล็กที่สุด
มหานคร

8
วิธีที่ดีในการทำเช่นนั้นคือการย้ายรหัสเฉพาะแพลตฟอร์มทั้งหมดไปยังไลบรารีที่แชร์ชุดด้วยอินเทอร์เฟซเดียวกันจากนั้นคุณสามารถ จำกัด # ifdef's เพื่อทำการบูตไลบรารีที่ถูกต้องสำหรับแพลตฟอร์ม
Neel

1
+1 ความคิดเห็นที่ดี โปรดจำไว้ว่าแม้ STL นั้นขึ้นอยู่กับแพลตฟอร์ม (และใช่บางฟังก์ชั่นจะทำสิ่งต่าง ๆ ในคอมไพเลอร์ต่างกัน)
Simon

การเรียกฟังก์ชั่นพิเศษอย่างแน่นอนจะลดประสิทธิภาพหรือไม่ CPU ต้องโหลดหรือย้ายข้อมูลจากการลงทะเบียนหรือแย่กว่านั้นหน่วยความจำที่ยังช้า การโทรของระบบจะไม่เพียงพอหรือไม่
TheBlueCat

10
  • ใช้ api เช่น opengl / sdl ซึ่งจะทำให้คุณมีความยุ่งยากน้อยที่สุดเมื่อไปจากแพลตฟอร์มสู่แพลตฟอร์ม

  • ตรวจสอบให้แน่ใจว่าคุณรู้ว่าแพลตฟอร์มใดที่คุณต้องการให้การสนับสนุน อย่าใช้ OpenGL เพียงเพราะคุณคิดว่าคุณอาจต้องการรองรับหลายแพลตฟอร์มในอนาคต เริ่มตามที่คุณตั้งใจจะทำ

  • รู้ว่ามีข้อ จำกัด ของฮาร์ดแวร์ใดบ้างในแต่ละแพลตฟอร์มที่คุณต้องการสนับสนุน


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

7

พยายามหลีกเลี่ยงการกระจาย#if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endifทั่วรหัส

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

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


4

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

จากประสบการณ์ของฉันความกังวลที่ยิ่งใหญ่ที่สุดคือระบบการสร้างของคุณ หากคุณพัฒนาบน Windows ด้วย Visual Studio รหัสของคุณอาจรวบรวมใน Linux แต่คุณจะมีเวลาที่ลำบากในการสร้างมันขึ้นมาได้อย่างง่ายดาย ดูระบบ build เช่น CMake ที่สามารถใช้คำสั่ง build เดียวกันเพื่อสร้างไฟล์โปรเจ็กต์เฉพาะแพล็ตฟอร์ม (makefiles บน linux, VS Projects บน windows, XCode Projects บน Mac, ฯลฯ )


4

เมื่อมีการเขียนฟังก์ชั่นของคุณสำหรับการออมและการโหลดไฟล์หรือการสื่อสารผ่านเครือข่ายอย่าลืมเกี่ยวกับendianness

แทนที่จะอ่านโครงสร้างขนาดใหญ่ด้วยการเรียกเพียงครั้งเดียวเพื่อ fread / fwrite หรือสิ่งที่ระดับต่ำเช่นนั้นสร้าง ReadByte / WriteByte และ ReadFloat / WriteFloat จากนั้นคุณจะมีสถานที่เปลี่ยนแปลงน้อยลงหากคุณตัดสินใจกำหนดเป้าหมายแพลตฟอร์มอื่นในภายหลัง


+1 * 9000 ฉันเดาว่านี่จะใช้ได้กับโทรศัพท์มือถือในแง่ของสถาปัตยกรรมสมัยใหม่ / ใช้แล้ว (RISC) เท่านั้น แต่ก็ยังสำคัญ
Jonathan Dickinson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.