专栏首页逍遥剑客的游戏开发Flash在DirectX中的绘制

Flash在DirectX中的绘制

这里使用的是之前我说过的OLE控件在Direct3D中的渲染方法, 自己不进行swf的解析, 这不现实.

  • 前提条件: COM编程, OLE编程, DirectX编程, ActionScript/Flash(可选).
    • 创建一个ShockwaveFlashObjects::IShockwaveFlash的对象
    • 实现一个IOleClientSite来做为IShockwaveFlash的容器
  • 绘制
    • 通过OleDraw来把GDI的像素数据绘制到DC上(IShockwaveFlash是一个IViewObject)
    • 把DC的像素数据拷贝到D3D的Texture上. 中间涉及像素格式的内存操作, 需要明白图像数据的内存格式.
    • 半透明支持(可选): 如果不需要半透明支持的话, 其实可以直接OleDraw到Texture的DC上, 不用再多一次拷贝. 但是有时候不得不用(像UI), 可以这参考Transparent Flash Control in plain C++, 用黑色背景和白色背景绘制两次, 比较两次结果 的Red通道计算出相应的Alpha值.
    • 脏矩形优化: 如果每帧都进行整个纹理的更新, 你会发现CPU占用率相当高. 实际上ActiveX本身是有这个优化的, 只不过我们需要自己找出这个矩形. 通过实现IOleInPlaceSiteWindowless::InvalidateRect可以得到相应的"脏"矩形区域, 然后只需要更新相应的纹理区域就可以让效率达到商用的标准.
  • 事件响应
    • 幸运的是, IShockwaveFlash是一个IOleInPlaceObjectWindowless对象, 那么我们就可以直接使用IOleInPlaceObjectWindowless::OnWindowMessage进行消息的处理. 注意鼠标坐标的转换和键盘输入焦点的控制.
  • 脚本交互, 参考MFC的思路:
    • C++调用AS: IShockwaveFlash::CallFunction/SetVariable
    • AS调用C++: 需要实现ShockwaveFlashObjects::_IShockwaveFlashEvents, 可以监听fscommand和ExternalInterface.call两种调用方式.

关于具体实现, 已经有人先于我完成了, 所以请直接参考Hikari. 接下来再把IE搞定

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nebula3学习笔记(5): IO系统

    逍遥剑客
  • GDC2017: PlayStation VR Worlds中的渲染优化

    逍遥剑客
  • 星际2的地形

    逍遥剑客
  • 520 还是一个人么?学学前辈吴恩达和姚期智怎么找对象

    场景描述:又是一年 520 ,狗粮吃够了吗?考虑到大家爱吃瓜的特点,超神经在这个特别的日子,特地为大家奉上两对计算机大神的唯美爱情故事。

    HyperAI超神经
  • 聊聊 Python 的单元测试框架(二):nose 和它的继任者 nose2

    nose[1] 是一个第三方单元测试框架,它完全兼容 unittest,并且号称是一个更好用的测试框架。

    Python猫
  • 卷积滤波器与边缘检测

    高低频率 高频图像是强度变化很大的图像。并且亮度级别从一个像素到下一个像素快速变化。低频图像可以是亮度相对均匀或变化非常慢的图像。这是一个例子中最容易看到的。

    小飞侠xp
  • 精准测试及其工具(连载12)

    Bug按日趋势图直观地反映Bug提交趋势,点击折线图上的点会显示相应的Bug组成。图91显示。

    小老鼠
  • 游戏分析法(二):感受资料和内在联系

    很多时候我们在研究一款游戏的时候,会停留在之前的“表象资料”阶段:我们搜集了很多这个游戏的数据,也写了评测报告,甚至拆解了游戏的美术资源和关卡数据。但是这些还未...

    韩伟
  • storm(1)-物理机的安装

    storm.zookeeper.servers: ["10.189.108.107","10.189.108.108","10.189.108.109"] ...

    yiduwangkai
  • C++调用C函数

    前言:以前见到extern "C"这样的语句,只是简单地知道跟外部链接有关,但是没有深刻理解它的意思。 首先,为什么要使用extern "C"修饰符? C++调...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券