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 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

【转载】XHTML 结构化之二:案例分析:W3school 的结构化标记

无论如何,不要跳过本节。阅读本章将增进你的技能,为你的网页减肥,并且使你对标记与设计之间的差异有更清晰的认识。本章中的理念是易于学习的,但是却能极大的提高网站的...

36416
来自专栏web前端教室

聊一下JavaScript定时器

image.png 话说JS的定时器,常用的其实就是setTimeout和setInterval这二个。它们俩一个是运行一次就拉倒,另一个是你不叫我停我就一...

2389
来自专栏彭湖湾的编程世界

【响应式】foundation栅格布局的“尝鲜”与“填坑”

提到响应式,就不得不提两个响应式框架——bootstrap和foundation。在标题上我已经说明白啦,今天给大家介绍的是foundation框架。 何为“尝...

39211
来自专栏小程序之家

如何在小程序中实现视频播放

在如何使用小程序媒体组件这篇文章中,我们简单介绍了video视频组件的使用,这篇文章中,将对视频播放做一些补充,同时介绍API的使用。

15.2K3
来自专栏CDA数据分析师

那人的Excel技巧好烂,他做1个小时,别人29秒搞定

本文为简书作者傲看今朝原创,CDA数据分析师已获得授权 ”智能表格“在Excel中就是叫表格,恐怕是Excel当中最不起眼最受人忽视,却极其实用的功能之一,可以...

2155
来自专栏程序员互动联盟

【专业文章】六种常见的HTML5写法误用(一)

一、不要使用section作为div的替代品 人们在标签使用中最常见到的错误之一就是随意将HTML5的<section>等价于<div>——具体地说,就是直接用...

3375
来自专栏hightopo

基于 HTML5 WebGL 的低碳工业园区监控系统

1547
来自专栏一场梦

学习网页制作其实并不难

2203
来自专栏腾讯社交用户体验设计

[ISUX译]iOS 9人机界面指南(四):UI元素(下)- 腾讯ISUX

1493
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

轻松搞定MarkDown

MarkDown是什么? MarkDown是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber)。它允许人们“使用易读易写的纯文本格式编写文档。M...

4115

扫码关注云+社区

领取腾讯云代金券