使用Flash做游戏界面的另一种方式是通过Abode提供flash.ocx处理Flash界面.将Flash图像通过GDI绘制出来后,再将图像数据拷贝到一个D3D的纹理结构中,最后由引擎的D3D接口进行渲染。用它来做游戏UI界面的好处就是方便,快捷.做出来的Flash在Abode的播放器中什么样,那么在游戏客户端中的就是什么样.不用担心什么显示不一致,脚本不支持之类的问题.另一方面,FlashOcx对AS脚本的处理效率比Scaleform强得多.但最大的问题就是渲染效率,毕竟需要做大量的像素拷贝工作,这很耗时.

在项目中,一开始使用FlashOcx做UI界面,后来买了Scaleform,就成了两种并存的情况.再后来的两年半时间里,有若干次的想把所有FlashOcx的界面翻成Scaleform的.这个翻界面的工作不是我做,本来我认为不是什么难事,毕竟二者的资源都是Flash的SWF文件.但翻改起来,工作量比想像中的大得多.

FlashOcx这个模块起初不是我写的,后来它的原作者走了,而正巧我在搞Scaleform,好歹与Flash有关联,于是这个模块的维护工作就落在我头上.整个集成代码可读性不强,完全是调用其接口,这一块没什么好说的,无非是依照着Demo,比着葫芦画瓢.好吧,我承认这一块我也不太熟悉.

我对该模块做的最大的工作是实现了一套脏矩形合并算法.FlashOcx之所以卡,是因为像素拷贝耗时大.优化的办法自然而然就是降低其像素拷贝量.之前的矩形合并策略是简单的矩形合并方式,取更新矩形的作左上点和最右下点形成新的矩形.这种策略会导致这样的问题,如果左上角有一块小矩形更新,右下角有一块小矩形更新,合并的矩形就会相当大,从而重复绘制很多很多东西,导致效率低下。我写了一个脏矩形管理对象:

 class DirtyRects
{
public:
LONG left;
LONG top;
LONG right;
LONG bottom;
std::vector<RECT> m_vecRect; public:
DirtyRects();
void Clear();
void AddRect(const RECT& updateRect);
};

外部只需调用若干次AddRect(updateRect),内部会自动对矩形进行分裂与合并.当矩形过于碎小时,会自动对其做合并处理.记得写这算法碰到的最多问题是该刷新的地方没有刷新,造成界面的残影.

最新文章

  1. Android 从零开始打造异步处理框架
  2. c++聪聪看书(满分代码)
  3. Atom markdown .md 编写格式技巧
  4. .NET中的标识符、关键字 以及 .NET中的命名规范
  5. sql常识-like
  6. [React Native] Error Handling and ActivityIndicatorIOS
  7. Class.forName()的理解
  8. sizeof()的用法
  9. log4net的分类型输出文件的配置
  10. SpringMVC框架学习笔记(3)——controller配置汇总
  11. [Awson原创]修水渠(canal)
  12. #7 找出数组中第k小的数
  13. spring mvc 参数绑定
  14. touch.js 手机端的操作手势
  15. Splay详解
  16. Vue + Element UI 实现权限管理系统 前端篇(十二):用户管理模块
  17. 轻量级web框架cicada----(转)
  18. HDU 3537 基础翻硬币模型 Mock Turtles 向NIM转化
  19. js模板引擎之artTemplate
  20. list 去重复元素

热门文章

  1. idea 设置svn忽略 .idea内的文件
  2. PhantomJS 远程做调试
  3. PHP反序列漏洞学习
  4. NetCore+Dapper WebApi架构搭建(四):仓储的依赖注入
  5. CSS基础-DAY1
  6. 一列道出yield和生成器的真谛
  7. php开启memcache扩展
  8. Codeforces 1073G Yet Another LCP Problem $SA$+单调栈
  9. TortoiseGit + msysgit 记住帐号密码方法及使用密匙的方法
  10. Problem B: 七龙珠II