WebGL游戏站优化实录【myshmup.com】

news2024/12/25 9:16:35

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.coloradmin.cn/o/892637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实力演绎不凡服务,伊士曼漆面保护膜裁切数据系统焕新面世 创新成就不凡服务体验

中国,上海,近日——汽车后市场数字化服务新时代即将到来。全球性特种材料公司伊士曼正通过创新升级的全新漆面保护膜裁切数据系统「EMN CORE PATTERN」,应对汽车后市场转型趋势,以迈入全新阶段的漆面保护膜智能裁切技术。用更专业…

读SQL学习指南(第3版)笔记01_背景知识

1. 数据库 1.1. 一组相关信息 1.2. 电话簿肯定是最为普及且常用的数据库 2. 非关系型数据库系统 2.1. 层次数据库系统 2.1.1. 以一个或多个树形结构来表示数据 2.1.2. 提供了定位特定客户信息树的工具,并能够遍历该树找到所需的账户和/或交易 2.1.3. 树中的每…

VMWARE15.5.7安装RedHat 7.9黑屏

在win7上面最高版本为vmware15.5.7 我安装后,安装成功了redhat5.5 但是因为操作系统有点老。安装其他软件时遇到问题。想改为7.0以上linux。 但是遇到了问题。安装时,一直黑屏。包括再安装5.5也是同样效果。 找了很多方案都无济于事。后面搜到一个方案…

SpringBoot3.x Starter自动装配的坑

最近有个写IAM平台的设想,里面涉及到了行为审计,就在思考如果其他各个模块都去写一遍审计平台的配置和方法,那多麻烦,不如写个工具类。但是一般的工具类要使用方法就得实例化,十分的繁琐。于是写一个Starter的想法应运…

docker run 命令30个常用参数详解

文章目录 0.前言docker run 命令示例 2.Docker run 多种用法知其然知其所以然1. 基本用法2. 启动交互式容器3. 映射端口4. 挂载文件/目录5. 设置环境变量6. 指定容器名称7. 后台运行容器8. 重启策略9. 其他参数 2. docker run 命令参数详解1. -d:以后台模式&#xf…

C# SolidWorks二次开发-第100篇 属性卡刷新方案

SolidWorks推出属性卡应该很多年了吧,毕竟可以用户自己定义界面,而且方便修改,毕竟点击自带的的属性按钮再去修改要操作好几次。 我们今天讲一个很简单的功能要求,就是在SolidWorks中实现零件的编码问题。 毕竟设计好的东西后面需…

修改el-table行悬停状态的背景颜色

.content:deep().el-table tr:hover>td {background-color: #f5f5f5 !important; /* 设置悬停时的背景颜色 */ }/*这一点很重要,否则可能会导致hover行时操作列还是原来的背景色*/ .content:deep().el-table__body tr.hover-row>td{background-color: #f5f5f5…

编写一个俄罗斯方块

编写俄罗斯方块 思路。 1、创建容器数组,方块, 2、下落,左右移动,旋转,判断结束,消除。 定义一个20行10列的数组表示游戏区。初始这个数组里用0填充,1表示有一个方块,2表示该方块固…

k8s容器加入host解析字段

一、通过edit或path来修改 kubectl edit deploy /xxxxx. x-n cattle-system xxxxx为你的资源对象名称 二、添加字段 三、code hostAliases:- hostnames:- www.rancher.localip: 10.10.2.180

【多目标跟踪】 FairMOT 耗时三天!!!单句翻译

多目标跟踪 FairMOT Abstract Multi-object tracking (MOT) is an important prob-lem in computer vision which has a wide range of applica-tions. Formulating MOT as multi-task learning of object de-tection and re-ID in a single network is appealing since ital…

Java minecraft(我的世界)环境部署

Java minecraft(我的世界)环境部署 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 本文主要讲解我的世界的环境搭建, 包括搭建服务端和客户端, 为了避免不必要的麻烦最好是遵守 MINECRAFT 使用准则&#x…

AcrelEMS-SW智慧水务能效管理平台解决方案-安科瑞黄安南

系统概述 安科瑞电气具备从终端感知、边缘计算到能效管理平台的产品生态体系,AcrelEMS-SW智慧水务能效管理平台通过在污水厂源、网、荷、储、充的各个关键节点安装保护、监测、分析、治理装置,用于监测污水厂能耗总量和能耗强度,重点监测主要…

vue3和vue2 语法差异之v-model详细说明

文章目录 0.前言1.参考文档2.详细说明介绍2.x 语法使用 v-bind.sync 3.x 语法v-model 参数v-model 修饰符 迁移策略 3.总结 0.前言 在 Vue 3 中,v-model 的使用方式与 Vue 2 有一些差异。下面是 Vue 3 中 v-model 的一些主要变化: 组件上的默认绑定&…

信捷 XD PLC 16位整数转换为双精度浮点数

完成16位整数转换为双精度浮点数,信捷XD PLC需要两个指令,逐步转换,一个指令搞不定。 具体的: 第1步:int16->int32 第2步:int32->Double 例子,比如说将D0转换成浮点数放到D100~D103

卷积操作后特征图尺寸,感受野,参数量的计算

文章目录 1、输出特征图的尺寸大小2、感受野的计算3、卷积核的参数量 1、输出特征图的尺寸大小 如果包含空洞卷积,即扩张率dilation rate不为1时: 2、感受野的计算 例如,图像经过两个3*3,步长为2的卷积后感受野为: co…

linux--epoll

epoll 参考文献 https://www.cnblogs.com/lojunren/p/3856290.html https://www.51cto.com/article/717096.html linux下的I/O复用epoll详解 要深刻理解epoll,首先得了解epoll的三大关键要素:mmap、红黑树、链表。 IO多路复用 首先需要了解什么是IO多…

如何增强企业合同管理数字化能力

随着科技的发展和信息化时代的来临,企业在合同管理方面面临着日益复杂的挑战。传统的合同管理方式已经无法满足企业对合同管理效率和准确性的需求。因此,增强企业合同管理的数字化能力成为迫切的任务。 下面是一些关键步骤,可以帮助企业有效…

java+springboot+mysql理发会员管理系统

项目介绍: 使用javaspringbootmysql开发的理发会员管理系统,系统包含超级管理员,系统管理员、客户、发型师角色,功能如下: 超级管理员:管理员管理;会员管理;发型师管理&#xff1b…

spring详解

spring是于2003年兴起的一款轻量级的,非侵入式的IOC和AOP的一站式的java开发框架,为简化企业级应用开发而生。 轻量级的:指的是spring核心功能的jar包不大。 非侵入式的:业务代码不需要继承或实现spring中任何的类或接口 IOC&…

jeecg导出excel文件时候是id,展示名称的处理方式

一.问题描述: 在jeecg3.5.3版本中,创建了一个基础表,并配置菜单,输入数据以后,如果需要导出数据,而且数据类型的展示页面类型是他表字段,这个情况下,直接使用jeecg默认功能,导出的excel并不会和页面一样,默认显示出来被选字段的字段名称。 例如:页面显示如下: 实…