《无畏契约》游戏画面出现“撕裂感“,你清楚背后的原理吗?

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀Java EE(94平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
在这里插入图片描述

目录

  • 1. 问题描述与引入
  • 2. 画面帧数与帧率
    • 2.1 画面是怎么"动起来的"
    • 2.2 帧数与帧率
    • 2.2.1 帧数
    • 2.2.2 帧率
  • 3. 写时拷贝原理与线程安全问题
    • 3.1 显卡渲染画面原理
    • 3.2 线程安全问题

1. 问题描述与引入

最近有好多玩家反馈,《无畏契约》这款国民枪战游戏,在镜头移动加快或者是镜头距离拉近的时候,画面会出现一种"撕裂感".就像老式电视机那种感觉,当然,许多玩家在出现这种问题的第一反应就是:是否是显卡出了什么问题,或者是游戏画面帧数太低.但是有的玩家即使调好了所有的配置,画面还是会出现这种"撕裂感".
在这里插入图片描述
在这里插入图片描述
那么"出现画面撕裂感"这其中的背后原理是什么呢?下面我们来分析这个问题.

2. 画面帧数与帧率

2.1 画面是怎么"动起来的"

  • 原因1: 动态的画面是由好多张图片组成的.
    其实我们在平时看到的动态画面是由好多张图片组成的,计算机就会连续展示这些图片,只不过这些图片结合地太紧密,我们人类感觉就是动态的.其次,平时经常打游戏的同学都会有"帧数"这个概念.当我们游戏画面出现卡顿的时候,我们经常会把游戏画面帧数调高.比如从90Hz调整到144Hz.但是我们平时玩家对所谓"帧数"的叫法是不准确的,这些数字准确来说,==应该叫"帧率"==那么什么又是帧率,什么又是帧数呢?后续介绍.
  • 原因2:人眼视觉残留
    这样的说法现存两种:(以下内容来自百度百科)

【说法1】是因为人眼的视觉残留特性:是光对视网膜所产生的视觉在光停止作用后,仍保留一段时间的现象,其具体应用是电影的拍摄和放映。原因是由视神经元的反应速度造成的。其时值是二十四分之一秒。是动画、电影等视觉媒体形成和传播的根据。
【说法2】当物体在快速运动时, 当人眼所看到的影像消失后,人眼仍能继续保留其影像1/24秒左右的图像,这种现象被称为视觉暂留现象。是人眼具有的一种性质。人眼观看物体时,成像于视网膜上,并由视神经输入人脑,感觉到物体的像。但当物体移去时,视神经对物体的印象不会立即消失,而要延续1/24秒左右的时间,人眼的这种性质被称为“眼睛的视觉暂留”。

2.2 帧数与帧率

2.2.1 帧数

下面是来自百度百科对帧数的定义:

帧数(Frames),为帧生成数量的简称。由于口语习惯,我们通常将帧数与帧率混淆。

通俗地来将,其实就是计算机在一定时间内所要展示的图片总数,这些图片之间有着略微的变化,所以就可以形成动态的画面.

2.2.2 帧率

首先,我们不应该把帧数和帧率的概念混淆,它们两个之间的关系就像速度与路程之间的关系.

我们知道,速率(Speed)=距离(Distance)/时间(Time),单位为米每秒(m/s, meterspersecond, mps);
同理,帧率(Frame rate)=帧数(Frames)/时间(Time),单位为帧每秒(f/s, frames per second, fps)。
也就是说,如果一个动画的帧率恒定为60帧每秒(fps),那么它在一秒钟内的帧数为60帧,两秒钟内的帧数为120帧。

上面的一段话通俗来讲,就是我们平时说的90Hz,144Hz,就是计算机在一秒钟之内,所要展示的图片有几张.帧率越高,画面之间的衔接越流畅,反之越卡顿.
在这里插入图片描述

3. 写时拷贝原理与线程安全问题

那么为什么游戏会出现"撕裂感",继承我们上面"帧率"的说法,也就是会出现"掉帧"这样的现象.
其实这设计到了一种数据结构上的操作,就是"写时拷贝".
这个问题我们在之前谈到过.
https://blog.csdn.net/2301_80050796/article/details/138542361?spm=1001.2014.3001.5501

  1. 使用CopyOnWriteArrayList.
    CopyOnWrite即写时拷贝容器.
    如果我们想要修改一个容器中的值的时候,如果直接进行修改,比如想要修改两个数据,一个线程刚好修改完第一个数据的时候,有第二个线程想要来读取修改后的数据,这时候就读到的是一种"中间结果",不够准确.
    这时候就需要引入写时拷贝容器:
  • 当我们往一个容器中添加或者修改数据的时候,不直接修改当前容器,而是先拷贝当前容器,之后在复制出的容器中进行修改.
  • 在修改完成之后,将原容器的引用指向修改后的容器.
    这样如果在有线程去读取数据的时候,如果修改未完成的时候,读取的就是原容器的数据,修改完成之后,就是读取新容器的数据了.所以CopyOnWrite容器采用的便是读写分离思想.

举例说明:不停机更新
在我们玩一个游戏,比如王者荣耀的时候,经常会出现不停机更新这样的现象.在更新的时候,并不会影响用户的游戏体验,在一场游戏结束之后,自动获取游戏更新内容.
在这里插入图片描述

3.1 显卡渲染画面原理

显卡在渲染图像的时候,就会采用"写时拷贝"原理,当在显示器上显示一个画面的时候,在显卡背后额外的空间中,生成下一个画面,这时候其实就是采用了读写分离的思想,显示器在读取画面,而在显卡中额外的空间又会重新渲染另一个画面.之后显示器在显卡渲染完成另一个画面的时候,又会读取下一个画面.
在这里插入图片描述

3.2 线程安全问题

上面的操作是在显卡的背后去渲染下一个要展示的画面.如果说我们不这样做, 我们直接在 上一个画面的基础上直接修改画面,此时线程就会出现"撕裂感",也就是说,在显示器(线程1)在读取显卡中渲染的画面的时候,显卡(线程2)在此时对显示器正在读取的画面进行了修改,这时候就会造成显示器(线程1)读出的结果不够准确,画面出现了"撕裂感".
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安全风险 - 如何解决 setAccessible(true) 带来的安全风险?

可能每款成熟的金融app上架前都会经过层层安全检测才能执行上架,所以我隔三差五就能看到安全检测报告中提到的问题,根据问题的不同级别,处理的优先级也有所不同,此次讲的主要是一个 “轻度问题” ,个人认为属于那种可改…

[译文] 恶意代码分析:2.LNK文件伪装成证书传播RokRAT恶意软件(含无文件攻击)

这是作者新开的一个专栏,主要翻译国外知名安全厂商的技术报告和安全技术,了解它们的前沿技术,学习它们威胁溯源和恶意代码分析的方法,希望对您有所帮助。当然,由于作者英语有限,会借助LLM进行校验和润色&am…

idea控制台日志控制

1.清除控制台log日志 测试的时候,控制台打印的日志比较多,速度有点慢而且不利于查看运行结果,所以接下来我们把这个日志处理下: 取消初始化spring日志打印,resources目录下添加logback.xml,名称固定,内容如…

Transformer+Classification学习笔记

论文名称:An Image is Worth 16x16 Words:Transformers for Image Recognition at Scale [2112.11010] MPViT: Multi-Path Vision Transformer for Dense Prediction (arxiv.org) 参考博客与视频: Vision Transformer 超详细解读 (原理分析代码解读) …

[动画详解]LeetCode151.翻转字符串里的单词

💖💖💖欢迎来到我的博客,我是anmory💖💖💖 又和大家见面了 欢迎来到动画详解LeetCode算法系列 用通俗易懂的动画让算法题不再神秘 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成…

589.N叉树的前序遍历

刷算法题: 第一遍:1.看5分钟,没思路看题解 2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

解决el-upload组件上传文件403 Forbidden的问题

话不多说,上错误。网络显示: 控制台显示: 并且后端也没接收到任何的请求。 只需要把前端中的组件: action的路径修改为: 也就是不写前面的localhost,而是拼接上发送请求拼接的‘api’即可 可以看到&#x…

架构每日一学 6:作为架构师,你必须学会寻找商业模式

本文首发于公众平台:腐烂的橘子 在前面的文章中,我们已经讲了架构师的两条生存法则,第一条是有且仅有一个目标,感兴趣的可以看一下原文: 架构每日一学 2:架构师六个生存法则之一:架构必须有且仅…

【LLM第五篇】名词解释:prompt

1.是什么 提示工程(Prompt Engineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了解…

教育型内容的制胜秘诀:Kompas.ai如何结合知识与营销

在数字化营销的浪潮中,教育型内容已经成为品牌建立权威性和提供价值的重要手段。通过分享专业知识和见解,品牌不仅能够吸引目标受众,还能够在潜在客户心中建立起专业和可信赖的形象。本文将深入分析教育型内容的重要性,详细介绍Ko…

sklearn之k近邻算法——以鸢尾花分类为例

文章目录 k近邻算法算法原理k值的选取特征数据的归一化距离的度量分类原则的制定鸢尾花分类 k近邻算法 k近邻算法是经典的监督学习算法,我们这里主要介绍k近邻算法的基本内容和如何应用 算法原理 k近邻算法的基本原理其实很简单 首先k近邻算法是一个分类算法&am…

x264 帧类型代价计算原理:slicetype_slice_cost 函数分析

x264 x264 是一个开源的视频编码库,它实现了H.264/AVC标准。H.264是一种广泛使用的压缩标准,用于视频流、视频下载、蓝光光盘以及许多其他形式的数字视频分发。x264 以其高压缩效率和良好的视频质量而著称,是许多视频编辑软件和视频播放器的默认编解码器。 以下是关于 x26…

软件工程期末复习(6)需求分析的任务

需求分析 需求分析的任务 “建造一个软件系统的最困难的部分是决定要建造什么……没有别的工作在做错时会如此影响最终系统,没有别的工作比以后矫正更困难。” —— Fred Brooks 需求难以建立的原因&#x…

半小时搞懂STM32面经知识——RCC

1. 时钟的概念 时钟是由电路产生的具有周期性的脉冲信号,相当于单片机的心脏,要想使用单片机的外设必须开启时钟。 时钟对单片机有什么作用? 1. 驱动外设的本质是寄存器,而寄存器需要时钟触发才能改写值。 2. 时钟频率越高&#…

基于Docker的JMeter分布式压测

一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试。如本网站所示,一个JMeter实例将能够控制许多其他的远程JMeter实例,并对你的应用程序产生更大的负载。JMeter使用Java RMI[远程方法调用]来与分布式网络中的对象进行交互。JMeter主站…

前端已死? Bootstrap--JS-jQuery

目录 Bootstrap--JS-jQuery 1 jQuery基础 介绍 基础语法: $(selector).action() 1.1 安装jQuery 地址 基础语法: $(selector).action() 2 jQuery事件 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法。 jQuery常用事件 2.1 鼠标事件…

栅格地图、障碍物地图与膨胀地图(障碍物地图(三)写一张障碍物地图)

花了不少时间看完了障碍物地图的大致思路,这里简单根据前面的思路来写一个简易版的障碍物地图。 1.订阅一张地图 首先,我们需要一张静态地图作为原始数据,这个我们可以订阅当前的map来获取: void map_test1::MapCallback(const…

软件库V1.5版本iApp源码V3

软件库V1.5版本iApp源码V3 配置教程在【mian.iyu】的【载入事件】 更新内容: 1、分类对接蓝奏(免费,付费,会员,广告),支持蓝奏文件描述设置为简介(改动:首页.iyu&#…

Kubernetes二进制(单master)部署

文章目录 Kubernetes二进制(单master)部署一、常见的K8S部署方式1. Minikube2. Kubeadmin3. 二进制安装部署4. 小结 二、K8S单(Master)节点二进制部署1. 环境准备1.1 服务器配置1.2 关闭防火墙1.3 修改主机名1.4 关闭swap1.5 在/e…

Linux常用指令集合

ls显示目录文件 选项: -a 所有文件(all所有) -l 详细信息(Information信息)(自动包含-1) 所以常用 ll -1 一行只输出一个文件。 -R 列出所有子目录下的文件。…