《無畏契約》游戲畫面出現“撕裂感“,你清楚背后的原理嗎?

🌸個人主頁: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.pswp.cn/web/12221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12221.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信息化總體架構方法_2.信息化工程建設方法

1.信息化架構模式 信息化架構一般有兩種模式,一種是數據導向架構,一種是流程導向架構。對于數據導向架構重點是在數據中心,BI商業智能等建設中使用較多,關注數據模型和數據質量;對于流程導向架構,SOA本身就…

黑馬程序員鴻蒙HarmonyOS端云一體化開發【13-15】

前置知識:arkts 一套開發工具,一套語言,搞定客戶端和云端兩個的編寫。其中application就是客戶端,cloudProgram就是云端。 開發人員->全棧開發工程師,降低了開發成本,且提供了很多現成的云服務&#xf…

AI原生實踐:測試用例創作探索

測試用例作為質量保障的核心,影響著研發-測試-發布-上線的全過程,如單元測試用例、手工測試用例、接口自動化用例、UI 自動化用例等,但用例撰寫的高成本尤其是自動化用例,導致了用例的可持續積累、更新和迭代受到非常大制約。長久…

Python并發編程 05 鎖、同步條件、信號量、線程隊列、生產者消費者模型

文章目錄 一、基礎概念二、同步鎖三、線程死鎖和遞歸鎖四、同步條件(event)五、信號量六、線程隊列(queue)1、常用方法2、queue模塊的三種模式(1)FIFO隊列(2)LIFO隊列(3&…

【JS面試題】原型原型鏈

一、面試真題展示: 1. 如何準確判斷一個變量是不是數組? ① 使用instanceof進行判斷:a instanceof Array ② 使用Array.isArray()進行判斷:Array.isArray(a) 2. 手寫一個簡易的jQuery,考慮插件和擴展性? …

內網工具之LDP的使用

LDP 是微軟自帶的一款活動目錄信息查詢工具,在域控的 cmd 窗口執行 ldp 命令即可打開 LDP 工具。普通域成員主機默認是沒有 LDP 工具的,可以自行上傳ldp.exe 工具上去查詢活動目錄信息。不在域內的機器,也可以通過上傳 ldp.exe 工具上去執行。…

tomcat--目錄結構和文件組成

目錄結構 目錄說明bin服務啟動,停止等相關程序和文件conf配置文件lib庫目錄logs日志記錄webapps應用程序,應用部署目錄workjsp編譯后的結果文件,建議提前預熱訪問 /usr/local/apache-tomcat-8.5.100/work/Catalina/localhost/ROOT/org/apac…

c++string類型

概述 string類型是c的字符串類型&#xff0c;其繼承自basic_string類。使用string需要導入頭文件#include <string>,并且在命名空間std下。cstring是否是寫時復制? (像Qt的string一樣)? 經過自己的測試&#xff0c;推斷&#xff0c;c的方式不是寫時復制&#xff0c;其在…

PingCAP 戴濤:構建面向未來的金融核心系統

作者&#xff1a;戴濤 導讀 近日&#xff0c;平凱星辰解決方案技術部總經理戴濤在 2024 數據技術嘉年華活動中&#xff0c;做了主題為“構建面向未來的金融核心系統”的分享&#xff0c;本文為戴濤演講實錄的全文。 文章分析了中國金融行業的發展趨勢&#xff0c;并且基于這…

在 Mac OS 上使用 Homebrew 打造便捷的軟件安裝體驗:apt-get install 就是brew install:

標題&#xff1a;在 Mac OS 上使用 Homebrew 打造便捷的軟件安裝體驗 在 Mac OS 系統中&#xff0c;雖然不支持 apt-get install&#xff0c;但我們有幸擁有 Homebrew 這樣出色的包管理器。它為我們在 Mac 上安裝各種所需軟件提供了極大的便利。 一、安裝 Homebrew 要安裝 Home…

算法提高之加成序列

算法提高之加成序列 核心思想&#xff1a;迭代加深 dfs 從上往下逐漸增大depth 這樣下面沒有用的方案就不用遍歷了 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 110;int n;int path[N];//當前求哪個位置…

PDF編輯閱讀器PDF Expert for Mac v3.10.1中文激活版

PDF Expert for Mac是一款易于使用的 PDF 編輯器和注釋器&#xff0c;專為 Mac 設備設計。它允許用戶輕松查看、編輯、簽名、注釋和共享 PDF。該軟件使用戶能夠向他們的 PDF 添加文本、圖像、鏈接和形狀&#xff0c;突出顯示和標記文本&#xff0c;填寫表格以及簽署數字文檔。它…

STL----resize

resize的作用 設置容器元素個數和初始值。 resize和reserve resize即改變容器元素個數&#xff0c;也改變容器容量。 reserve只改變容器容量&#xff0c;不改變容器元素個數。 reserve有什么用 reserve---存儲&#xff0c;容量&#xff0c;保留。 1&#xff0c;設置容器容…

Python實現麥克風錄音保存到wav

功能展示&#xff1a; 運行環境&#xff1a; Python: 3.10.4 64-bit 操作系統&#xff1a; 截圖環境&#xff1a;win10 64-bit 視頻錄屏環境&#xff1a;win10 64-bit 功能說明&#xff1a; 點擊界面開始按鈕開始錄音&#xff0c;點擊停止按鈕結束錄音。 源碼文件列表&…

十二生肖Midjourney繪畫大挑戰:釋放你的創意火花

隨著AI藝術逐漸進入大眾視野&#xff0c;使用Midjourney繪制十二生肖不僅能夠激發我們的想象力&#xff0c;還能讓我們與傳統文化進行一場新式的對話。在這里&#xff0c;我們會逐一提供給你創意滿滿的繪畫提示詞&#xff0c;讓你的作品別具一格。而且&#xff0c;我們還精選了…

掃碼槍與Input的火花

文章目錄 前言一、需求&#xff1a;交互細節二、具體實現兩個核心的函數&#xff1a;自動聚焦 三&#xff0c;擴展知識input 與 change的區別 前言 在瀏覽器掃描條形碼獲取條形的值&#xff0c;再操作對應的邏輯。這是比較常見的業務&#xff0c;這里記錄實際操作。 其中PC端…

2023年國賽高教杯數學建模C題蔬菜類商品的自動定價與補貨決策解題全過程文檔及程序

2023年國賽高教杯數學建模 C題 蔬菜類商品的自動定價與補貨決策 原題再現 在生鮮商超中&#xff0c;一般蔬菜類商品的保鮮期都比較短&#xff0c;且品相隨銷售時間的增加而變差&#xff0c;大部分品種如當日未售出&#xff0c;隔日就無法再售。因此&#xff0c;商超通常會根據…

JSON 轉為json串后出現 “$ref“

問題描述 轉為JSON 串時出現 "$ref":"$.RequestParam.list[0]" $ref&#xff1a; fastjson數據重復的部分會用引用代替&#xff0c;當一個對象包含另一個對象時&#xff0c;fastjson就會把該對象解析成引用 “$ref”:”..” 上一級 “$ref”:”” 當前對…

2、架構-服務間的通信

遠程服務將計算機程序的工作范圍從單機擴展至網絡&#xff0c;從本地延 伸至遠程&#xff0c;是構建分布式系統的首要基礎。而遠程服務又不僅僅是為 分布式系統服務的&#xff0c;在網絡時代&#xff0c;瀏覽器、移動設備、桌面應用和服 務端的程序&#xff0c;普遍都有與其他設…

分布式搜索-elaticsearch基礎 安裝es

這里是在虛擬機的Linux系統里安裝es的教程: 1.創建網絡 在Finashell終端輸入指令 docker network create es-net 2.將es.tar安裝包放入tmp的目錄下 輸入指令加載鏡像&#xff1a;docker load -i es.tar 3.再運行docker 命令 docker run -d \--name es \-e "ES_JAVA_O…