WebGL游戲站優化實錄【myshmup.com】

myshmup.com 允許在瀏覽器中創建 shmup(射擊)游戲。 你可以使用具有創意通用許可證的資源或上傳自己的藝術作品和聲音。 創建的游戲可以在網站上發布。 該平臺不需要編碼,游戲對象的配置是在用戶界面的幫助下執行的。 后端是使用Django框架開發的。 編輯器 UI 用 Javascript 編寫并使用 REACT 框架 游戲用 Typescript 編寫并調用低級 Webgl API 進行渲染。

在這篇文章中,我將解釋我在游戲部分使用的優化,以確保在大多數瀏覽器中獲得流暢的 60PS 體驗。

在這里插入圖片描述

推薦:用 NSDT編輯器 快速搭建可編程3D場景

1、Webgl API

Webgl(Web 圖形庫)API 允許使用現代 GPU 在瀏覽器內渲染圖形。 為了讓 GPU 工作,你需要提供兩個稱為著色器的函數:頂點著色器和片段著色器。 著色器是用類似于 C++ 的 GLSL(GL Shader Language)編寫的。

頂點著色器旨在計算場景的頂點位置。 然后,頂點著色器的輸出被發送到片段著色器,片段著色器計算渲染的所有像素的顏色。 在 myshmup.com 中,我使用了一對簡單的頂點和片段著色器。 它們僅處理 2D 矩形作為原始形狀,每個矩形都有自己的紋理要繪制在其表面上。 可以調整紋理顏色以啟用閃爍效果。 大多數渲染工作包括向著色器提供每幀所需的數據。

2、簡單的實現

在這里插入圖片描述

當我第一次嘗試使用 Webgl 渲染 2D 游戲時,我編寫了一對在屏幕上繪制紋理的著色器。 著色器由打字稿函數處理,該函數一次繪制一個游戲對象。 這個低級函數由繪制函數調用,以游戲對象作為輸入。 為屏幕上可見的每個游戲對象調用繪制函數。

gameObjects.forEach( gameObject => draw(gameObject) );

雖然這種方法對于對象數量較少的情況效果很好,但當在最近的 mac book pro 上游戲對象數量超過 50 個時,這種方法的結果非常差。 出事了…

3、盡可能減少Draw Call次數

在這里插入圖片描述

每個渲染幀都是 CPU 和 GPU 共同完成工作的結果。 CPU 為 GPU 準備數據和指令。 GPU 內存位于 GPU 上。 它稱為 VRAM,與主 RAM 分開。 因此,我們需要在經典 RAM 和 GPU VRAM 之間傳輸數據。 在每次繪制調用時,GPU 都必須等待。 只有將所需數據從 RAM 推送到 VRAM 后才能開始渲染。 準備就緒后,由于其高并行化級別,顯卡可以開始高效地完成其工作。

它就像一家工廠:它的設計目的是在給定批次中生產大量商品,但批次的設置時間可能很長。 你不想使用這條生產線進行手工作業,每批次生產一個物體,你希望每批次生產數百個木托盤,以優化生產成本。

我們現在了解最小化每幀執行的繪制調用次數的重要性。 CPU 到 GPU 的數據傳輸開銷是快速渲染的主要瓶頸。

4、實例繪制

在這里插入圖片描述

我們的目標是盡量減少繪制調用的數量。 為此,我們將使用相同紋理的所有游戲對象打包在一起。 想想射擊游戲中敵人或英雄的所有子彈。 它們在屏幕上數量眾多(因此有“彈幕地獄”的表達方式),但它們具有相同的紋理。 這只是在不同位置繪制相同的精靈。 裝飾也是如此,它們通常由屏幕上重復的瓷磚制成。 你無需將游戲對象集處理為簡單數組,而是在渲染之前準備數據。 你構建一個貼圖,其中鍵是紋理 ID,值是使用該紋理的對象數組。 然后你可以只為每個紋理調用一次繪制函數。 對于有大量重復精靈的 shmup 來說,這是一個巨大的節省。

textures.forEach( texture => draw(texture.gameObjects))

為了在一批中多次使用相同紋理繪制對象數組,我們應該使用 Webgl 2 的“實例繪制”功能。此功能在 Webgl 1 中作為一個選項提供。為了簡單起見,我們決定使用 Webgl 2 盡管它并不與當今所有的瀏覽器兼容。

5、紋理圖集

在這里插入圖片描述

我實現了實例繪制,一切都很好。 經過一年的開發,我向公眾發布了該網站。 組織了一次游戲開發活動,所有游戲都是使用 myshmup.com 創建的。 每個參與者都在短時間內創造了非常原創的游戲。 Game Jam 的獲勝者發布了一個受 TRON 電影啟發的帶有霓虹燈像素藝術的關卡。 他創造了大量的裝飾瓷磚和可破壞的地面敵人來提供豐富的游戲環境。 然后又出現了這樣的情況:在我最先進的、潮人認可的 mac book pro 上,游戲有時會出現滯后。 什么問題? 該游戲在給定時間顯示的不同紋理的數量比簡單游戲中的要多。 接下來做什么?

靈丹妙藥是“紋理圖集”技巧。 這個想法是創建一個非常大的紋理:在 myshmup.com 中,圖集大小是 4096 x 4096 像素。 然后你只需在這個大紋理中繪制所有游戲對象的紋理即可。 當你將一個紋理復制到圖集中時,你可以跟蹤與其關聯的紋理坐標,以便以后可以檢索它。 如果你的圖集太小,只需創建另一個圖集。

實現紋理圖集后,我獲得了 Webgl 必殺技。 我每幀只調用一次繪制函數。 好吧,說實話,更準確的說法是每層每幀只調用一次繪制函數。 這意味著 myshmup.com 中有 10 個平局:游戲中有 6 個視差層,另外 4 個用于游戲 UI(得分欄和按鈕)。 就是這樣。 我可以有 1000 個對象,每幀只會繪制 10 次。 GPU 像天才一樣完成繁重的工作和渲染一切。

6、得到的教訓

在這里插入圖片描述

myshmup.com 紋理圖集示例

這次 webgl 優化之旅充滿了驚喜。 如果實現實例化繪圖和紋理圖集看起來像是過度設計,請相信我,事實并非如此。 在瀏覽器中擁有流暢的動作游戲是關鍵。 只有在那之后,我才對我的平臺提供流暢娛樂的穩健性充滿信心。 當你擁有幾乎恒定的 60 FPS 幀速率時,喜悅是發自內心的!


原文鏈接:WebGL射擊游戲的優化 — BimAnt

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

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

相關文章

機器學習筆記 - 使用 ResNet-50 和余弦相似度的基于圖像的推薦系統

一、簡述 這里的代碼主要是基于圖像的推薦系統,該系統利用 ResNet-50 深度學習模型作為特征提取器,并采用余弦相似度來查找給定輸入圖像的最相似嵌入。 該系統旨在根據所提供圖像的視覺內容為用戶提供個性化推薦。 二、所需環境 Python 3.x tensorflow ==2.5.0 numpy==1.21.…

星際爭霸之小霸王之小蜜蜂(三)--重構模塊

目錄 前言 一、為什么要重構模塊 二、創建game_functions 三、創建update_screen() 四、修改alien_invasion模塊 五、課后思考 總結 前言 前兩天我們已經成功創建了窗口,并將小蜜蜂放在窗口的最下方中間位置,本來以為今天將學習控制小蜜蜂,結…

GPT-4一紙重洗:從97.6%降至2.4%的巨大挑戰

斯坦福大學和加州大學伯克利分校合作進行的一項 “How Is ChatGPTs Behavior Changing Over Time?” 研究表明,隨著時間的推移,GPT-4 的響應能力非但沒有提高,反而隨著語言模型的進一步更新而變得更糟糕。 研究小組評估了 2023 年 3 月和 20…

win10安裝mysql和c++讀取調用舉例

一、下載mysql8.rar解壓到C盤(也可以解壓到其他位置) 在系統環境變量添加JAVA_HOMEC:\myslq8,并在path中添加%JAVA_HOME%\bin; 二、以管理員身份進入命令窗口 三、修改配置文件指定安裝路徑和數據庫的存放路徑 四、鍵入如下命令初始化并啟動mysql服務,然后修改登錄…

Rust之泛型、trait與生命周期

泛型是具體類型或其他屬性的抽象替代。在編寫代碼時,可以直接描述泛型的行為,或者它與其他泛型產生的聯系,而無須知曉它在編譯和運行代碼時采用的具體類型。 1、泛型數據類型: 們可以在聲明函數簽名或結構體等元素時使用泛型&am…

TDD(測試驅動開發)?

01、前言 很早之前,曾在網絡上見到過 TDD 這 3 個大寫的英文字母,它是 Test Driven Development 這三個單詞的縮寫,也就是“測試驅動開發”的意思——聽起來很不錯的一種理念。 其理念主要是確保兩件事: 確保所有的需求都能被照…

macOS Ventura 13.5.1(22G90)發布(附黑/白蘋果系統鏡像地址)

系統鏡像下載:百度:黑果魏叔 系統介紹 黑果魏叔 8 月 18 日消息,蘋果今日向 Mac 電腦用戶推送了 macOS 13.5.1 更新(內部版本號:22G90),本次更新距離上次發布隔了 24 天。 本次更新重點修復了…

Redis 緩存過期及刪除

一、Redis緩存過期策略 物理內存達到上限后,像磁盤空間申請虛擬內存(硬盤與內存的swap),甚至崩潰。 內存與硬盤交換 (swap) 虛擬內存,頻繁I0 性能急劇下降,會造成redis內存急劇下降; 一般設置物理內存的3/4,在redis…

內存不足V4L2 申請DMC緩存報錯問題

當內存不足時,V4L2可能存在申請DMA緩存報錯,如下日志: 13:36:54:125 [15070.640862] rkcifhw fdfe0000.rkcif: swiotlb buffer is full (sz: 1843200 bytes) 13:36:54:125 [15070.640891] rkcifhw fdfe0000.rkcif: swiotlb: coherent allocation failed, size=1843200 13:3…

超分辨率地震速度模型

文獻分享 1. Multitask Learning for Super-Resolution 原題目:Multitask Learning for Super-Resolution of Seismic Velocity Model 全波形反演(FWI)是估算地下速度模型的強大工具。與傳統反演策略相比,FWI充分利用了地震波的…

typedef

t y p e d e f typedef typedef 聲明&#xff0c;簡稱typedef&#xff0c;是創建現有類型的新名字。 比如&#xff1a; #include <bits/stdc.h> using namespace std; typedef long long ll; int main() {ll n;scanf("%lld",&n);printf("%lld"…

C++ 面向對象三大特性——多態

?<1>主頁&#xff1a;我的代碼愛吃辣 &#x1f4c3;<2>知識講解&#xff1a;C 繼承 ??<3>開發環境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;面向對象三大特性的&#xff0c;封裝&#xff0c;繼承&#xff0c;多態&#xff…

30W IP網絡有源音箱 校園廣播音箱

SV-7042XT是深圳銳科達電子有限公司的一款2.0聲道壁掛式網絡有源音箱&#xff0c;具有10/100M以太網接口&#xff0c;可將網絡音源通過自帶的功放和喇叭輸出播放&#xff0c;可達到功率30W。同時它可以外接一個30W的無源副音箱&#xff0c;用在面積較大的場所。5寸進口全頻低音…

RNN模型簡單理解和CNN區別

目錄 神經網絡&#xff1a;水平方向延伸&#xff0c;數據不具有關聯性 ? RNN&#xff1a;在神經網絡的基礎上加上了時間順序&#xff0c;語義理解 ?RNN: 訓練中采用梯度下降&#xff0c;反向傳播 ? 長短期記憶模型 ?輸出關系&#xff1a;1 toN&#xff0c;N to N 單入…

Spring三級緩存

目錄 循環依賴問題 三級緩存 三級緩存創建Bean的流程&#xff08;解決循環依賴問題&#xff09; 三級緩存的局限性 Spring的三級緩存是為了解決單例Bean的循環依賴問題而存在的。 循環依賴問題 簡單來說就是A依賴B&#xff0c;而B又依賴A。即創建A的時候&#xff0c;需要先…

【HarmonyOS】【DevEco Studio】ohpm安裝失敗該如何解決?

【關鍵詞】 HarmonyOS、DevEco Studio、ohpm安裝失敗 【問題背景及解決方案】 最近遇到很多DevEco Studio安裝ohpm失敗的問題&#xff0c;下面給大家介紹幾種出現的問題以及解決方案&#xff1a; 1、ohpm not set up&#xff0c;報錯截圖如下&#xff1a; ? 解決方案&…

一百六十、Kettle——Linux上安裝的Kettle9.2.0連接Hive3.1.2

一、目標 Kettle9.2.0在Linux上安裝好后&#xff0c;需要與Hive3.1.2數據庫建立連接 之前已經在本地上用kettle9.2.0連上Hive3.1.2 二、各工具版本 &#xff08;一&#xff09;kettle9.2.0 kettle9.2.0安裝包網盤鏈接 鏈接&#xff1a;https://pan.baidu.com/s/15Zq9w…

C++中class嵌套時構造函數,析構函數調用的順序

#include<iostream> using namespace std; class Phone { public:Phone(string pname){m_pnamepname;cout<<"phone的構造函數調用"<<endl;}~Phone(){cout<<"Phone的析構函數調用"<<endl;}string m_pname; }; class Person {…

網安周報|Monti Ransomware團伙推出了一個新的Linux加密器

Monti Ransomware團伙推出了一個新的Linux加密器 經過兩個月的休息&#xff0c;Monti 勒索軟件運營商帶著新的 Linux 版本的加密器返回。該變體被用于針對政府和法律部門組織的攻擊。研究人員注意到兩個團伙的TTP之間有多個相似之處&#xff0c;Monti運營商還基于Conti泄露的源…

2023 Robocom 游記+題解

Robocom賽前一天熬夜打了一場edu,全程瞇瞇眼&#xff0c;三題滾粗了&#xff0c;前三題花了一小時才寫完&#xff0c;第四題寫了一小時也沒寫明白&#xff0c;好像預示著Robocom的結局&#xff1f; 早上七點醒了&#xff0c;感覺自己渾身無力&#xff0c;想睡覺但是又睡不著的…