游戏开发46课 性能优化5

news2024/9/22 21:27:37

 

3. CPU优化

性能优化最主要的一部分工作是CPU,CPU性能优化好了,离目标就成功了一半。

3.1 缓存计算结果

缓存计算是空间换时间的经典应用,它适用于那些耗费大量CPU计算而计算结果无需每帧变化的逻辑。实现伪代码:

std::map<KeyType, ValueType> _cache;

ValueType Calculate(KeyType key)
{
    // 先尝试从缓存中获取结果,有就直接返回。
    if (_cache.count(key) > 0)
    {
        return _cache[key];
    }
    // 缓存不存在,执行真正的计算,并缓存计算结果。
    ValueType res = DoCalculation(key);
    _cache[key] = res;
    return res;
}

适用场景举例:

  • 复杂数学计算。Sin/Cos/Pow/Sqrt等运算要花费一定计算量,如果是第一次计算,可以将结果缓存起来,下次遇到相同的计算,直接从缓存中取值。
  • 物理模拟结果。物体的物理模拟过程耗费大量计算,但有些物体模拟完之后就处于静止状态,可以将它之前的模拟结果存下来,防止每帧更新计算。现代主流商业引擎都支持这种优化。
  • 光照贴图。光照贴图是离线将场景的静态光影计算并缓存成贴图,渲染时只需要采样光照贴图的颜色,极大降低了光照计算复杂度。
  • 搜索结果。例如场景节点搜索,场景节点一般采用树形结构,如果查找的节点很深,将显著增加遍历次数,此时很有必要将查找结果缓存起来。
  • 逻辑模块复杂的计算。游戏的逻辑模块,涉及到复杂的计算都可尝试用缓存法降低CPU负担。

3.2 预处理

缓存法利用空间换时间的思想,会增加内存开销;而预处理是将时间转移的思想,它并不会增加内存消耗。将需要花费大量时间加载或运算的逻辑,在启动程序后/加载场景时/切换界面前/进入战斗前等时机预先计算或加载,避免渲染时因CPU负载过高出现帧率波动或卡顿现象。

3.3 限帧法

限帧法简单粗暴,但效果显著,是常见的一种优化手段。限制频率的对象可以是World.Update,物理模拟,粒子计算,角色AI处理,角色状态更新等等。限帧可以通过以下方法实现:

  • 计数法。用一个变量记录更新次数,每累计到某个数才执行更新。
int _frameCounter = 0
void Update(float time)
{
    _frameCounter += 1;
  // 更新频率降为每10帧一次。
  if (_frameCounter % 10 == 0) 
  {
    DoUpdate();      // 执行真正的更新
    _frameCounter = 0;  // 重置计数器
  }
}
  • 计时器。利用Timer机制触发,每隔固定时间触发一次更新。
  • 协程。协程是运行于主线程的伪线程,但可以模拟异步操作,没有多线程的副作用。故而也可以用于限帧操作。
  • 事件触发。每帧查询状态改成事件触发,也是游戏常用的一种优化手段,用来限帧也非常有效。

3.4 主次法

主次法跟LOD技法有异曲同工之妙。思路也是将物件按重要程度划分为高中低级别,然后不同级别采用不同复杂度的效果或计算。这种思路在游戏中可以广泛应用,基本所有消耗高的逻辑或模块都可以采用这个技法。例如:

  • 画质等级。将游戏分为若干等级,画质最高到最低采用不同的渲染技术或资源,区别对待。
  • 资源等级。场景/特效/灯光/物理效果/导航等等模块都可以根据画质等级或物件等级对应不同级别的资源,整体上可以减少消耗,又能兼顾画质效果。
  • 角色分级。主角英雄/Boss等和小怪物/NPC区分开来,前者更新频率更高,AI行为更复杂更智能,而后者采用简单效果或降频更新。

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

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

相关文章

【Redis场景1】用户登录注册

细节回顾&#xff1a; 关于cookie和session不熟悉的朋友&#xff1b; 建议阅读该博客&#xff1a;https://www.cnblogs.com/ityouknow/p/10856177.html 执行流程&#xff1a; 在单体模式下&#xff0c;一般采用这种模式来存储&#xff0c;传递、认证用户登录、注册等信息&…

阿里巴巴最新推出王者笔记:“Spring MVC 源码与实践”

前言&#xff1a; Spring MVC 是 Spring 框架中用于 Web 应用快速开发的一个模块。Spring MVC 的 MVC 是 Model-View-Contoller 的缩写。它是一个广泛应用于图形化用户交互开发中的设计模式&#xff0c;不仅常见于 Web 开发&#xff0c;也广泛应用于如 Swing 和 JavaFX 等桌面…

Java知识要点

第1章 Java概述 重要特性&#xff1a; Write Once Run Anyway 简单性&#xff1a;相比C移除指针、运算符重载、多重继承等&#xff0c;垃圾自动回收。 平台无关性&#xff1a;Java引进虚拟机&#xff08;JVM&#xff0c;Java Virtual Machine&#xff09;概念。 安全性&am…

论文推荐:Rethinking Attention with Performers

重新思考的注意力机制&#xff0c;Performers是由谷歌&#xff0c;剑桥大学&#xff0c;DeepMind&#xff0c;和艾伦图灵研究所发布在2021 ICLR的论文已经超过500次引用 传统的Transformer的使用softmax 注意力&#xff0c;具有二次空间和时间复杂度。Performers是Transformer…

常用射频器件性能指标

IFM&#xff08;Instantaneous FrequencyMeasurement&#xff09;&#xff1a;瞬时测频接收机&#xff1b; SOC&#xff08;System on Chip&#xff09;&#xff1a;片上系统&#xff0c;可独立实现接收机功能&#xff1b; AIU&#xff1a;前端 一、放大器关键参数 1.1 -1dB压…

如何选择好的软件测试技术?

软件测试技术是指测试软件或软件一部分的方法或方式。每种测试技术都有其自身的优势。不同的技术针对不同类型的缺陷。因此&#xff0c;说一种技术是最好的是错误的。根据软件及其要求&#xff0c;一种测试技术可能比另一种更适合用于该目的。有时&#xff0c;结合使用不同的测…

安卓APP源码和设计报告——魔幻相机

课程设计报告书 Android大作业 学 院 计算机科学与工程学院 专 业 计算机科学与技术一班 学生姓名 小组成员 学生学号 指导教师 课程编号 课程学分 起始日期 教师评语 教师签名&#xff1a;日期&#xff1a; 成绩评定 备注 Android大作业 魔幻相机 一、选题背景 据统计&am…

[激光原理与应用-47]:《焊接质量检测》-4-普雷茨特激光焊接过程监控系统LWM分析

目录 第1章 激光焊接过程监控系统LWM概述 第2章 产品特性与功能 2.1 生产相关的信息 2.2 原始信息检测 2.3 焊接质量分析信息 2.4 缺陷报告与生产控制 2.5 LWM给客户带来的好处 2.6 适用范围 2.7 人机界面 (HMI) 第3章 焊接质量检测的原理 3.1 基本原理 3.2 技术规…

excel_阻止常数值串以科学计数法显示@数据分列@空格分隔符号分列数据

文章目录excel_阻止常数值串以科学计数法显示WPS设置某列的数据显示格式核心步骤数据-分列选择分割符设置文本类型收尾工作数据居中Office-Excelexcel_阻止常数值串以科学计数法显示 WPS 设置某列的数据显示格式 核心步骤 如果您的数据是普通数据,那么类型框里输入0就可以了…

太忙,没时间学?在职人员如何高效备考MBA?

对于很多在职人员来说&#xff0c;想要进一步深造提升学历&#xff0c;备考MBA无疑是个不错的选择。但近几年随着MBA考生人数的增长&#xff0c;其竞争也愈加激烈。因此想要取得好的成绩&#xff0c;成功上岸&#xff0c;不仅仅需要持续不断的努力&#xff0c;时间的科学管理和…

机器人与视觉,基于TCP(工具坐标)偏移

基于工具坐标系的移动偏转。 基于TCP旋转的特点在于&#xff0c;具有1个固定端点&#xff0c;多个活动端的特点。 我们在建立TCP左边偏移的时候&#xff0c;可以将2个点近似的模拟在同一个坐标系下 基于TCP偏转的特点在于&#xff0c;工作的时候&#xff0c;示教点与工作点的位…

CSS -- 03. CSS盒子模型

文章目录盒子模型1 盒子模型1.1 看透网页的本质1.2 盒子模型组成1.3 边框1.4 表格的细线边框1.5 边框会影响盒子实际大小1.6 内边距&#xff08;padding&#xff09;1.7 外边距&#xff08;margin&#xff09;1.8 外边距合并1.9 清除内外边距2 圆角边框3 盒子阴影4 文字阴影盒子…

netfilteriptables探讨(4)——nat的实现与使用

在之前的几篇文章中&#xff0c;我们讨论了netfilter与iptables的实现原理与基本用法。在netfilter&iptables的各种使用场景中&#xff0c;nat是最常用也是最复杂的用法之一。许多常用的网络使用模式都是通过nat iptables规则实现的&#xff0c;例如docker默认的bridge网络…

Netty_06_手写RPC基础版(实践类)

文章目录一、前言二、整体运行三、客户端和服务端3.1 客户端3.2 服务端3.3 RpcServerInitializer和RpcClientInitializer四、小结一、前言 常用的rpc框架&#xff1a;dubbo thrift gRPC rpc定义&#xff1a;remote proceducer call rpc目的/解决的问题&#xff1a; 像调用本地…

Nginx实战应用-负载均衡

在上篇文章的基础上我们再创建两个服务&#xff0c;三个服务的端口分别是 8081 8082 8083. 2.Nginx配置 upstream块 upstream name{…} upstream gupao{ server 192.168.12.1:8081; server 192.168.12.1:8082; server 192.168.12.1:8083; } server { location / { pr…

平均月薪15k+?自动化测试工程师?3个月教你从“点工”蜕变为“码农”

前言 一、自动化测试工程师平均收入【看图&#xff08;来自职友集&#xff09;】 基本收入都在15k左右&#xff0c;随着技术的越来越牛逼工资也就会越来越高。 我的职业生涯开始和大多数测试人一样&#xff0c;刚开始接触都是纯功能界面测试。那时候在一家电商公司做测试&…

[附源码]计算机毕业设计基于vue+mysql开发的考试系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【PAT甲级 - C++题解】1092 To Buy or Not to Buy

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;PAT题解集合 &#x1f4dd;原题地址&#xff1a;题目详情 - 1092 To Buy or Not to Buy (pintia.cn) &#x1f511;中文翻译&#xff1a;买还是不买 &#x…

JAVA中的运算符-关系运算符

文章目录0 写在前面1 关系运算符说明2 举例3 写在最后0 写在前面 JAVA包含丰富的关系运算符&#xff0c;这些关系运算符最终结果一定是boolean类型。即两个结果&#xff1a;true false 1 关系运算符说明 符号说明ab,判断a和b的值是否相等&#xff0c;成立为true&#xff0c;…

游戏开发48课 性能优化6

3.7.2 算法优化 思路是找出最耗CPU的算法或逻辑&#xff0c;优化之。 空间换时间。利用预排序/预处理/缓存/动态规划等等思路换取CPU的性能。选取更快的算法。属于数据结构和算法的范畴&#xff0c;思路是将O(n2)降低成O(n)或O(logn)&#xff0c;具体可以参看《算法导论》《游…