13. 内存设备

内存设备是emWin的一种绘图机制,可以用在各种绘图操作中,可以通过它实现一些华丽炫酷的界面效果。 不过其最主要的作用是用来消除在绘制重叠项目时出现的屏幕闪烁。

13.1. 内存设备简介
内存设备消除屏幕闪烁的基本思路很简单,不使用内存设备时,每一步绘制操作都会直接写入屏幕, 这就导致屏幕刷新时内容出现闪烁,例如要显示一张位图并在位图上绘制透明文本,首先必须绘制位图, 然后绘制透明文本,那么效果就是文本会出现闪烁。如果使用内存设备,所有的绘制操作都在内存中进行, 绘制完成后才更新到屏幕,所以没有闪烁。所谓闪烁其实就是屏幕出现了明显可观察到的绘图过程, 而内存设备机制只将绘制完成的图形写入屏幕,所以观察不到明显的绘图过程,也就消除了闪烁。
在这里插入图片描述
表格 内存设备使用效果 是绘制同一种图形时使用存储设备和不使用存储设备的不同效果,分为两种情况。 第一种情况不使用内存设备,屏幕必须先清除,然后再依次显示旋转后的矩形和字符串;第二种情况使用内存设备, 绘图的步骤和之前相同但在内存中执行,此时屏幕不刷新,调用GUI_MEMDEV_CopyToLCD函数更新屏幕,并且一更新就反映出所有的绘图操作。

内存设备可以与窗口管理器(下一章节讲解)完美配合。每个窗口都有一个标志位,告诉窗口管理器是否应该使用内存设备进行渲染。 此标志位可在创建窗口时指定,也可随时设置或重置。如果为特定窗口设置了内存设备标志位,那么窗口管理器将自动使用内存设备进行窗口绘制。 窗口管理器会在绘制窗口之前创建一个内存设备,并在绘制完成后删除这个内存设备。如果创建的内存设备有足够多的内存, 那么整个窗口都会放到内存设备中进行绘制,如果这个内存设备的可用内存无法绘制完整窗口,则窗口管理器会使用“分段”来绘制窗口。 用于绘图操作的内存只在绘图操作期间分配,如果在绘制或重绘窗口时没有足够的可用内存,则不使用内存设备进行绘制或重绘窗口。

13.2. 内存要求
内存设备使用的是位于GUIConf.c中GUI_ALLOC_AssignMemory函数分配的内存块,也就是emWin内存的一部分, 所占用的大小取决于内存设备的色彩深度以及是否需要支持透明度。

13.2.1. 不支持透明度的内存设备
表格 不支持透明度的内存使用情况 显示了不支持透明度的内存设备在不同色彩深度下的内存需求。
在这里插入图片描述
例如创建一个X方向为111像素,Y方向为33像素,16bpp色深的内存设备,不支持透明度。那这个内存设备的所需字节数计算方法如下:

所需字节数 = 111 * 33 * 2 = 7326 bytes

13.2.2. 支持透明度的内存设备
表格 支持透明度的内存使用情况 显示了支持透明度的内存设备在不同色彩深度下的内存需求。 支持透明度的内存设备与不支持透明度的内存设备相比,除了32bpp色深之外,其余色深每8个像素就多出1个字节,用于管理透明度信息。
在这里插入图片描述
例如创建一个X方向200像素,Y方向50像素,8bpp色深的内存设备,支持透明度。那这个内存设备的所需字节数计算方法如下:

所需字节数 = ( 200 + ( 200 + 7 ) / 8) * 50 = 11250 bytes

13.3. 内存设备API
emWin提供的存储设备相关API函数比较多,其中还涉及到一些旋转、测量、动画和模糊混合等高级功能, 这里我们只介绍一些基础和常用的API函数,见表格 内存设备API函数 。

在这里插入图片描述
13.3.1. GUI_MEMDEV_CopyToLCD()
将内存设备的内容从内存复制到LCD。

代码清单:内存设备-1 函数原型

void GUI_MEMDEV_CopyToLCD(GUI_MEMDEV_Handle hMem );
  1. hMem: 内存设备的句柄。

该函数忽略窗口管理器的剪切区域和alpha通道。因此,不建议在paint事件中使用此函数。为了显示关于剪切区域和alpha通道的内存设备,应该使用函数GUI_MEMDEV_WriteAt()。

13.3.2. GUI_MEMDEV_CopyToLCDAt()
将内存设备的内容复制到LCD的指定位置。

代码清单:内存设备-2 函数原型

void GUI_MEMDEV_CopyToLCDAt(GUI_MEMDEV_Handle hMem, int x, int y);
  1. hMem: 内存设备的句柄;

  2. x: 指定的X位置;

  3. y: 指定的Y位置。

13.3.3. GUI_MEMDEV_Create()
创建一个内存设备。

代码清单:内存设备-3 函数原型

GUI_MEMDEV_Handle GUI_MEMDEV_Create(int x0, int y0, int xSize,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值