CN103383662A - 一种解决Windows GDI绘图产生内存碎片的方法 - Google Patents
一种解决Windows GDI绘图产生内存碎片的方法 Download PDFInfo
- Publication number
- CN103383662A CN103383662A CN2013101516709A CN201310151670A CN103383662A CN 103383662 A CN103383662 A CN 103383662A CN 2013101516709 A CN2013101516709 A CN 2013101516709A CN 201310151670 A CN201310151670 A CN 201310151670A CN 103383662 A CN103383662 A CN 103383662A
- Authority
- CN
- China
- Prior art keywords
- memory
- device context
- memory device
- bitmap
- window
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Digital Computer Display Output (AREA)
Abstract
一种解决WindowsGDI绘图产生内存碎片的方法,该方法包括:在系统构建时新建一个类,在这个类中创建一个全局静态唯一的内存位图对象和两个全局静态唯一的内存设备上下文对象;定义在系统启动初始化时,初始化内存位图对象和内存设备上下文对象,所有窗口类都继承类,在这些窗口类中的OnPaint()方法中直接调用内存设备上下文对象来进行界面的描绘操作。本发明方案可在使用WindowMFCGDI进行GUI绘图时,对于每个窗口描绘时都会使用到的内存设备上下文对象和内存位图对象不必自己创建,只需使用已经创建好的全局唯一的内存设备上下文对象和内存位图对象,避免每次描绘都去重新创建分配内存,减少了因为频繁创建而占用的CPU时间,提高了系统运行的稳定性和速度。
Description
技术领域
本发明涉及一种WINDOWS系统内存的管理方法改进技术。
背景技术
Windows是一种图形用户界面的操作系统,它把包括文本在内的所有数据都显示为屏幕上的图像。Windows把与绘图有关的操作都制作成函数,GDI(Graphical Device Interface,简称GDI)是用户可以调用的一套绘图操作的函数集,用来在显示设备硬件与程序员之间进行隔离的徐牛绘图环境叫做设备描述环境DC(Device Context,简称DC),它屏蔽了显示设备的特性,给程序员提供了一个统一的绘图界面。
在嵌入式系统中的资源如CPU频率、内存大小都受到严格的限制,而且对系统的响应实时性也有一定的要求,同时对于系统的人机界面的效果要求也越来越高;所以在嵌入式系统中,高效的代码执行效率以及内存管理机制都显得至关重要。
Windows应用程序的界面是由一个个称为“窗口”的部件组成,窗口的描绘效果最终形成了界面的显示效果。界面的描绘都是对应窗口的OnPaint()方法中完成的,而通用的绘图方法是:绘图时先创建一个与窗口客户区DC兼容的内存DC,然后在这个内存DC中进行一系列的绘图操作后,最后通过BitBlt方法将内存DC中的绘图结果位块传输到目标窗口DC CPaintDC中完成窗口的描绘。
在图形用户界面的系统中,界面切换或者界面状态的更新动作很频繁,所引起的绘图操作也很频繁,界面的每个窗口(包含界面本身)发现变化时(被点击、文本更新、位置移动),Windows系统都会发送消息触发窗口的绘图操作;而每次绘图操作都会创建内存DC和内存兼容位图,长时间频繁绘图操作后,由于Windows没有内存回收和管理机制,会导致不连续的内存碎片产生,如果系统在某一时刻需要使用大块内存,则会出现系统内存余量足够但是无法成功分配的问题,而长时间不重启在嵌入式系统中很常见。
另外,频繁地进行创建和删除DC以及位图操作,会使界面显示占用太多的CPU时间,浪费了宝贵的CPU资源。
发明内容
有鉴于此,本发明提供一种解决Windows GDI绘图产生内存碎片的方法,该方法可有效解决在窗口描绘时频繁创建和销毁导致内存设备上下文对象和内存位图对象而导致内存碎片问题。
本发明采取的设计方案为:
一种解决Windows GDI绘图产生内存碎片的方法,该方法包括:
11).预先在系统构建时新建一个类CBaseControl,在这个类CBaseControl中创建一个全局静态唯一的内存位图对象和两个全局静态唯一的内存设备上下文对象;
12).定义在系统启动初始化时,初始化内存位图对象和内存设备上下文对象,所有窗口类都继承类CBaseControl,在这些窗口类中的OnPaint()方法中直接调用两个全局静态唯一的内存设备上下文对象来进行界面的描绘操作。
其中,在b步骤中内存位图对象和内存设备上下文对象初始化方法为:
21).先创建客户区内存设备上下文(CClientDC)dc,
22).将内存设备上下文对象创建为与客户区内存设备上下文兼容的内存设备上下文,
23).将内存设备上下文设置为透明的输出,
24).将内存位图对象创建为与客户区内存设备上下文兼容的内存位图,
25).选择内存位图对象到内存设备上下文中,完成内存位图对象和内存设备上下文对象的初始化。
本发明方案可在使用Window MFC GDI进行GUI绘图时,对于每个窗口描绘时都会使用到的内存设备上下文对象和内存位图对象,而不必自己创建,只需使用已经创建好的全局唯一的内存设备上下文对象和内存位图对象,在每个窗口对象的描绘过程中直接使用这个全局的设备环境和内存位图,避免每次描绘都去重新创建分配内存,从而避免因为描绘不停申请分配内存所导致的内存碎片的问题,减少了因为频繁创建而占用的CPU时间,提高了系统运行的稳定性和速度。
具体实施方式
为了让本领域的技术人员更好地理解本发明的技术方案,下面结合实施例对本发明作进一步阐述。
本方法采用的解决Windows GDI绘图产生内存碎片的方法是将每次窗口描绘时需要执行的相同操作(创建内存DC、内存兼容位图)独立提取出来,在系统启动过程中完成初始化创建的工作,创建一个全局静态的内存DC m_dcTemporary以及全局静态的内存位图m_bitmapTemporary;在系统运行的整个生命周期内,在每个需要描绘的地方都使用这个内存DC和内存位图,而不用频繁的去执行创建和销毁的操作,既减少了频繁创建导致的内存碎片,同时减少每次窗口描绘的操作,减少了窗口描绘的时间,减少了因为频繁创建而占用的CPU时间。
具体过程如下:
一种解决Windows GDI绘图产生内存碎片的方法,该方法包括:
11).预先在系统构建时新建一个类CBaseControl,在这个类CBaseControl中创建一个全局静态唯一的内存位图对象m_bitmapTemporary和两个全局静态唯一的内存设备上下文对象m_dcTemporary和m_dcBitmap;
12).定义在系统启动初始化时,初始化内存位图对象m_bitmapTemporary和内存设备上下文对象m_dcTemporary和m_dcBitmap,所有窗口类都继承类CBaseControl,在这些窗口类中的OnPaint()方法中直接调用两个全局静态唯一的内存设备上下文对象m_dcTemporary和m_bitmapTemporary来进行界面的描绘操作。
在创建一个全局静态的内存设备上下文m_dcTemporary以及全局静态的内存位图m_bitmapTemporary两个变量后,系统启动时,内存位图对象和内存设备上下文对象初始化方法为:
21).先创建客户区内存设备上下文(CClientDC)dc,代码为:CClientDC dc(NULL);
22).将内存设备上下文m_dcTemporary创建为与客户区内存设备上下文兼容的内存设备上下文,代码为:m_dcTemporary.CreateCompatibleDC(&dc);
23).将内存设备上下文m_dcTemporary设置为透明的输出,代码为:m_dcTemporary.SetBkMode(TRANSPARENT);
24).将内存位图对象m_bitmapTemporary创建为与客户区内存设备上下文兼容的内存位图对象,代码为:m_bitmapTemporary.CreateCompatibleBitmap(&dc, 800, 480);
25).选择内存位图对象m_bitmapTemporary到内存设备上下文m_dcTemporary中,代码为:m_pOldTemporaryBitmap = m_dcTemporary.SelectObject(&m_bitmapTemporary);
至此,内存位图对象和内存设备上下文对象的初始化完成,继承该类CBaseControl的子类就可以直接操作这两个对象了。
同时,可采用如下方式对传统方式和本实施例方法效果进行测试对比:
首先编写一个测试基于MFC对话框的小应用程序,创建一个界面,在界面上创建5个按钮和5个文本框,通过定时器周期性(5秒)的随机的向按钮和文本发送WM_PAINT消息触发OnPaint()方法的执行,OnPaint()方法中采用自行创建dcTemporary和bitmapTemporary,连续测试15小时。测试完成后,获取系统的当前剩余可用内存大小(总大小不超过剩余大小),然后连续申请指定大小空间的内存。在针对传统方式的测试中,发现系统提示无法分配足够内存,而针对本实施例方法技术方案的测试中,发现系统可以分配内存。
该测试说明:虽然系统有一定的内存,但是内存中包含了大量的内存碎片,申请一整块内存时,发现系统根本没有足够连续的内存可以被分配,导致申请分配内存失败,而采用本发明的方法是确实可行有效。
以上为本发明较佳的实现方式,需要说明的是,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,这些改变和变形都应属于本发明所附的权利要求的保护范围。
Claims (2)
1.一种解决Windows GDI绘图产生内存碎片的方法,其特征在于,该方法包括:
11).预先在系统构建时新建一个类CBaseControl,在这个类CBaseControl中创建一个全局静态唯一的内存位图对象和两个全局静态唯一的内存设备上下文对象;
12).定义在系统启动初始化时,初始化内存位图对象和内存设备上下文对象,所有窗口类都继承类CBaseControl,在这些窗口类中的OnPaint()方法中直接调用两个全局静态唯一的内存设备上下文对象来进行界面的描绘操作。
2.根据权利要求1所述的解决Windows GDI绘图产生内存碎片的方法,其特征在于,在b步骤中内存位图对象和内存设备上下文对象初始化方法为:
21).先创建客户区内存设备上下文(CClientDC)dc,
22).将内存设备上下文对象创建为与客户区内存设备上下文兼容的内存设备上下文,
23).将内存设备上下文设置为透明的输出,
24).将内存位图对象创建为与客户区内存设备上下文兼容的内存位图,
25).选择内存位图对象到内存设备上下文中,完成内存位图对象和内存设备上下文对象的初始化。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310151670.9A CN103383662B (zh) | 2013-04-27 | 2013-04-27 | 一种解决Windows GDI绘图产生内存碎片的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310151670.9A CN103383662B (zh) | 2013-04-27 | 2013-04-27 | 一种解决Windows GDI绘图产生内存碎片的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103383662A true CN103383662A (zh) | 2013-11-06 |
CN103383662B CN103383662B (zh) | 2016-06-22 |
Family
ID=49491459
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310151670.9A Active CN103383662B (zh) | 2013-04-27 | 2013-04-27 | 一种解决Windows GDI绘图产生内存碎片的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103383662B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106775690A (zh) * | 2016-12-02 | 2017-05-31 | 广东威创视讯科技股份有限公司 | 一种基于gdi/gdi+窗口被覆盖的录制方法及装置 |
CN107357576A (zh) * | 2017-06-30 | 2017-11-17 | 惠州市德赛西威汽车电子股份有限公司 | 一种Windows应用程序多窗口并行绘图的方法及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040057078A1 (en) * | 2002-09-20 | 2004-03-25 | Coffin Roderick Franklin | Method and system for printing |
CN101296375A (zh) * | 2008-06-12 | 2008-10-29 | 北京中星微电子有限公司 | 实现远程桌面演示的方法、系统及终端 |
-
2013
- 2013-04-27 CN CN201310151670.9A patent/CN103383662B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040057078A1 (en) * | 2002-09-20 | 2004-03-25 | Coffin Roderick Franklin | Method and system for printing |
CN101296375A (zh) * | 2008-06-12 | 2008-10-29 | 北京中星微电子有限公司 | 实现远程桌面演示的方法、系统及终端 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106775690A (zh) * | 2016-12-02 | 2017-05-31 | 广东威创视讯科技股份有限公司 | 一种基于gdi/gdi+窗口被覆盖的录制方法及装置 |
CN107357576A (zh) * | 2017-06-30 | 2017-11-17 | 惠州市德赛西威汽车电子股份有限公司 | 一种Windows应用程序多窗口并行绘图的方法及系统 |
CN107357576B (zh) * | 2017-06-30 | 2020-07-28 | 惠州市德赛西威汽车电子股份有限公司 | 一种Windows应用程序多窗口并行绘图的方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN103383662B (zh) | 2016-06-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110704136B (zh) | 小程序组件的渲染方法、客户端、电子设备及存储介质 | |
CN110007983B (zh) | 粒子喷射动画的实现方法、介质、装置和计算设备 | |
TW201537343A (zh) | 應用場景的識別方法、功耗管理方法、裝置及終端設備 | |
CN105630939A (zh) | 一种通用画布输入接口设计方法及装置 | |
US10325574B2 (en) | Simultaneous display method, system, equipment based on QT embedded | |
JP2015528145A5 (zh) | ||
CN104301788A (zh) | 一种提供视频交互的方法和装置 | |
CN107506247A (zh) | 一种基于异步回调的任务处理方法与设备 | |
CN104267931A (zh) | 一种信息处理方法及电子设备 | |
CN103383662A (zh) | 一种解决Windows GDI绘图产生内存碎片的方法 | |
CN104020849A (zh) | 基于Windows CE的多程序同时显示方法及系统 | |
CN105487868A (zh) | 实现安卓设备虚拟按键隐藏和显示的方法和系统 | |
CN110908675B (zh) | 运行环境获取方法、装置和电子设备 | |
CN106874010B (zh) | 一种Android系统中ListView快速分页加载的方法 | |
WO2023169221A1 (zh) | 一种跨系统运行应用程序的方法及电子设备 | |
US10331474B2 (en) | Machine system, physical machine, and memory control method | |
JP2021068414A (ja) | ラッピング方法、登録方法、装置、レンダリングディバイス、及びプログラム | |
CN102799423A (zh) | Jsf中执行动态方法的方法及装置 | |
CN101944036B (zh) | 一种基于工业监控系统的ria应用的内存优化方法 | |
CN103927078A (zh) | 一种信息处理方法及电子设备 | |
CN105159647A (zh) | 屏幕刷新方法及其装置 | |
US9338248B2 (en) | Parameter driven value conversion framework in client/server architectures | |
CN111273934A (zh) | 页面更新的方法及装置 | |
CN102096622A (zh) | 基于事件驱动实时获取系统中进程信息的方法及系统 | |
CN105718291A (zh) | 一种混合桌面应用的多级缓存加速方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information |
Address after: 516006 Guangdong province Huizhou City Zhongkai high tech Zone and five West Road No. 103 Applicant after: HUIZHOU DESAY SV AUTOMOTIVE CO., LTD. Address before: 516006 Guangdong province Huizhou City Zhongkai high tech Zone and five West Road No. 103 Applicant before: Huizhou Desay SV Auto. Electronics Co., Ltd. |
|
COR | Change of bibliographic data | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |