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

news2024/11/17 21:26:51

🌸个人主页: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)读出的结果不够准确,画面出现了"撕裂感".
在这里插入图片描述

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

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

相关文章

LangChain 核心模块学习 模型输入 Prompts

模型输入 Prompts 一个语言模型的提示是用户提供的一组指令或输入,用于引导模型的响应,帮助它理解上下文并生成相关和连贯的基于语言的输出,例如回答问题、完成句子或进行对话。 提示模板(Prompt Templates)&#xf…

一篇文章带你入门CSRF

1.什么是CSRF 用一个形象生动的比喻就是: 你给朋友的房子留下了备用钥匙,但是有人偷偷拿走了这把钥匙,然后用这把钥匙进入了你朋友的房子并做了各种坏事。你朋友以为只有你能使用这把钥匙,所以没对任何操作产生怀疑。 在这个比…

保研机试之【设备驱动程序】

B选项: 综上,我认为这道题选择D~

从头开始学Spring—02基于XML管理bean

目录 1.实验一:入门案例 2.实验二:获取bean 3.实验三:依赖注入之setter注入 4.实验四:依赖注入之构造器注入 5.实验五:特殊值处理 6.实验六:为类类型属性赋值 7.实验七:为数组类型属性赋值…

Charger之三动态电源路径管理(DPPM)

-----本文简介----- 主要内容包括: 领资料:点下方↓名片关注回复:粉丝群 硬件之路学习笔记公众号 Charger的动态电源路径管理(DPPM) 前篇内容:①电池管理IC(Charger)了解一下&…

国产分布式数据库高可用故障检测实现

在分布式数据库架构下,当数据库节点异常时,数据库管理组件能够自动感知到异常并触发节点隔离或者自动切换,是数据库高可用容灾的基本能力。在节点服务器异常、网络异常或进程异常等场景下,各数据库产品本身已经具备了可靠的检测能…

C#之如何判断数据类型

一、GetType方法 a.GetType():获取当前变量的类型对象 string str "Hello World";Console.WriteLine(str.GetType()); 结果: 二、typeof方法 typeof(Int):获取的是Int类型的类型对象 int num 10;Console.WriteLine(num.GetType() typeof(i…

NSSCTF中的1zjs、作业管理系统、finalrce、websign、简单包含、Http pro max plus

目录 [LitCTF 2023]1zjs [LitCTF 2023]作业管理系统 [SWPUCTF 2021 新生赛]finalrce exec()函数:php中exec介绍及使用_php exec-CSDN博客​​​​​​ 资料参考:RCE(远程命令执行)绕过总结_rce绕过-CSDN博客 [UUCTF 2022 新生赛]websign [鹏城杯 …

Python实现麦克风录音保存到wav

功能展示: 运行环境: Python: 3.10.4 64-bit 操作系统: 截图环境:win10 64-bit 视频录屏环境:win10 64-bit 功能说明: 点击界面开始按钮开始录音,点击停止按钮结束录音。 源码文件列表&…

Linux的命名管道 共享内存

目录 命名管道 mkfifo函数 unlink函数 命名管道类 服务端 客户端 共享内存 shmget函数 ftok函数 key和shmid的区别 snprintf函数 ipcs指令 ipcrm指令 shmctl函数 shmat函数 void*做返回值 创建共享内存空间 服务端 客户端 命名管道 基本概念&#xff1…

OpenAI GPT-4

本文翻译整理自:https://openai.com/index/gpt-4-research/ (March 14, 2023) 文章目录 一、关于 GPT-4二、能力视觉输入Visual inputs: chart reasoningSample 2 of 7 操纵性Steerability: Socratic tutorSample 1 of 3 三、局限性四、风险与缓解措施五、训练流程…

鱼哥好书分享活动第22期:《数字政府网络安全合规性建设指南》解锁数字政府网络安全新篇章

鱼哥好书分享活动第22期:《《数字政府网络安全合规性建设指南》》解锁数字政府网络安全新篇章 阅读对象:书籍目录:了解更多:赠书抽奖规则: 当今时代,数据已成为新型生产要素,不仅是个人、企业乃至国家的重要…

enable_shared_from_this使用笔记

解决了&#xff1a; 不能通过原指针增加引用次数的问题 &#xff0c;通过weak_ptr实现。 class MyCar:public std::enable_shared_from_this<MyCar> { public:~MyCar() { std::cout << "free ~Mycar()" << std::endl; } };int main() { MyCar* _…

算法-卡尔曼滤波之基本数学的概念

1.均值 定义&#xff1a;均值是一组数据中所有数值的总和除以数据的数量。均值是数据的中心趋势的一种度量&#xff0c;通常用符号 xˉ 表示。 &#xff1a;对于包含 n 个数据的数据集 {&#x1d465;1,&#x1d465;2,...,&#x1d465;&#x1d45b;}&#xff0c;均值 xˉ 计…

高扩展性便携式1553B总线测试仪,支持麒麟操作系统

手提式便携1553B总线测试仪&#xff0c;利用订制平台的PXIe扩展槽嵌入石竹科技自主研发的高性能T系列专用1553B测试板卡和高级协议分析和测试软件FP-1553B Pro、FP-5186集成的一款模块化、功能可订制的测试仪器。 基本配置可对1553B信号进行波形采集&#xff08;提供软件示波器…

goconvey测试框架的使用

尽管Golang已经内置了功能强大的testing包&#xff0c;其易用性令人称赞。然而&#xff0c;当我们希望更直观地处理和判断测试结果时&#xff0c;结合使用goconvey能为我们提供极大的便利。goconvey不仅为我们提供了丰富的断言函数&#xff0c;这些函数还极大地方便了我们在进行…

C++ QT设计模式 (第二版)

第3章 Qt简介 3.2 Qt核心模块 Qt是一个大库&#xff0c;由数个较小的库或者模块组成&#xff0c;最为常见的如下&#xff1a;core、gui、xml、sql、phonon、webkit&#xff0c;除了core和gui&#xff0c;这些模块都需要在qmake的工程文件中启用 QTextStream 流&#xff0c;Qdat…

本地安装nvm,管理多版本node

先卸载本地的nodejs(14.16.1) 卸载的直接可以点击win10图标→设置→应用→应用和功能 卸载nodejs即可 2. 安装nvm&#xff0c;地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases 安装目录时尽量不要出现特殊字符还有空格&#xff0c;否则会在nvm use xxx的…

海外媒体发稿:如何在日本媒体投放新闻通稿-大舍传媒

导言 在全球化的时代背景下&#xff0c;海外媒体宣发对于企业来说非常重要。通过在海外媒体投放新闻通稿&#xff0c;企业能够拓展海外市场&#xff0c;增强知名度和影响力。本文将探讨如何在海外媒体投放新闻通稿&#xff0c;以帮助企业进行有效的海外宣传。 挖掘海外媒体资…

Alibaba SpringCloud集成Nacos、Sentinel实现服务治理-17

关于服务治理 总体而言&#xff0c;限流和降级作为微服务架构中的重要机制&#xff0c;尽管在实现上可能有多种方式&#xff0c;但它们都着眼于保护服务提供者和消费者&#xff0c;在面对异常情况时确保系统稳定运行。限流关注于保护服务提供者&#xff0c;控制请求流量&#…