開發影片遊戲時要考慮什麼

要製作自己的電玩遊戲,您需要一個有趣的遊戲創意,這是開始製作遊戲時需要克服的一大障礙。假設您有一個遊戲創意並希望將其變為現實。為此,您需要編寫程式碼以使一切正常執行,美術和聲音設計使一切都有吸引力,並且您需要盡一切努力確保遊戲執行順利並且為用戶帶來愉快的體驗。

讓遊戲順利執行的最後一個難題是許多遊戲開發人員的首要任務,選擇正確的語言來編碼遊戲通常與這個問題有關。 C++「以其速度、靈活性以及直接與硬體通訊的能力而聞名」。 [1]在深入了解 C++ 工作效率如此之高的原因之前,讓我們先探討一下用於遊戲開發的其他幾種語言,以及它們在哪些方面可能比 C++ 有優勢。

C++ 與其他遊戲開發語言的比較

在討論 C#(Sharp) 和 Java 之前,我想先重點介紹一下遊戲開發中出於不同原因使用的其他幾種語言。

JavaScript、Python 和 Lua

JavaScript 可以在網頁、伺服器甚至 Raspberry Pi 上找到,這已成為製作便攜式遊戲系統的流行方式。一些遊戲引擎支援 JavaScript 程式碼,包括「Impact.js、LÖVE 和 Crafty.js」。 [2]在學習新的程式語言時,Python 和 Lua 更容易上手,並且兩者都得到許多開源遊戲引擎的支援。這三種語言主要用於 2D 遊戲。它們也可以用於 3D 遊戲,但建議使用 Python 來實現 3D,而不是其他兩個,因為 JavaScript 的支援有限,而 Lua 不支援。在以後的文章中,我計劃花更多時間研究遊戲領域的這些語言。

C#(銳利)

C# 得到了許多遊戲引擎的支持,其中包括 Unity 和 MonoGame。 C# 與 C++ 類似,據報導「使用 Visual Studio 和 VS Code 作為整合開發環境更簡單且更容易設定」。 [2] C++ 和 C# 之間也存在許多差異,在決定要使用的語言時應考慮這些差異。我們將強調幾個差異[3]

記憶體管理

在C++中,程式設計師手動管理內存,而C#有自動垃圾收集器。 C# 更方便地完成此任務,但 C++ 使程式設計師可以更好地控制記憶體的使用方式,這可以導致優化程式碼以更快地執行以獲得更流暢的效能。根據專案的大小,如果專案很小,則可能不需要這種對記憶體的控制。

指針

指標是一種引用記憶體中地址的方式,我將在本文後面詳細介紹。在C++中,指標可以在程式的任何地方使用,而C#只能在不安全模式下使用指標。 「由於其固有的複雜語法和潛在的記憶體相關錯誤(例如堆疊溢位、存取和覆蓋系統記憶體),不安全程式碼可能會產生穩定性和安全性問題。” [4]這意味著在 C# 中使用不安全模式時需要額外特別小心,這意味著在為專案編寫程式碼時可能需要避免使用指標。

爪哇

Java 是一種類似於 C++ 的物件導向程式語言,「Java 虛擬機器 (JVM) 用於執行字節碼,這使得它與幾乎任何平台相容」。 [2] Java 和 C++ 的差異與 C# 類似,讓我們探討原因[5]

記憶體管理

在Java中,記憶體管理是由Java虛擬機器(JVM)控制的,而C++是手動控制的。

平台依賴性

兩種語言都可以在任何平台上運作。對於 Java,它使用 Java 虛擬機器 (JVM) 來完成此任務。對於C++,它需要正確的編譯器來為正確的平台編譯程式碼。

指針

Java 可以使用指針,但對它們的支援有限。 C++ 完全擁抱指針,以至於值也可以透過引用呼叫,而 Java 只能透過值呼叫指針。

選擇 C++ 進行電玩開發

在開發電玩遊戲時,資源回收是很自然的事。為玩家引入需要克服的障礙,並在稍後返回相同或類似的障礙,為玩家創造一種進步感,向他們展示他們在整個體驗過程中如何成長,或者他們如何以不同的方式看待障礙來克服它。這種結構聽起來像是程式設計中的類,是一種在應用程式中多次重複使用程式碼的方法。選擇物件導向的程式語言對於更順利的開發週期至關重要。幸運的是,我提到的語言都支援基於類別的程式設計技術。讓我們看看為什麼遊戲專案經常選擇 C++。

在效能方面,在建立可擴展的遊戲時,使用 C++ 設計的視訊遊戲比其他語言執行得更快、更流暢。 C++ 透過讓程式設計師直接控制記憶體管理來實現這一點。其他語言使用垃圾收集器自動處理這些任務。 “了解指針、內存分配和內存洩漏可以幫助您的遊戲順利執行,而不會浪費寶貴的資源。” [1]我們將透過一些編碼範例來分解這三件事。

指針

指標是將記憶體位址儲存為其值的變數。由於指標儲存位址,因此我們可以進行引用呼叫。指標可以「建立和操作動態資料結構」 [6] ,並可用於迭代這些資料結構。

要使用指針,您需要定義一個與您將引用的資料類型相符的指標變數。資料類型必須與指標相關聯,以便它「知道資料儲存在多少位元組中」。 [6]對要儲存在先前建立的指標上的變數位址使用一元運算子 & 。若要存取儲存在位址處的值,請在指標上使用一元運算子 *。

#include <bits/stdc++.h>
using namespace std;

void pointers() {
    int var = 20;

    // Declare pointer variable
    // Note that the data type of ptr and var must be the same
    int* ptr;

    // Declare pointer of a pointer variable
    int** ptr2;

    // Assign the address of a variable to a pointer
    ptr = &var;

    // Assign the address of a pointer to another pointer
    ptr2 = &ptr;

    // ptr holds the address of var
    cout << "Value at ptr = " << ptr << endl;

    // var holds the value of 20
    cout << "Value at var = " << var << endl;

    // * dereferences ptr to give the value of 20 
      // located at the address assigned to ptr
    cout << "Value at *ptr = " << *ptr << endl;

    // ptr2 holds the address of ptr
    // Even pointers have addresses of their own
    cout << "Value at ptr2 = " << ptr2 << endl;

    // Dereferencing ptr2 once reveals that 
      // ptr2 references the same address as ptr
    cout << "Value at *ptr2 = " << *ptr2 << endl;

    // Dereferencing ptr2 twice reveals 20, 
      // the value you receive when dereferencing ptr once
    cout << "Value at **ptr2 = " << **ptr2 << endl;
}

int main() {
    pointers();
    /*
     * Value at ptr = 0x6caebffc54
     * Value at var = 20
     * Value at *ptr = 20
     * Value at ptr2 = 0x6caebffc48
     * Value at *ptr2 = 0x6caebffc54
     * Value at **ptr2 = 20
     */
    return 0;
}

由於我們將地址儲存為其他資料類型,因此我們模擬透過引用呼叫。我們可以修改函數中的任何資料類型,並稍後在程式碼中重複使用更新後的資料。

動態記憶體分配

如果我們期望某個最大大小的輸入,我們可以準備我們的程序,留出足夠的記憶體來匹配最壞的情況。隨著專案規模不斷擴大,這可能會帶來問題。如果我們知道需要多少內存後就可以選擇需要多少內存,該怎麼辦?這將防止不必要的記憶體使用,並使我們的程式碼更有效地執行。這是動態記憶體分配背後的關鍵原則:只留出足夠的記憶體空間來完成手邊的任務,然後立即釋放空間。

查看以下新增註解的程式碼[7],以協助您了解我們如何完成動態記憶體分配:

#include <iostream>
#include <new>
using namespace std;

int main() {
    // i => Used for looping
    int i;
    // n => Used for capturing the input for the first question
    int n;
    // ptr => Pointer used to reference memory that is allocated
    int* ptr;

    // n is assigned the input from the user
    cout << "How many numbers would you like to type? ";
    cin >> n;

    // new => Allocates space match the input for n
    ptr = new (nothrow) int[n];

    // Check to make sure ptr points to a valid object
    if (ptr == nullptr) {
        cout << "Memory allocation error!" << endl;
    }

    else {
        for (i=0; i<n; i++) {
            // Ask for a number n times
            cout << "Enter number: ";

            // Store the number entered in memory
            cin >> ptr[i];
        }

        // Reveal to the user the choices they made
        cout << "You have entered: ";

        for (i=0; i<n; i++) {
            // Pull each number from the allocated memory
            cout << ptr[i] << ", ";
        }

        // After we finish with the task,
            // we free up the space taken using delete[]
        delete[] ptr;
    }
    return 0;
}

輸出:

輸出顯示提示選擇使用者要輸入的數字數量。使用者選擇 6。 然後鍵入 4、8、15、16、23、42。

在 C++ 中編碼時,delete 關鍵字的使用至關重要。由於程式設計師需要手動清除內存,因此養成在使用完內存後立即清除內存的好習慣將減少挫敗感和錯誤,並避免可怕的內存洩漏。

內存洩漏

在 C++ 中,沒有自動垃圾回收,這意味著程式設計師在程式的整個生命週期中動態分配的任何內存在不再需要時都需要在程式設計師使用後手動釋放。如果程式設計師在使用後忘記釋放該內存,則該內存將在程式生存期間佔用該空間,並且其他進程將無法使用該空間。通常,一個函數可能需要被呼叫多次,如果每次呼叫都分配更多記憶體而不刪除它,那麼大量未使用的記憶體將佔用空間。這種不必要的記憶體使用量的累積稱為記憶體洩漏。這些會大大減慢程式的速度,但它們是更快執行程式碼的可以避免的代價。 [8]

關於 C++ 用於遊戲開發的最終想法

完全控制記憶體使用是一個巨大的優勢,或者有些人可能稱之為「優勢」。我們建立指標來儲存新建立的資料結構的位址。當儲存的記憶體使用完畢後,我們會從記憶體中刪除資料,以便稍後在程式中釋放空間,以防止記憶體洩漏。 C++ 的物件導向程式語言方面也顯示了重用程式碼的有用性。

C++ 並不是遊戲開發語言的唯一選擇。 Java具有可移植性,可以跨多個平台使用,但在製作3D遊戲方面受到限制。 C#(Sharp) 比 C++ 簡單,但除非您使用不安全模式,否則它幾乎不支援指針,除非您在該模式下編程時非常小心,否則不建議這樣做。

由於程式設計師可以直接控制C++中的內存,因此可以透過指標和動態記憶體分配來實現快速的速度。設計大型電玩遊戲時,速度是一個重要的考慮因素,因為無響應或響應緩慢的遊戲體驗可能會讓用戶不滿意。

快樂編碼,

泰勒·邁耶

來源

資料來源:

[1] https://www.geeksforgeeks.org/cpp-for-game-development/

[2] https://www.orientsoftware.com/blog/gaming-programming-language/

[3] https://www.geeksforgeeks.org/c-vs-c-sharp/

[4] https://www.c-sharpcorner.com/UploadFile/f0b2ed/understanding-unsafe-code-in-C-Sharp/

[5] https://www.geeksforgeeks.org/cpp-vs-java/

[6] https://www.geeksforgeeks.org/cpp-pointers/

[7] https://cplusplus.com/doc/tutorial/dynamic/

[8] https://www.geeksforgeeks.org/memory-leak-in-c-and-how-to-avoid-it/


原文出處:https://dev.to/tymey/why-are-people-choosing-c-for-game-development-29fp


共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝8   💬8   ❤️13
402
🥈
我愛JS
📝1   💬6   ❤️4
88
🥉
酷豪
📝1   ❤️1
50
#4
AppleLily
📝1   💬4   ❤️1
38
#5
💬3  
10
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次