本文原地址: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的实用逻辑分析仪源码工程。

【扫盲贴】为什么屏幕分辨率是 640x480的更多相关文章

  1. 修复 VirtualBox 下 Ubuntu 14.10 屏幕分辨率问题

    在 Windows 7 下使用 VirtualBox 安装了一个 Ubuntu 14.10 后,碰到了一个 640×480 屏幕分辨率的问题. 在 ‘Display Settings' 设置界面的 ‘ ...

  2. 利用 xrandr 命令修改屏幕分辨率

    问题背景 电脑外接着一个 23' 的显示器,分辨率为 1920*1080. 操作系统:ubuntu 14.04 今天,通过 Setting->Displays 中选择外接屏的分辨率时,发现最大只 ...

  3. Ubuntu 更改屏幕分辨率

    安装完Ubuntu后发现分辨率不合适,平时习惯了看小一点的文字,所以搜了一下修改屏幕分辨率的命令,具体操作如下: 1.先用 xrandr 命令查看一下当前系统支持的分辨率 wayde@wayde-Al ...

  4. centos 7 修改系统屏幕分辨率

    centos 7 修改系统屏幕分辨率,命令方式和图形方式的修改方法. 命令:xrandr 通过命令 xrandr 修改系统的分辨率,输入xrandr: bash [admin@localhost ~] ...

  5. Ubuntu12.04设置屏幕分辨率

    Ubuntu屏幕分辨率设置 Table of Contents 1 概述 2 设置前 3 设置 4 参考 1 概述 我的Ubuntu12.04不知道被我怎么折腾了一番,屏幕的分辨率错乱了,没有办法找到 ...

  6. Ubuntu设置屏幕分辨率

    Ubuntu设置屏幕分辨率 原创 2016年10月14日 13:01:24 14900 在虚拟机装好Ubuntu,进入系统分辨率是800*600,打开显示界面设置下分辨率,设置完怎么也选不上应用,于是 ...

  7. cocos2d-x屏幕分辨率,窗口大小总结

    这个东西很烦人,相信很多人都不理解 今天来总结一下,首先有很多概念都要事先弄得清楚明白 1.屏幕分辨率 所谓屏幕分辨率相信很多人都知道他的概念,不就是1280pxX720PX吗?不就是这种形式吗?有什 ...

  8. VirtualBox中Ubuntu 14.04屏幕分辨率不能设置的问题

    VirtualBox中Ubuntu 14.04屏幕分辨率不能设置的问题   在VirtualBOx虚拟机中Ubuntu 14.04设置屏幕分辨率,怎么点都没反应. 方法一:安装与你的Ubuntu-Gu ...

  9. (转)JS获取当前对象大小以及屏幕分辨率等

    原文 JS获取当前对象大小以及屏幕分辨率等   <script type="text/javascript">function getInfo(){       var ...

随机推荐

  1. 跨境B2B电商

    主要处理问题:解决整个支付和流通环节,各国双方的供应商和销售商只关注下单支付后就可以拿到货物,中间环节由平台处理,支付和流通环节消费越少速度越快服务越好. 主体业务 1.合同处理. 2.货币支付,互换 ...

  2. windows administrator提升system

    最近刚好有这个需求,本想开一个super cmd,但是win10上不兼容不太好. 于是使用PsExec来提升system权限. 微软传送地址:https://docs.microsoft.com/en ...

  3. 微信登录失败,redirect_uri域名与后台配置不一致,错误代码10003

    微信登录失败,redirect_uri域名与后台配置不一致,错误代码10003 1 先检查网页的授权域名  不要带http:// 2 检查下自己的appid是否正确 我换了appid没上传,多花了时间 ...

  4. [z]计算机架构中Cache的原理、设计及实现

    前言 虽然CPU主频的提升会带动系统性能的改善,但系统性能的提高不仅仅取决于CPU,还与系统架构.指令结构.信息在各个部件之间的传送速度及存储部件的存取速度等因素有关,特别是与CPU/内存之间的存取速 ...

  5. leetcode671

    class Solution { public: vector<int> V; void postTree(TreeNode* node) { if (node != NULL) { V. ...

  6. Elasticsearch-2.4.3的3节点安装(多种方式图文详解)(含 head、kopf、marvel、shield和watcher插件安装和使用)

    前提: Elasticsearch-2.4.3的下载(图文详解) Elasticsearch-2.4.3的单节点安装(多种方式图文详解) 我这里,以192.168.80.10(HadoopMaster ...

  7. 关于LOH(Large Object Heap)及内存泄漏

    关于LOH(Large Object Heap)的. .NET CLR中对于大于85000字节的内存既不像引用类型那样分配到普通堆上,也不像值类型那样分配到栈上,而是分配到了一个特殊的称为LOH的内部 ...

  8. postman的使用方法详解

    Collections:在Postman中,Collection类似文件夹,可以把同一个项目的请求放在一个Collection里方便管理和分享,Collection里面也可以再建文件夹.如果做API文 ...

  9. atom 配置备忘

    插件 vim-mode-plus vim-mode-plus-ex-mode plateformio-ide-terminal    'cmd窗口 docblockr 帮助你快速的生成注释 linte ...

  10. spring源码解析之AOP原理

    一.准备工作 在这里我先简单记录下如何实现一个aop: AOP:[动态代理] 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式: 1.导入aop模块:Spring AOP:(s ...