10月开始牙位图,一开始是老大给了张图片,说能不能实现,有没有想法,我原本以为是图像处理,给出了可以尝试当时程序中已经存在的一段处理人体图(OXH所写,已离职)的代码处理试试,然后老大让开始做demo,过程如下:
1. 找到程序出处,来自ipad一个牙位图程序,售价299美元,简单了解操作流程。

2. 尝试自己用Tilemap架构 设计了一个牙位图demo,采用CImage+双缓冲,引入了层的概念, 并且采用图片替换的方法,而非图像处理,效果不错,但是局限性在Tilemap地图式架构不够灵活,CImage只能简单图像处理。

2. 由于采用图像替换,需要大量的图片,而部门中没有美工无法提供,所以尝试先从ipa牙位图中提取程序,并且提取出资源图片png(mac编码和windows不同,费了一些时间),提取出1800张图片,变相的发现了其实ipad牙位图也是采用的图像替换的方法。

3. 确定非图像处理,而是采用图像替换,即一种状态一种图像,开始重构牙位图架构(想做成通用),参考了cocos程序的架构(2D引擎),引入了场景的概念,并且使用GDI+替换CImage,使图像处理更加灵活(埋下祸根,后文再表),写了3个基础框架类Scene->Layer->canvas。

4. 制作类似ipad上的菜单,采用牙位图相同架构,制作出效果类似的demo, 并且引入帧的概念,实现动画效果,但是以在PC上不如使用右键菜单的理由被否决…

附上结构图:

以上就差不多实现了一个除具体业务外的功能系统。

接下来是优化的过程,起源来自于我无意中发现,开启牙位图后,我的CPU占用会达到12%左右,此前设计中,我是采用定时器来定时刷新界面,刷新频率为100MS,我的电脑是I5 4200U,虽然是U核,但是也属于不错的CPU了,想想现场的老爷机,还是优化吧。

1.一开始怀疑是定时器的问题(后来发现不是),猜测可能是因为定时器设置频率过快,导致每一帧还没刷完(也就是图片放入统一缓存,再打到屏幕)一帧,下一个定时器又来了,导致了等待,所以CPU占用高。

解决方法:使用线程,主线程中调用绘图线程,绘图线程设置了无限绘图,每绘一次 sleep(50),CPU占用仍然是12%左右,帧数是9帧/S,排除了是定时器的问题, 这时也发现了帧数很低,说明绘图的过程很慢。

2.接下来发现内存跳动很快,猜测是绘制过程中不断的new了,发现Graphics 在构造函数中new了对象(构造函数new.....),等于是每一帧都new一次,释放一次,改为成员变量,发现CPU占用不见好转,但是内存相对稳定(其实看不大出来)。

3.然后接下来的问题要先说说程序的架构,牙位图是由一张缓存图片,然后将LAYER缓存(缓存:其实有一个更新标志,如果未更新,就是一张图片图片,更新,则重新生成缓存,把一系列图片绘制在一张图片缓存中)打入缓存中,然后绘制选择流动矩形框,最后再将这张缓存打到屏幕上。查看了层Layer发现有60几层,30几层牙齿+30几层文字,其实在平时不动的时候绘制,这60几层是不变的,变的只有流动矩形框,所以再做一层缓存,只在这60几层中的缓存更新时再进行重绘的操作。相当于一个空间换时间的操作。完成后发现CPU大概到10左右,仍然不明显。

4.该想的优化都做了,谷歌吧,发现了几篇文章说是GDI+的问题,可以提到帧速(这和CPU什么关系,扯远了),特别的DrawImage,效率十分低下,而且如果不在一开始指定图片缓存特定格式,则生成的缓存格式为不定,参考一篇外文,http://www.codeproject.com/Tips/66909/Rendering-fast-with-GDIplus-What-to-do-and-what-no.aspx ,全部初始化为PixelFormat32bppPARGB格式,发现CPU显著降低了,大概在4%左右。

5.最后的最后本来想做GDI+和GDI混合使用的优化,因为GDI在这块效率会比GDI+好,但是项目时间问题,没有继续。

总结下优化:
        // 1、缓存GDI+对象,避免构造函数的new操作
// 2、只在层中有变化时重新绘制场景,其余则只在场景之上绘制矩形框,然后打到屏幕
// 3、构造函数时format为相同格式图片,避免不同格式各种转换消耗CPU
// 4、尽量使用GDI,而不是GDI+,特别是DrawImage,效率非常低下(此条未实现)
// 参考文章:http://www.codeproject.com/Tips/66909/Rendering-fast-with-GDIplus-What-to-do-and-what-no.aspx
// 还有其他相关文章关键词:GDI+优化

至此,就是一些业务性的东西了,附上一些性能的图片吧

优化前:

优化后:

记 移植ipad牙位图相关推荐

  1. 分享用Adobe Air向iOS移植游戏的经验

    分享用Adobe Air向iOS移植游戏的经验 http://gamerboom.com/archives/47931 发布时间:2012-02-21 17:04:42 Tags:Adobe Air, ...

  2. ipad如何分屏_基于ipad的生态型无纸化学习说明书

    设施清单 硬件: ipad2018 ➕保护套 apple pencil✏️(一代) iphone8 :1⃣️配合app实现文件扫描,然后隔空投送至iPad上:2⃣️通过笔记类app的iCloud同步功 ...

  3. ArcGIS Engine 实现注记引线的设置

    需求描述: 因为注记在地图上标注会出现冲突的情况,所以需要将冲突的注记移植没有冲突的位置,当移出的位置超过一定距离后,就需要添加引线,来明确标注位置关系.目标效果,如图: 如何解决问题: 找到关键词, ...

  4. 嵌入式 Mplayer的移植、使用

    嵌入式 Mplayer的移植.使用 一.简述        记--移植开源的Mplayer,并在arm开发板简单的使用Mplayer播放音频.        打包:链接:https://pan.bai ...

  5. 新人新博客新学习家园

    MFC如何显示位图 51CTO 这是我第二天加入51,感觉这里的学习气氛非常浓厚,开始了自己计算机道路! 我是在校学生,第一次接触C++,MFC,对于这些有着许多兴趣,无论学习的过程多么艰辛,都希望能 ...

  6. 《iOS应用软件设计之道》—— 2.5 何时画草图

    本节书摘来自华章出版社<iOS应用软件设计之道>一 书中的第2章,第2.5节,作者:(美)William Van Hecke ,更多章节内容可以访问云栖社区"华章计算机" ...

  7. 【YOLOV5-5.x 源码解读】common.py

    目录 前言 0.导入需要的包和基本配置 1.基本组件 1.1.autopad 1.2.Conv 1.3.Focus 1.4.Bottleneck 1.5.BottleneckCSP 1.6.C3 1. ...

  8. 【考研经验】2018福州大学考研初试+复试心得

    转载于王道论坛,原文作者为:皮霸霸 点击原文链接,可进入原帖. 2018考研,福州大学,计算机技术专硕,初试总分366,含数二107,英二85,政治66,863专业课108.复试76.6分,拟录取. ...

  9. ISO8583包[详细说明]

    最开始时,金融系统只有IBM这些大的公司来提供设备,象各种主机与终端等.在各个计算机设备之间,需要交换数据.我们知道数据是通过网络来传送的,而在网络上传送的数据都是基于0或1这样的二进制数据,如果没有 ...

最新文章

  1. php 500 内部服务器错误,php 500 - 内部服务器错误的解决方法
  2. STC8G1K单片机软件执行时间物理测量
  3. 分析模式:可复用的对象模型学习笔记
  4. 3、使用Statement接口实现增,删,改操作
  5. php图片变成代码怎么解决,一段图片处理代码PHP代码转C#代码,该怎么解决
  6. leetcode116. 填充每个节点的下一个右侧节点指针(层序遍历07)
  7. Spring3系列7- 自动扫描组件或Bean
  8. 概率中比较重要的知识
  9. 抗侧力构件弹性位移如何计算_说一说现在很火的装配式建筑怎么计算?
  10. 机器学习作业班_python神经网络搭建
  11. ad建集成库_AD16创建集成库的步骤
  12. IE 浏览器旧版本下载
  13. 在线vip全网音乐搜索下载源码
  14. java天猫精灵_教你玩转天猫精灵:把设备接入天猫精灵
  15. Photoshop:PS如何实现放大图片不模糊
  16. 2021-09-09 一个python代码验证身份证号码
  17. 2019.6.21 NOIP2018提高组模拟题(二)
  18. CS:APP Archlab(未完待续)
  19. Unity 径向模糊 简易解决方案
  20. 微软自带dns服务器,微软改进Windows 10加密DNS服务器配置(DoH) 现在设置起来更方便...

热门文章

  1. PCI相关(3)- PCIe概述
  2. 一级计算机word字处理教程,四川省计算机一级WORD字处理题库.doc
  3. 输电线路状态监测装置通用技术规范即I1协议
  4. 浅谈NFT抵押借贷的三种模式:点对点、资金池和中心化模式
  5. 水墨屏开发设备,旧 Kindle 改造而成
  6. 高等数学:可微,可导关系详解
  7. 3款国产软件,让你工作效率翻倍,白嫖党的最爱,还不来看
  8. 福利| 一台电脑,双网卡,三个IP地址,如何同时工作
  9. Java工程师面试1000题1-10
  10. OpenSSL密码库算法笔记——第3.1.1章 模加