前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flash在DirectX中的绘制

Flash在DirectX中的绘制

作者头像
逍遥剑客
发布2018-05-23 16:04:38
1.8K0
发布2018-05-23 16:04:38
举报

这里使用的是之前我说过的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搞定

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010年06月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档