【掃盲貼】為什么屏幕分辨率是 640x480


本文原地址:http://www.easyx.cn/skills/View.aspx?id=172     

常見的屏幕分辨率很奇怪,為什么總用一些不零不整的數字?比如以前最常見的分辨率是 640x480,當初為什么這么設計?

因為這個分辨率運算速度比較快,人也相對比較好記。

大家知道,屏幕上的每一個點,都會對應內存中的一個位置。比如 640x480@256色,表示每個點占用一個字節,整個屏幕有 640x480=300k 個點,占用 300KB 內存。屏幕的每一個像素的保存,在內存中是線性存儲結構。在屏幕上的坐標 (x, y) 畫一個點,就相當於在對應顯存偏移 y * 640 + x 的位置賦值。

PS:在這篇文章中有一段代碼,可以實踐一下通過內存賦值來直接畫點:http://www.easyx.cn/skills/View.aspx?id=55

每繪制一個點,都需要執行一次乘法和一次加法運算。所有的繪圖操作都需要調用畫點函數,因此提高畫點的效率,將會提升所有繪圖操作的速度。

現在我們將計算內存偏移量的算法修改一下:

d = y * 640 + x

   = y * (512 + 128) + x

   = y * 512 + y * 128 + x 

   = y * 2^9 + y * 2^7 + x

   = y << 9 + y << 7 + x

於是,1 次乘法 1 次加法,就修改為了 2 次移位 2 次加法。學過計算機組成原理的同學應該知道,修改后的算法雖然繁瑣,但是性能提高了數倍。

這也是為什么采用 640 的原因。

常見的分辨率,都可以拆分為 2 的 n 次方的和差運算,例如: 

 640 = 512 + 128= 2^9 + 2^7
 768  = 512 + 256 = 2^9 + 2^8
 800 = 512 + 256 + 32 = 2^9 +2^8 + 2^5
 1024 = 2^10
 1152 = 1024 + 128 = 2^10 + 2^7
 1280 = 1024 + 256 = 2^10 + 2^8
 1920 = 2048 - 128 = 2^11 - 2^7

基於前面講的原理,大家可以將其應用在最基礎的畫點上,以提升算法的效率。

不過現在 CPU 里面都有乘法器單元,寫程序時直接用乘法性能也不差。但是在硬件實現上,這個數值還是很有意義的。

小梅哥補充:
隨着現在筆記本電腦的普及,身邊的台式機電腦也越來越少,台式機顯示器也更加不容易獲得。大家在學習FPGA,做VGA顯示圖像等應用時往往就因為沒有顯示器而無法進行。為此,小梅哥FPGA團隊特設計了一款5寸800*480分辨率的TFT顯示屏,該顯示屏的驅動時序和VGA顯示器完全一致,大家使用VGA顯示器的驅動代碼修改幾個時序參數,就可以用來直接驅動該顯示屏。該顯示屏可以直接用於小梅哥團隊設計生產的所有FPGA開發板,也可以用於正點原子阿波羅系列STM32開發板。提供基於FPGA的實用邏輯分析儀源碼工程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM