C++“類吸血鬼幸存者”游戲制作的要點學習

古之學者必有師,對于技術的提升,只靠自己的摸索雖然能得到深刻的經驗,但往往沒有較高的效率。筆者這些天學習了BV1eM4m1S74K“提瓦特幸存者”的C++開發,也是實現了該類型游戲的開發。

今天,就通過經驗總結,親手結束這一小段學習過程!


游戲的基本框架

所有游戲的底層框架都是通過一個主循環來刷新畫布,每個循環中都實現讀取操作、處理數據、繪制畫面這三個步驟。

int?main()?{while?(running) {//動態延時(記錄本次循環開始的時間)DWORD?start_time?=?GetTickCount(); ?//32位無符號整數,長度不隨編譯器變化//讀取操作區域while?(peekmessage(&msg)) {}//處理數據區域cleardevice();//渲染畫面區域FlushBatchDraw();//記錄循環結束時間DWORD?end_time?=?GetTickCount();DWORD?delta_time?=?end_time - start_time;//1秒144次刷新,即幀率為144,一個循環就是一幀if?(delta_time <?1000?/?144) {Sleep(1000?/?144?- delta_time);}}EndBatchDraw();return?0;
}

在這些操作執行完后,加上動態延時從而實現游戲開發中“幀”的概念。這也是游戲引擎設計的基本框架,是不是很有Update()函數的感覺?

關于渲染緩沖區:

為了隱藏渲染或其他處理的過程,BeginBatchDraw函數會讓后續的渲染操作在緩沖區中進行,像一塊閑置的畫布,當調用FlushBatchDraw或EndBatchDraw,即所有操作繪制結束時,直接代替當前畫布,達到無縫銜接的效果。

一些代碼細節:

視頻的創作者在許多地方都體現了C++的編碼細節,比如使用static靜態變量只在第一次調用時創建(后續調用會跳過)復用同一內存;使用TCHAR這一Windows兼容類型適應非英文環境;同樣使用寬字符串適應非英文環境……

頭文件依賴問題

在這次C++開發的過程中,我總是被所謂“出現未定義的變量名”給搞到破防。這是頭文件重復包含導致的。

一個項目各個區域的執行順序是全局變量->靜態全局變量->函數聲明->靜態函數聲明->類定義->靜態類成員定義->命名空間變量->函數定義……頭文件一般用來包含變量與函數的聲明、類的定義等重要信息。

頭文件的循環包含引發編譯錯誤的原因:

編譯器處理?#include?時,會把對應頭文件內容嵌入包含位置。若頭文件循環包含,其可能會陷入無限遞歸嘗試展開頭文件的情形。即便使用包含守衛(?#ifndef?三件套 )或?#pragma?once 規避重復展開,由于頭文件解析時需要對方類型完成自身聲明或定義,循環依賴會導致部分必要的聲明或定義無法在依賴解析階段正確處理。

類似A.h在第一行包含了B.h,同時B.h的第一行包含了A.h, B類使用的A類的定義,但是在頭文件依賴解析A.h時,先展開B.h,但B.h遍歷到A.h會因為包含守衛而跳過,這下B類里A就沒有了定義……

這里有三個編程習慣可以盡量避免頭文件重復包含的問題:

1、使用前向聲明,在使用A的頭文件中聲明聲明一下A類。不需要訪問具體成員時需要。

2、使用包含守衛,即?#ifndef、#define、#endif?連招。

3、使用?#pragma?once,可替代包含守衛,使頭文件在一個編譯單元中只包含一次。

但這些方法只能盡量避免我們遇到的問題,最重要的還是在一開始就規劃好項目的結構。保持頭文件聲明、源文件定義的好習慣,在必要時進行重構,讓文件包含的脈絡清晰,一目了然。

動畫與MCI工具

游戲中使用的動畫分為骨骼動畫(關鍵幀動畫)與序列幀動畫。序列幀動畫就是讓圖片素材以若干個幀為單位進行交替,從而達到動畫播放的效果。

這里使用自定義圖集類來批量載入名稱有規律的圖片素材。

Atlas::Atlas(LPCTSTR path,?int?num) {TCHAR path_file[256];for?(size_t?i =?0; i < num; ++i) {_stprintf_s(path_file, path, i);IMAGE* frame =?new?IMAGE();loadimage(frame, path_file);frame_list.push_back(frame);}
}

這種方法依次用從零開始的自然數代替圖集中的數字部分,實現圖片載入。

MCI工具(媒體控制接口)能夠讓我們以字符串的形式對windows系統發出指令,控制音樂的播放。

但在我的測試中,mp3文件在播放時,會明顯影響游戲的幀率。經過測試與查詢,這與MP3格式文件的特性有關:編解碼邊播放。而MCI解碼的消息可能會打斷Sleep,讓主循環提前醒來,導致幀率變高。

所以在加載音頻文件時,更推薦使用WAV格式:1、MCI 加載 MP3 資源時,底層會創建額外的線程或窗口,并且會向主消息隊列發送消息(比如 MM_MCINOTIFY),EasyX 的 peekmessage 也會處理這些消息。2、WAV 文件是無壓縮格式,處理簡單,不會影響主線程;而 MP3 需要解碼,可能會影響主線程的消息分發和定時精度。3、某些 Windows 環境下,MCI 加載MP3會讓Sleep變得不準確,主循環實際刷新頻率變高。


小結

雖然本篇圖文列出的點很少,但是這次學習經歷切切實實加深了游戲開發的理解。我想這些框架性的東西也可能成為游戲引擎開發的一個開端,而通過C++而不是依賴引擎的開發,更能深入底層邏輯,讓日后對代碼的優化的方向更清晰。

如有補充糾正歡迎留言。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920877.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920877.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920877.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python OpenCV圖像處理與深度學習:Python OpenCV圖像分割入門

圖像分割&#xff1a;從基礎到實踐 學習目標 通過本課程&#xff0c;學員們將了解圖像分割的基本概念&#xff0c;掌握使用OpenCV實現圖像分割的方法&#xff0c;包括基于閾值的分割和基于區域的分割技術。同時&#xff0c;學員將能夠獨立完成簡單的圖像分割任務&#xff0c;并…

MQ使用場景分析

異步解耦?系統間通過消息隊列通信&#xff0c;降低耦合度&#xff08;如訂單系統與庫存系統&#xff09;典型場景&#xff1a;電商下單后異步通知物流系統?流量削峰?應對突發流量&#xff0c;將請求暫存到消息隊列逐步處理典型場景&#xff1a;秒殺活動時緩沖高并發請求?數…

人工智能學習:NLP文本處理的基本方法

一、分詞 1、分詞介紹 概念 分詞就是將連續的字序列按照一定的規范重新組合成詞序列的過程。在英文的行文中,單詞之間是以空格作為自然分界符的,而中文只是字、句和段能通過明顯的分界符來簡單劃界,唯獨詞沒有一個形式上的分界符。分詞過程就是找到這樣分界符的過程…

Vue3 中 Proxy 在組件封裝中的妙用

目錄 Vue3 中 Proxy 在組件封裝中的妙用&#xff1a;讓組件交互更優雅 組件封裝中的常見痛點 Proxy 是什么&#xff1f; Proxy 在組件封裝中的應用 基礎組件結構 使用 Proxy 實現方法透傳 代碼解析 父組件中的使用方式 Proxy 的其他應用場景 1. 權限控制 2. 方法調用…

DevExpress WinForms中文教程:Data Grid - 過濾編輯器

DevExpress WinForms擁有180組件和UI庫&#xff0c;能為Windows Forms平臺創建具有影響力的業務解決方案。DevExpress WinForms能完美構建流暢、美觀且易于使用的應用程序&#xff0c;無論是Office風格的界面&#xff0c;還是分析處理大批量的業務數據&#xff0c;它都能輕松勝…

華為云CCE

華為云CCE&#xff1a;重構云原生應用的全棧引擎 一、云原生時代的"操作系統" 在數字經濟浪潮中&#xff0c;容器化和微服務架構已成為企業數字化轉型的標配。華為云容器引擎&#xff08;CCE&#xff09;作為云原生領域的"操作系統"&#xff0c;通過深度…

STM32——Uinx時間戳+BKP+RTC實時時鐘

目錄 一、Uinx時間戳 1.1Uinx簡介 1.2UTC/GMT 1.3時間戳轉換 1.3.1主要數據類型 1.3.2主要函數 1.3.3C語言時間戳轉換示例 1.3.4時間格式化說明符 1.3.5注意事項 二、BKP 2.1BKP簡介 2.2BKP基本結構 三、RTC 3.1RTC簡介 3.2RTC框圖 3.3RTC基本結構 3.4RTC硬件…

Java設計模式是什么?核心設計原則有哪些?

文章目錄什么是設計模式&#xff1f;為什么使用設計模式&#xff1f;設計模式的核心設計原則是什么&#xff1f;1. 開閉原則&#xff08;Open-Closed Principle, OCP&#xff09;2. 里氏替換原則&#xff08;Liskov Substitution Principle, LSP&#xff09;3. 依賴倒置原則&am…

網絡層和數據鏈路層

目錄 1.網絡層 2.數據鏈路層 1.網絡層 我們知道&#xff0c;我們的消息為了從A端發送到B端&#xff0c;達成遠距離傳輸&#xff0c;我們為此設計了很多協議層&#xff0c;分別是應用層&#xff0c;傳輸層&#xff0c;網絡層&#xff0c;數據鏈路層&#xff0c;網卡&#xff0c…

Redis 的字典:像智能文件柜一樣高效的哈希表實現

目錄 一、從傳統查找的痛點到哈希表的優勢? 二、哈希表的核心結構&#xff1a;文件柜的構成? 2.1、 dictht 結構體&#xff1a;文件柜本體? 2.2、dictEntry 結構體&#xff1a;帶鏈條的文件夾? 2.2.1、 哈希沖突的解決&#xff1a;抽屜里的鏈條? 2.3、字典的高層封裝…

FAST API部署和使用

第一部分&#xff1a;FastAPI 的使用&#xff08;開發環境&#xff09; 1. 安裝 首先&#xff0c;你需要安裝 FastAPI 和一個 ASGI 服務器&#xff0c;最常用的是 Uvicorn。 pip install "fastapi[standard]"這個命令會安裝 FastAPI 以及所有推薦的依賴&#xff0c;包…

【JavaWeb】之HTML(對HTML細節的一些總結)

大家天天開心&#xff01; 文章目錄 前言一、HTML的簡介二、HTML運行方式三、html 的標簽/元素-說明四、表單注意事項總結 前言 首先我們在把Java基礎學習完之后&#xff0c;我們就要進行網站方面的開發了&#xff0c;我們要了解網頁的組成&#xff0c;而網頁的組成有HTML,CSS,…

互聯網醫院品牌IP的用戶體驗和生態構建

一、患者體驗與信任構建互聯網醫院品牌IP的價值核心在于獲得患者的深度信任&#xff0c;而卓越的用戶體驗是實現這一目標的關鍵路徑。在醫療服務同質化嚴重的當下&#xff0c;患者體驗已成為醫療機構差異化競爭的重要維度。研究表明&#xff0c;良好的用戶體驗能夠提高用戶滿意…

【Node.js教程】Express框架入門:從搭建到動態渲染商品列表

前言 Visual Studio Code(簡稱VSCode)是微軟開發的一款免費開源跨平臺代碼編輯器,憑借其免費、開源、跨平臺的特性,以及豐富的插件生態和美觀的界面,成為前端開發者的首選工具。 本文將帶你從零開始學習Express框架,包括搭建項目、配置路由、使用中間件以及實現動態渲染…

眾擎機器人開源代碼解讀

一&#xff0c;綜述 EngineAI ROS 包&#xff1a; 高層開發模式&#xff1a;用戶可通過發布身體速度指令&#xff0c;直接調用 EngineAI 機器人的行走控制器。底層開發模式&#xff1a;用戶可通過發布關節指令&#xff0c;自主開發專屬的控制器。 ROS2 package&#xff1a;全…

Windows系統安裝Git詳細教程

文章目錄步驟 1&#xff1a;下載 Git 安裝包步驟 2&#xff1a;運行安裝程序步驟 3&#xff1a;選擇安裝路徑步驟 4&#xff1a;選擇組件步驟 5&#xff1a;選擇默認編輯器步驟 6&#xff1a;選擇路徑環境變量步驟 7&#xff1a;選擇 HTTPS 協議的傳輸方式步驟 8&#xff1a;配…

leetcode 3446. 按對角線進行矩陣排序 中等

給你一個大小為 n x n 的整數方陣 grid。返回一個經過如下調整的矩陣&#xff1a;左下角三角形&#xff08;包括中間對角線&#xff09;的對角線按 非遞增順序 排序。右上角三角形 的對角線按 非遞減順序 排序。示例 1&#xff1a;輸入&#xff1a; grid [[1,7,3],[9,8,2],[4,…

攜程旅行 web 驗證碼 分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 部分python代碼 result cp…

JavaEE 進階第一期:開啟前端入門之旅(上)

專欄&#xff1a;JavaEE 進階躍遷營 個人主頁&#xff1a;手握風云 一、HTML基礎 1.1. 什么是HTML HTML(Hyper Text Markup Language)&#xff0c;超文本標記語言。 超文本&#xff1a;比文本要強大&#xff0c;通過鏈接和交互式方式來組織和呈現信息的文本形式。不僅僅有文本…

4.5 PBR

1.PBR簡介 2.高光工作流 3.金屬工作流1.PBR簡介 PBR(Physically Based Rendering, 基于物理的渲染)的工作流分為金屬工作流和高光工作流2.高光工作流 高光工作流是一種傳統的工作流, 現在用的相對較少, 但是在某些特定情況下能提供更精細的控制a.核心思想它不區分金屬和非金屬,…