工作原因接触了Gfx Scaleform 3.1。本人表示此东东异常强大。但是要用好他有很多性能问题,不仅仅是程序时要考虑的!更需要美术和FLASH制作人员共同努力。
关于GFX具体是什么东西以及干什么用的。本人不做介绍,只是谈论一下使用时的一些思考和经验之谈。因为相关方面的文章几乎没有,而且又是商业系统。所以,就在这里做个小小的总结。
1. Flash中的Object对象可以完全由C++代码进行实现,并且在Flash中进行调用。包括Function函数。凭借这点我们可以让客户端的逻辑拥有脚本接口,并且提供给Flash数据和控制客户端的接口。
2. Flash中的TextField控件由Gfx进行了一定的扩展,所以关于HTML的使用上除了<img>标记基本与常规情况下的Flash相同,关于<img>标记的使用就必须要涉及到第三点所提到的相关内容了。理由:GFX中的<img>无法直接从外部取相对路径的图片文件。
3. Flash中的图片加载问题需要C++进行实现与管理,Gfx只提供了简单的接口GImageBase,具体实现以及图片内存管理都需要客户端进行处理。包括动画图片以及可渲染图片,都可以进行实现。当然,如果图片本身包含在相应的Flash文件(.FLA)中可以直接通过到处标记符加载,无需通过客户端。
关于图片加载问题,最值得说明的是设备重置问题, 设备一旦发生丢失后,就必须要调用Gfx的相关函数使其Renderer进行重置,否则Gfx可能无法继续进行运行。然后,也是最关键的一点,就是设备重置前必须先告知并且释放GImageBase相关的接口。否则。重置是无法成功的。最后一点,就是托管图片与非托管图片的问题以及引用计数的问题 都是必须要注意的。以上后面几点属于细节问题。因此我就不多提了(如果遇到问题请看红字亮点)。
4. 焦点问题,在一般的单窗口,单菜单界面的游戏环境中可能不会遇到问题,但是在复杂且多窗口的情况下,这个问题就凸显出来了。我主要介绍2种技巧,一个是利用FLASH的Selection侦听器,可以知当前所选MovieClip的信息,还有就是利用CLIK框架中的FocusManager来得知当前焦点的信息,通过以上2个技巧可以全面了解当前FLASH环境下焦点是处于什么控件上,并且用来区分是 文字输入框 还是 普通按钮。
5. 窗口击穿的问题,在很多游戏中,窗口往往是透明的,例如聊天文本框。如果是通过FLASH的HITTEST或者使用GFX提供的HITTEST函数执行效率非常差。因为会完全遍历所有MOVIECLIP。所以有一个简单的方法就是将背景设置为FLASH的"按钮",然后利用GFX提供的getTopEntity函数,高效的获取当前鼠标光标正处于什么控件上。从而得出当前是否能够有效击穿窗口结果。
6. 文字渲染问题,GFX还提供了一套文字渲染系统,并且能够直接渲染HTML文字,但是这个系统并不是完美的,和FLASH中的textField有所不同,他不支持内嵌图片,同时还有一个文档中未说明的技巧,就是TEXTFORMAT标签的使用。如果有朋友遇到文字显示格式的问题,可以去查查看。
7. 字体问题,根据GFX的介绍,字体问题有3种解决方案,但是根据实际使用,只有一种方案比较有效,就是利用C++建立GFXFONTMAP,并引入内嵌完整字体的SWF。另外2种方案对于中文环境的支持比较糟糕。很多非主流文字都无法正常显示。
8. 自定义控件的设计,CLIK框架非常强大,所以详细的阅读其代码是非常有必要的,特别是CORELIST与SCROLLLIST这2个类,并且我们可以通过此2类的学习,可以设计出各种必要的控件。
最后。。。如果想到新的我会加的。