使用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),内部会自动对矩形进行分裂与合并.当矩形过于碎小时,会自动对其做合并处理.记得写这算法碰到的最多问题是该刷新的地方没有刷新,造成界面的残影.

我所遭遇过的游戏中间件--FlashOcx的更多相关文章

  1. 我所遭遇过的游戏中间件---SpeedTree

    我所遭遇过的游戏中间件---SpeedTree SpeedTree是一个专门用于渲染植被的中间件,并提供了一套完善的植物编辑工具.在它官方提供的DEMO中,你会看到高度逼真的树木和植物,在风的影响下树 ...

  2. 我所遭遇过的游戏中间件---nvDXTLib

    我所遭遇过的游戏中间件---nvDXTLib nvDXTLib是Nvidia提供的一套用于DXT纹理压缩SDK.接口十分简洁,就是提供了几个纹理压缩的函数,其中我使用最多的函数是: DXTLIB_AP ...

  3. 我所遭遇过的游戏中间件---HumanIK

    我所遭遇过的游戏中间件---HumanIK Autodesk HumanIK游戏中间件,为游戏创建更加可信.真实的角色动画.该中间件的全身逆向运动(FBIK)系统支持角色真实地与所在环境及其它角色进行 ...

  4. 我所遭遇过的游戏中间件--Kynapse

    我所遭遇过的游戏中间件--Kynapse Autodesk Kynapse游戏中间件是一款面向游戏开发.非玩家控制角色实时模拟的领先的人工智能解决方案.Kynapse具有先进的路径查找功能,比如三维路 ...

  5. 我所遭遇过的游戏中间件--Scaleform

    我所遭遇过的游戏中间件---Scaleform Scaleform帮助开发人员利用现代系统的三维硬件加速性能创建电影品质的菜单.游戏内HUD,动画纹理.迷你游戏以及移动游戏与应用.Scaleform作 ...

  6. 我所遭遇过的游戏中间件---Redux

    我所遭遇过的游戏中间件---Redux 一.关于Redux Substance Redux 是一款纹理处理软件加中间件,专门用于纹理生成和压缩.具其用户指南介绍,它能够对纹理集进行优化,可以将现有压缩 ...

  7. 我所遭遇过的游戏中间件--Apex

    我所遭遇过的游戏中间件--Apex Apex是PhysX的扩展中间件,它是在PhysX的基础上封装了一层.用于实现布料,粒子,破碎这三种物理效果.我只研究其布料处理.使用Apex做物理最大的好处是:它 ...

  8. 我所遭遇过的游戏中间件--PhysX

    我所遭遇过的游戏中间件--PhysX PhysX现在是Nvidia的物理中间件.其特点是简练且功能强大.当我最初拿到PHYSX的SDK时,就发现这个物理中间件比Havok要小很多,但该有的功能都有,甚 ...

  9. 我所遭遇过的游戏中间件--Havok

    我所遭遇过的游戏中间件--Havok Havok是我接触的第一款游戏中间件,那是在五,六年前,我刚刚毕业,对游戏开发还是个菜鸟.我记得先是对游戏场景中的地形和其他静态物体生成刚体,然后做角色的Ragd ...

随机推荐

  1. 8-15 Shuffle uva12174

    题意: 你正在使用的音乐播放器有一个所谓的乱序功能,即随机打乱歌曲的播放顺序.假设一共有s首歌,则一开始会给这s首歌随机排序,全部播放完毕后再重新随机排序.继续播放,依此类推.注意,当s首歌播放完毕之 ...

  2. OneDrive开发入门

    OneDrive API提供了对存储在OneDrive上文件的访问能力,大多数API都遵循REST模式,少部分的API可以通过简单的函数来调用 在使用OneDrive API之前要先了解两个简单的概念 ...

  3. Spring技术内幕:设计理念和整体架构概述(转)

    程序员都很崇拜技术大神,很大一部分是因为他们发现和解决问题的能力,特别是线上出现紧急问题时,总是能够快速定位和解决. 一方面,他们有深厚的技术基础,对应用的技术知其所以然,另一方面,在采坑的过程中不断 ...

  4. Python使用正则

    Python中使用正则的两种方式 在Python中有两只能够使用正则表达式的方式: 直接使用re模块中的函数 import re re_string = "{{(.*?)}}" s ...

  5. 打开tcp_tw_recycle引起的一次投诉分析

    背景: 我们有个基于oauth2.0协议给第三方授权以及信息的业务,年前对接入层.业务层做了次迁移.业务架构简单介绍下: lvs接入---> nginx ---> tomcat   问题: ...

  6. Vue methods和computed

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 怎么处理stdClass::__set_state

    处理后 处理方法 function object2array_pre(&$object) { if (is_object($object)) { $arr = (array)($object) ...

  8. [HNOI2011]数学作业 --- 矩阵优化

    [HNOI2011]数学作业 题目描述: 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M ,要求计算\(Concatenate(1..N)\; Mod\; ...

  9. [BZOJ2716]天使玩偶

    [BZOJ2716]天使玩偶 题目大意: 一个平面直角坐标系,坐标\(1\le x,y\le10^6\).\(n(n\le10^6)\)次操作,操作包含以下两种: 新增一个点\((x,y)\): 询问 ...

  10. Codeforces Round #288 (Div. 2) C. Anya and Ghosts 模拟 贪心

    C. Anya and Ghosts time limit per test 2 seconds memory limit per test 256 megabytes input standard ...