内存画布ps画布大小是什么意思思

手机性能的提高,是超大RAM的充分不必要条件。
「手机技术的革新难道不是为了增强实用体验吗? 还真不是。」
之前搞机哥曾科普过,在选择一部手机的时候并不需要过于在乎一部手机的内存(ROM),内存越大,我们可以存储的文件就越多,但它并不会使我们的手机变得流畅。我们真正需要在意的是手机的运行内存(RAM)。之前很多手机遭到淘汰,其实就是因为它们的运行内存跟不上手机程序与APP的变化。这也使得手机的运行内存在最近几年里一涨再涨。
近年来手机RAM容量飙升
苹果公司的第一代 iPhone 产品的运行内存是128MB,2008年的首款安卓手机 HTC G1也只有192MB。搞机哥记得手机RAM在很长一段时间里还维持了256MB的配置。2012年的 iPhone 5 已经达到 1GB RAM,并在之后的几代产品上都保留着1GB RAM 的标配,直到 iPhone 6s 的2 GB 运存,然后据说马上将要发布的 iPhone 7 的运行内存还要增加;
至于安卓阵营,RAM 的增长就更是飞快,2012年的安卓旗舰三星 Note 就已经拥有了2GB RAM,仅仅过了一年它的note3 的运行内存就已经飙升到了3GB。后来随着 64 位 Android 系统以及 64 位处理器的出现,Android 阵营4GB RAM 几乎成了新旗舰的标配,近期国产厂商更是率先推出了 6GB 超大内存手机。
与此同时,超高的 RAM 也成了各大手机厂商口中的卖点,大有得RAM的天下之势。
那么问题来了,手机的跑分不可信,ROM 不关键,那么这个 RAM 就真的越大越好吗?
在搞清楚这一点之前,我们必须再重新强调一遍手机运行内存到底是干嘛的。
手机的运行内存,即随机存取存储器(random access memory,RAM)又称作“随机存储器”,是与CPU直接交换数据的内部存储器,也叫主存(内存)。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介。我们的手机中所有的程序都是在RAM中进行的,其读写速度和容量大小对手机的性能表现起着关键作用。一般来说,RAM 确实是越大越好,尤其是对 Android 手机而言。智能手机在最近几年经历的存储内存(ROM)、CPU 工艺以及显示屏分辨率等技术革新,都有赖于 RAM 容量的增加。可以这么说,智能手机要实现更多的功能和更优的体验,就必须要拥有更大的 RAM 容量。
手机体验的优化一定要倚仗RAM的增加,那么RAM的增大就一定可以改善手机的使用体验吗?未必。
大容量的 RAM 很重要,但并不是越大越好。
一个很喜闻乐见的例子,iOS 系统的 2GB RAM 可以匹敌甚至超越安卓系统的 4GB RAM。这是因为合适的 RAM 容量+合适的处理器+合适的系统,手机的使用体验才能达到最佳状态。假如手机在提升RAM的同时,没有把处理器等其他协同工艺以及系统等软件版本同步提升的话,手机的使用体验就不会有实质性的改变。
而 iOS 系统之所以不需要太大的运行内存,除了手机系统与处理器的配合程度较好,也因为 iOS 封闭式的系统。它的内存管理机制会让那些活动较少的程序尽快退出内存,这样就可以载入更多新的程序。也就是说,iOS 的系统会在内存吃紧的时候,自动去清理那些经程序判断用户没有使用着的后台程序。而 Android 系统则会把后台开启的每一个程序都保存在内存中,直到内存已经完全被占满。当它不够启动下一个新程序时,Android 才会清理那些之前开启的部分进程。这显然就增加了手机 RAM 的压力。
既然手机的性能不会实质性的提高,那为什么依然还有很多厂商在争相恐后地提升着自己的运行内存呢?
其实这些厂商这么做除了满足流畅运行以及多任务操作等用户需求外,更多的是为了在营销的数字上显得更加突出。我们可以这么理解,他们做出 RAM 越来越大的手机,很大程度上不是为了给用户们用的,而是让用户们看的。
既然你们不喜欢厚重的手机,那么我们就让机身一薄再薄,容易损坏也没关系;既然你们喜欢大屏幕,那我们就让手机屏幕越来越大,突破天际,你们拿着不方便也没关系;既然你们这么在乎 RAM,那我们就让手机的运行内存一涨再涨,谁又会去在乎手机的性能到底因此有了多大提升……
噱头大于体验,除了不断增加的 RAM,手机厂商们似乎还乐于将处理器核数、手机像素、“超高”的手机颜值、超薄的手机机身等等类似的东西拿出来大声叫卖。与其说在做手机,还不如说是在做营销。而在如今移动设备乐此不疲地奔向更大运行内存的路上,搞机哥希望厂商不要舍本逐末,在 RAM 提升的同时,也能在与处理器、操作系统等方面实现优化,为用户体验努一把力。
本文系搞机哥(微信ID:gaojigg)原创,首发于百略网,未经许可禁止商业转载,欢迎转发到朋友圈,如需授权或商业合作请联系微信:xiaoxintech或QQ:。图片以及部分素材来自互联网,如有涉及侵权,请联系我们删除。
本文来自微信公众账号提交,由微讯啦收录,转载请注明出处。
微信扫码 分享文章当前位置:>> >> 画布
大家都在找的词语:
按拼音查词语:
huà bùㄏㄨㄚˋ ㄅㄨˋ
基本解释◎ 画布 hu&b&[canvas(for painting)] 用于绘制油画的麻布或涂有石膏的布英文翻译1.canvas (for painting)详细解释(1).古时覆盖祭器的一种细布。(2).画油画所用的布,大多是麻布。今天在学习用内存DC画图,终于有了初步了解。现将收集的关于内存DC介绍及其相关操作的资料贴出来共享一下。
今天在学习用内存DC画图,终于有了初步了解。现将收集的关于内存DC介绍及其相关操作的资料贴出来共享一下。
DC&即Device&Context,是GDI内部的一个资料结构,一个DC会和某个特定的显示设备(如打印机、屏幕等)产生关联。我们如果能取得该DC的handle&那我们便可以在这显示设备上写字、画图。
在Form&或Picturebox中都有一个hdc的属性,指的便是这东西,但是,怎么又会有一个Memory&DC呢?这是一个存在记忆体内的&dc&,它除了不像form&picturebox能将图形、文字显示出来之外,其他的几乎都相同,它也可以用在所有的&GDI&API&呼叫之上,其实我们在VB中早就有使用上这&Memory&DC&了,只是没有自觉。当我们设&form&picturebox的AutoRedraw&=&True时,&hdc所指的便是Momoory&DC,这时我们在其上作绘图动作,都没有显示在form上,这便是先前说的,它只是在记忆体中,不会真的画出图。而我们下&refresh指令时,便是将这MemoryDC上的图,copy到&form/PictureBox上。
  另外我们也可以使用CreateCompatibleDC()&API&它传入一个&hDc&,代表产生的&Memory&DC和&hdc相容,若传0则是与屏幕相容的&Memory&DC&hMemDC&=&CreateCompatibleDC(0)
  这时候,该hMemDC所指的绘图区有多大呢?其实只有一个单色Pixel,直到我们使用SelectObject(&hMemDC,&hBitmap)
  那hMemDC显示区就会有和hBitmap一样的宽度、高度、颜色选择等。&而且我们在hMemDC上的任何绘图,也都会反映在&hBitMap上,也就是说,原本hBitMap所指的图,在SelectObject(hMemDC,&hBitMap)后,我们使用gdi函式在hMemDC上画一条线,那么该hBitmap所指的图也会有一条线了。
那么Memory&DC又有什么作用呢?
我们知道,&在使用VC开发图形相关的应用程序时,常常需要使用MFC的CDC类直接把图形画在窗口上。这通常是通过响应Windows的WM_PAINT消息实现的。如果要画的图形比较复杂,或者比较大,那么画图过程可能会造成窗口的闪烁。当窗口调整大小时,这种闪烁由为明显。
解决窗口闪烁问题的有效办法就是使用内存DC,也称为缓冲DC。在内存中准备一个和窗口DC相同属性的DC,在这个内存DC上执行画图操作。完成画图以后,把画图输出的内容整体复制到目标窗口DC上。因为画图操作不在窗口DC上进行,所以在画图的过程中窗口可以保持原来的内容。当画好的内容被复制到窗口DC时,因为复制操作执行的非常快,所以用户感觉窗口仿佛被立刻被画好,从而消除了从旧画面到白板再到新画面的闪烁现象。
生成内存DC主要用到以下四个函数:
CreateCompatibleDC(CDC*&pDC&)。CDC类的成员函数,用于创建一个和pDC指向的DC兼容的内存DC。
CreateDiscardableBitmap(&CDC*&pDC,&int&nWidth,&int&nHeight)。CBitmap类的成员函数,用于按指定尺寸创建一个和pDC指向的DC兼容的位图。&&&&
SelectObject(CBitmap&*&pBitmap)。CDC类的成员函数,执行以后,所有在该DC上的图像输出都将被画到pBitmap指向的位图上。
BOOL&BitBlt&(int&x,&int&y,&int&nWidth,&int&nHeight,&CDC*&pSrcDC,&int&xSrc,&int&ySrc,&DWORD&dwRop&)。CDC类的成员函数,用于从源DC(pSrcDC)复制一个矩形的图象到当前DC中。
&好了,目前我所能理解到的原理就是上面的样子,下面来看看具体应该怎样操作吧。
对于一个窗口,我们可以用下面的代码来创建内存DC,在内存DC上输出,并最终复制到窗口DC上。
C/C++ code12345678910111213141516171819202122void&PaintWnd(CWnd&*&pWnd){&&&&&CDC&*&pWndDC&=&pWnd-&GetWindowDC();&&&&&CRect&WndRect&=&pWnd-&GetWindowRect();&&&&&CDC&MemDC;&&&&&CBitMap&MemB&&&&&&MemDC.CreateCompatibleDC(pWndDC);&&//&创建内存DC&&&&&MemBitmap.CreateCompatibleBitmap(&&//&创建兼容的位图&&&&&&&&&pWndDC,&&&&&&&&&WndRect.Width(),&&&&&&&&&WndRect.Height());&&MemDC.SelectObject(MemBitmap);&&//&让内存DC输出到位图(我的理解就是选择画布)&&&&&//&使用MemDC画图&&&&&……&&&&pWndDC-&BitBlt(//&从内存DC复制到窗口DC&&&&&&&&&0,0,&&&&&&&&&WndRect.Width(),&&&&&&&&&WndRect.Height(),&&&&&&&&&&MemDC,&&&&&&&&&&0,0,&&&&&&&&&SRCCOPY);}
当然,实际的情况下,我们需要考虑的更多,因为内存DC、位图的创建都可能会失败。为了简化代码,此处定义了一个类CMemoryDC,包装了内存DC创建过程中的出错处理,内存DC的事后清理等操作,并自动复制内存DC的内容到目标DC上。
声明CMemoryDC类的头文件MemoryDC.h如下:
C/C++ code1234567891011121314151617181920#pragma&once&#include&"Afxwin.h"&&&&class&CMemoryDC&{&public:&&&&&&CMemoryDC(CDC&*dc,&RECT&*&rect,bool&autoRender&=&false);&&&&&&~CMemoryDC(void);&&&&&&&&&bool&IsOK();&&&&&&void&Render(CDC&*&p_objectDC&=&NULL);&&&&&&CDC*&GetMemoryDC();&&&&&&operator&CDC&*&();&private:&&&&&bool&m_bAutoR&&CRect&m_DCR&&&CDC*&m_pOriginalDC;&&&&&CDC&m_MemoryDC;&&&&&CBitmap&m_MemoryB};
类的实现文件CMemoryDC.cpp如下:
C/C++ code12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455&#include&".MemoryDC.h"&&&&CMemoryDC::CMemoryDC(CDC&*dc,&RECT&*&rect,&bool&autoRender)&&{&&&&&&&&&&m_bAutoRender&=&autoR&&&&&&m_pOriginalDC&=&&&&&&&if&(dc==NULL&||&rect==NULL)&&&&&&&&&&return;&&&&&&if&(!m_MemoryDC.CreateCompatibleDC(dc))&&&&&&&&&&return;&&&&&&m_DCRect.SetRect(rect-&left,&rect-&top,&rect-&right,&rect-&bottom);&&&&&&&&&if&(!m_MemoryBmp.CreateCompatibleBitmap(dc,&m_DCRect.Width(),&m_DCRect.Height()))&&&&&&&&&&return;&&&&&&m_MemoryDC.SelectObject(m_MemoryBmp);&}&&&&CMemoryDC::~CMemoryDC(void)&&{&&&&&&if&(m_bAutoRender)&&&&&&&&&&Render();&&&&&&if&(m_MemoryDC.m_hDC!=NULL)&&&&&&&&&&m_MemoryDC.DeleteDC();&&&&&&if&(m_MemoryBmp.m_hObject!=NULL)&&&&&&&&&&m_MemoryBmp.DeleteObject();&}&&&&bool&CMemoryDC::IsOK()&&{&&&&&&return&m_MemoryDC.m_hDC!=NULL&&&&m_MemoryBmp.m_hObject&!=&NULL;&&&&}&void&CMemoryDC::Render(CDC&*&p_objectDC)&&{&&&&&&if&(!IsOK())&&&&&&&&&&return;&&&&&&&&&CDC&*&pDC&=&(p_objectDC==NULL&?&m_pOriginalDC&:&p_objectDC);&&&&&&CSize&Size&=&m_MemoryDC.GetViewportExt()&;&&&&&&pDC-&BitBlt(&&&&&&&&&&m_DCRect.left,&&&&&&&&&&&m_DCRect.top,&&&&&&&&&&m_DCRect.Width(),&&&&&&&&&&m_DCRect.Height(),&&&&&&&&&&&m_MemoryDC,&&&&&&&&&&&0,0,&&&&&&&&&&SRCCOPY);&}&CDC*&CMemoryDC::GetMemoryDC()&&{&&&&&&return&&&m_MemoryDC;&}&CMemoryDC::operator&CDC&*&()&&{&&&&&&return&&&m_MemoryDC;}
使用这个类可以大大简化内存DC的创建操作。如果我们在窗口消息WM_PAINT的响应函数中使用内存DC,只要用如下这样简便的代码便可实现:
&C/C++ code123456789CRect&R&GetClientRect(Rect);&CPaintDC&dc(this);&//&device&context&for&painting&&&&&&CMemoryDC&MemDC(&dc,&Rect,&true);&&&&&&if&(MemDC.IsOK())&&&&&&&{&&&&&&&&&&//&使用MemDC画窗口&&&&&&&}&&&&&//&MemDC析构时会自动把图像复制到dc,无需其它操作使用CMemoryDC创建内存DC防止窗口闪烁,编程的代码和不使用内存DC时相比,数量和复杂性几乎没有增加。
另外,关于此文章的word文档我也上传了,需要的朋友可去下载。http://download.csdn.net/source/1381542
相关主题推荐:
相关帖子推荐:
发表评论:
TA的最新馆藏}

我要回帖

更多关于 内存mhz是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信