游戏开发59课 性能优化

news2024/11/30 13:43:45

 

7. 耗电优化

游戏耗电和游戏卡并无必然联系,有些游戏在某些设备上虽然运行很流畅,但发现耗电很厉害,玩了不到半个小时,电量已经出现警报。游戏耗电的原因主要是因为:CPU占用普遍高,内存操作频繁,磁盘IO频繁,渲染消耗普遍高,导致带宽负载和GPU消耗高。前面介绍的章节基本可以降低耗电,也是优化耗电的必要措施。尤其是以下章节对耗电优化更明显:

2. 资源优化

3.3 限帧法

3.4 主次法

3.6 引擎模块优化

4 渲染优化

5.4 控制GC

6. 5 IO优化

除了以上章节,还可以用动态调整帧率和画质的优化技法。

7.1 动态调整限帧

游戏逻辑通常可以获取当前设备的电量,若可以,则每隔一段时间获取一次电量信息,可以统计出单位耗电量,如果发现单位时间耗电量过高,而游戏帧率又很高(比如大于50),可以主动降低帧率(比如30)。

7.2 动态调整画质

做法跟动态限帧类似,只是调整的是画质等级,而不是帧率。当然也可以一起结合使用。

8. 网络优化

网络优化的目的是让网络包更小,响应更及时,消耗更少流量,不卡主线程。

8.1 减少无用字段

网络包中通常包含了很多信息,诸如角色位置,朝向,状态等。如果是2.5D游戏,则位置z分量可以弃掉;朝向只在xz平面上,所以只需要发送RotationY。通过这种减少无用字段,可以一定程度上降低网络包大小。

8.2 降低字段精度

通常逻辑里的很多信息都是4字节,包括角色位置,朝向,技能或Buff信息等。但很多时候,这些信息不可能达到4字节数的最大值,可以压缩至2字节甚至1字节。比如,同样是位置,场景的尺寸通常在2字节数的表示范围内(-32512~32512),可以将位置的x/y/z压缩至2字节发送。同样地,朝向RotationY可以2字节表示。

8.3 避免重复发送

游戏网络模块须有效限制部分协议在短时间内重复发送,例如玩家在短时间内按了很多次抽奖按钮。所以需要一种机制来限制。比如可以在网络协议定义时,加个标记,表明该协议不能在某个时间段内重复发送。

8.4 网络异步化

开辟独立的线程处理收发网络协议包,是游戏常见的优化手段,可以避免与主线程相互等待。

8.5 压缩无效字节

压缩无效字节是指通过一种方式剔除每个字段内高位全0的数据。比如角色等级50,如果用int32表示,是00000000 00000000 00000000 ‭00110010‬,高位3个字节全是0,可以压缩至1字节。这里有一种压缩字节的方法,跟utf8编码方式类似。

utf8的编码方式(x代表有效位):

1字节(最大有效位7) :0xxxxxxx
2字节(最大有效位11):110xxxxx 10xxxxxx
3字节(最大有效位16):1110xxxx 10xxxxxx 10xxxxxx
4字节(最大有效位21):11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节(最大有效位26):111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节(最大有效位31):1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

比如角色等级50,有效位是6,用1字节便够了,压缩成00110010‬(红色是压缩位标记)。如果是数字1000,int32表示为00000000 00000000 0000‭0011 11101000‬,有效位是10,需要2字节编码,压缩后是11001111 10101000‬(红色是压缩位标记)。采用这种压缩方式,普遍可以用1~2个字节取代4字节数据,压缩效果比较明显。

8.6 压缩协议包

8.5压缩的是字段内数据,每个数据包其实有很多相同的数字,可以用目前主流的压缩方法再对网络包做一次压缩。游戏最常用的压缩方法是zlib开源库,还可以用lz4方法。具体实现可以另外寻资料,这里不详述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84801.html

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

相关文章

Spring MVC学习 | 获取请求参数

文章目录一、ServletAPI获取二、控制器方法形参获取2.1 不使用RequestParam注解2.2 使用RequestParam注解2.2.1 简介&使用2.2.2 相关注解2.3 实体类类型的形参三、中文乱码问题3.1 在tomcat中设置编码(了解)3.2 使用Spring MVC内部过滤器设置编码学习…

【PortSwiggerのWeb Security Academy靶场】SQL Injection系列 9th

Subject Lab: Blind SQL injection with conditional responses Url: portswigger.net/web-securit… Mind Palace 在带着 cookies的后续访问网页时会找到出现的 Welcome back! 标志 > 无法回显 > 采用盲注的方式 0x01 确认注入点 0x02 爆破数据库名 # 测试informati…

qiankun 部署微前端-vue2(一)

自从前后端分离以来,一直都有个困惑,就是随着项目的功能的不断拓展,项目变得不断臃肿,每次打包编译,都要把整个项目编译,非常耗时。如果前端也能像后端一样,在项目搭建初期,有类似微…

C++11【包装器】

包装器📖1. 为什么需要包装器📖2. 如何使用包装器📖3. bind函数📖1. 为什么需要包装器 包装器也叫做适配器,C中的function本质是一个类模板,也是一个包装器. 为什么需要function呢? 我们来看…

ant-design-vue修改input组件样式

问题场景 不得不说ant-design-vue的样式是真的难改。。。今天尝试了很多种方案,都无疾而终。最终,通过全局scss文件引入的方式解决了。 几种方案: 直接行内样式,发现部分可以,部分不行将style 的scoped属性去掉&#…

非线性负载的主要分类及其特性

非线性负载的主要分类 通常而言,由线性元件原件组成的负载称为线性负载,线性负载的输出与输入呈线性关系,典型的线性负载如电阻、电容和电感等;而由非线性元件构成的负载为非线性负载,在正弦波电压供电时会产生非正弦…

Sentinel服务流控

Sentinel通过流量控制(flow control)以及熔断降级来保护系统资源 QPS超过阈值直接失败 流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制&#x…

如何使用ABAQUS对新能源动力电池进行Pack分析

电池Pack的仿真,按照系统层次,可从电芯、模组、Pack和整车逐级分析。电芯主要集中于机械性能的材料拟合、激光焊接以及电-化学-热-机耦合建模,模组主要集中于跌落、振动以及模组冷却,Pack主要集中于**、冲击和振动以及Pack热管理&…

Token Merging: Your ViT But Faster

论文:https://arxiv.org/pdf/2210.09461.pdf 代码: https://github.com/facebookresearch/ToMe 这篇论文写的很棒呀,以摘要为例,第一句话指明ToMe的作用(提高ViT-based模型的训练和推理速度)和特色&#x…

java面试强基(21)

什么是线程和进程? 何为进程? ​ 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 ​ 在 Java 中,当我们启动 main 函数时其实就是启动了一个 J…

提质增效!北京筑龙助力蒙牛集团采招数智化升级

近两年,全球经济下行压力加剧,市场形势波动使得集团企业面临着很大的经营压力。随着数字经济时代的到来,利用数字技术重构价值链、重组业务流程,或创建新的生态系统平台成为集团企业数字化转型的契机。 蒙牛电子采购招标平台作为…

WEB网页设计期末作业个人主页——基于HTML+CSS制作个人简介网站

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

现实中的项目范围变更

大多数招投标或签合同的项目(TOG或TOB),范围变更是极少的,一旦发起范围变更申请,这个流程是非常复杂的,而且会有负面影响,尤其是TOG的项目。 项目范围变更,往往会引起项目金额变更,核减、增加、不变都有可能。 TOG项目的范围变更,常是因为政策变了、上级要求等不可…

(附源码)Springboot网上购物平台 毕业设计 141422

Springboot网上购物平台的开发 摘 要 随着Internet的使用越来越广泛,在传统的商业模式中,对于日常各类商品,人们习惯于到各种商家店铺购买。然而在快节奏的新时代中,人们不一定能为购买各类商品腾出时间,更不会耐心挑…

Docker管理工具Portainer忘记admin登录密码怎么办?

Portainer官网解决方法链接 https://docs.portainer.io/v/ce-2.11/advanced/reset-admin 炒鸡详细步骤! 1.查看所有容器,包括未运行的 docker ps -a 2.找到Portainer对应信息 3.停止Portainer容器 docker stop portainerid 我这里就应该是 docker stop 507566…

Unity VFX图表初级到中级教程

Unity VFX图表初级到中级教程 从 Unity 学习新的视觉效果工具并开始制作一些很棒的魔法效果 课程英文名:Unity VFX Graph - Beginner To Intermediate 此视频教程共4.5小时,中英双语字幕,画质清晰无水印,源码附件全 下载地址 …

【脚本项目源码】Python制作提升成功率90%的表白神器

前言 明天就是拥抱情人节,情侣们会在公开的场合拥抱,向世人宣告你俩的爱意,也让这个寒冷的冬天变得格外温馨。到了年底依然能热情拥抱,也见证了两人情意如昔。 今天小鱼就给大家带来就是的利用Python制作表白神器,记…

年末消费高峰,警惕“大牌平替”的陷阱

就在眼前的双十二,接踵而来的圣诞跨年与春节,买买买的黄金时段,作为消费者,少不了要接受各式营销广告的狂轰滥炸。如今纷繁复杂的消费市场,大家都擦亮了眼睛追求性价比,如果你也曾被“五分之一价格买到大牌…

【云计算与大数据计算】分布式处理CPU多核、MPI并行计算、Hadoop、Spark的简介(超详细)

一、CPU多核和POISX Thread 为了提高任务的计算处理能力,下面分别从硬件和软件层面研究新的计算处理能力 在硬件设备上,CPU 技术不断发展,出现了SMP(对称多处理器)和 NUMA(非一致 性内存访问)两种高速处理的 CPU 结构 在软件层面出现了多进程和多线程编程。进程…

【王道计算机网络笔记】网络层-网络层概述和编址

文章目录IP数据报格式IP数据报分片例题IPv4地址分类的IP地址网络地址转换NAT子网划分与子网掩码无分类编址CIDR主要任务是把分组从源端传到目的端,为分组交换网上的不同主机提供通信服务。网络层的传输单位是数据报,数据报是一个比较长的数据&#xff0c…