<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>James Li 的四维空间</title>
	<atom:link href="http://jamesli.cn/blog/index.php?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://jamesli.cn/blog</link>
	<description>我相信，高手在民间</description>
	<lastBuildDate>Fri, 30 Mar 2012 10:31:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[中英文对照] Adobe Flash Player中的高级功能</title>
		<link>http://jamesli.cn/blog/?p=1445</link>
		<comments>http://jamesli.cn/blog/?p=1445#comments</comments>
		<pubDate>Thu, 29 Mar 2012 14:11:53 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[行业动态]]></category>

		<guid isPermaLink="false">http://jamesli.cn/blog/?p=1445</guid>
		<description><![CDATA[原文：http://www.adobe.com/devnet/flashplayer/articles/premium-features.html
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
Adobe Flash Player Premium Features for Gaming
Adobe Flash Player中的游戏高级功能
Bring console quality experiences to the web and reach the largest gaming audience in the world, without friction or fragmentation.
通过网页一步到位地为全球最多的游戏群体带来高端游戏机级别的游戏体验。
Flash Player premium features for gaming enable developers and publishers to deliver stunning web-based games across browsers to over a billion computers—dramatically expanding the market for a new [...]]]></description>
		<wfw:commentRss>http://jamesli.cn/blog/?feed=rss2&amp;p=1445</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>翻译一篇文章，20条开发AIR Native Extension的建议</title>
		<link>http://jamesli.cn/blog/?p=1438</link>
		<comments>http://jamesli.cn/blog/?p=1438#comments</comments>
		<pubDate>Wed, 21 Mar 2012 13:34:40 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://jamesli.cn/blog/?p=1438</guid>
		<description><![CDATA[这篇文章写得非常好，基本包括了目前ANE开发需要的所有注意事项，感谢作者Richard Lord
原文地址：http://www.richardlord.net/blog/20-tips-for-creating-air-native-extensions-for-ios
文中我会以作者的口吻来翻译
过去的三个月中我为iOS平台创建了三个AIR Native Extension的扩展(在Github中可以找到代码),这些扩展全部被用在我们的游戏Stick Cricket Super Sixes中，同时我们也总结了很多经验。虽然我记得并不全面，但下面这几条建议，可以给很多打算开发ANE项目的开发者助以一臂之力。
&#8212;&#8212;&#8212;&#8212;-
文档
&#8212;&#8212;&#8212;&#8212;-
1. 开始
这两篇文档对初学者很有帮助，如果你不知道该如何起步，可以从阅读这两篇文档开始。在网络上也有很多好的文章，只要Google一下就行了。
•	Extending Adobe Air
•	AIR Native Extension Example: iBattery for iOS
2. 阅读Adobe官方文档
大部分的开发所需的资料在这篇 Adobe’s documentation 中都可以找得到。
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
编写Actionscript代码
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
3. 认真编写 Actionscript API
确保你的Actionscript接口是你的项目中想要的。不要往Actionscript里被动地照搬iOS接口，要像编写常规Actioscript类那样定义你的接口。
记住，后期如果修改原生代码只会影响到ANE扩展本身，但如果修改Actionscript接口则会影响到所有使用该ANE的项目。所以在前期要尽可能完善地定义你的Actionscript接口。
4. 尽可能在Actionscript一端做错误检查
为了避免错误的发生，你需要在调用ANE方法的时候做参数合法性的检查，你可以等到调用原生代码时再做检查，但如果提前在调用Actionscript接口的时候就做检查会更简单一些。如果你能保证每次调用原生代码时都不会出错，比如参数个数和参数类型，那么完全可以只在Actionscript里做判断。
当然，如果你习惯于在C里写错误检查，当然可以。我个人更喜欢在Actionscript里做这件事情。
5.  创建一个原生类的替身
即使你打算仅为iOS写扩展，我也建议你创建一个原生类库的替身。用纯Actionscript代码创建这个替身，这样它就可以为所有的平台所用。在这个替身里按照iOS原生接口定义一套纯Actionscript接口方法，即使在调用的时候抛异常或者返回空值也没有关系，至少它是合法的Actionscript调用，而且可以在其他平台比如桌面上测试使用。
如果不用这样一个替身，你就每次只能在iOS设备上做测试，这样会让开发测试工作极为痛苦。相反，如果使用这个替身，你可以在桌面上快速发布应用来测试那些与设备不相关的功能和模块。
&#8212;&#8212;&#8212;&#8212;&#8212;-
编写原生代码
&#8212;&#8212;&#8212;&#8212;&#8212;-
6. 使用Objective-C来实现苹果的程序接口
你并不是必须要使用Objective-C，但是如果想要实现苹果的程序接口，用Objective-C会很方便。否则你需要用C或者C++。
7. 把为AIR编写的接口方法写在.m文件里
AIR和原生代码之间的接口是用C写的，所以你的原生代码需要引用一个包含C代码的文件来实现这些接口。如果你把接口放在.c文件中，那么你不能使用任何Objective-C功能（比如你无法用objective-c的语法去调用objective-c接口），但是如果你把接口放在了.m文件就可以。所以用.m文件会更方便一些。
8. 包含AIR原生接口的.m文件不需要.h头文件
但是你需要在XCode项目设置中的警告选项里把”missing function prototypes”这一项给关掉。
9. 为initializer和finalizer方法起一个独一无二的名字
很多ANE的例子都使用了”extInitializer”和”extFinalizer”来给扩展的入口和出口函数命名。但如果在项目中使用多个ANE扩展，这样会导致命名冲突。所以给入口和出口函数起一个独一无二的名字。
10. 在项目中使用宏
在定义接口的时候，你可能需要重复输入很多遍类似这样的代码来定义函数

1
FREObject someFunction(FREContext context, void* functionData, uint32_t argc, FREObject argv[])

我建议使用宏定义来代替所有这些重复的定义方式。你可以在这个源文件中找到宏定义的例子。（感谢David Wagner的提供）
11. 把“Enable linking with shared libraries”设置成yes
网络上很多关于在XCode里如何设置这个选项的讨论，有人说”no”有人说”yes”。基本上，说设置成”yes”的说明你的应用在发布的时候需要链接外部类库，这个选项就是这个意思。但是这也意味着你在发布含有此扩展的AIR应用时，你必须要告诉编译器你的iOS SDK在哪里，这样你才可以使用那些类库。具体看下面第18条。
如果你得到这样一个编译错误

1
ld warning: unexpected srelocation type 9

则你可能要么忘了开启这个选项，要么没有给编译器指明SDK的位置。
12. 小心使用线程
你的原生扩展不能在除主线程之外其他线程创建Actionscript对象，而且必须要从AIR端调用。这样会导致在Objective-c中使用块的时候问题重重。然而，你可以通过一种途径来达到这个目的，那就是使用Actionscript ExtensionContext事件派发机制。方法如下：
1，在一个线程中，创建一个原生对象并储存数据。
2，派发事件给ExtensionContext，为下一步传送必要的细节。
3，在事件响应的方法中，调用原生接口来获得这个原生对象。
4，在这个被调用的原生方法里，利用该原生对象创建一个Actionscript对象。
13. [...]]]></description>
		<wfw:commentRss>http://jamesli.cn/blog/?feed=rss2&amp;p=1438</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>（译）Flash Player 11.2 和 AIR 3.2 RC版（功能说明，安装流程以及Stage3D移动开发指导）</title>
		<link>http://jamesli.cn/blog/?p=1394</link>
		<comments>http://jamesli.cn/blog/?p=1394#comments</comments>
		<pubDate>Wed, 29 Feb 2012 05:57:23 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flash 3D]]></category>
		<category><![CDATA[Flash相关技术]]></category>
		<category><![CDATA[Mobile技术]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[行业动态]]></category>

		<guid isPermaLink="false">http://jamesli.cn/blog/?p=1394</guid>
		<description><![CDATA[本文是对Flash Player 11.2 和AIR 3.2 RC版发布说明的一个翻译整理，其中有一些对开发者很有帮助的信息，欢迎关注Adobe® Flash® Player 11.2 和 Adobe AIR 3.2。

原文：http://download.macromedia.com/pub/labs/flashplatformruntimes/shared/air3-2_flashplayer11-2_p6_releasenotes.pdf
Flash Player 11.2和AIR 3.2RC版本下载页面：
Flash Player 11.2 RC
AIR 3.2 RC
翻译整理：James Li

本版本包括新功能、功能增强以及针对安全性、稳定性、运行效率和设备兼容性的错误修正。
2012年2月27日，本次发布的RC版本（译者注：RC版为正式版发布前最后的一个Beta版本，以下简称RC版本）介绍了在iOS和Android平台上完整启用Stage3D图形硬件加速技术。本版本还允许用户在正式产品中使用，开发者可以现在就把它捆绑在应用里发布到各个平台的应用商店比如iOS应用商店，Android市场和Amazon应用商店。然后我们建议开发者等到正式版本发布后再更新应用。
－－－－－－－－－－－
本版本特性
－－－－－－－－－－－
Stage3D显卡加速——AIR 3.2介绍了针对iOS和Android设备的Stage3D API。使用这些底层的接口可以在多种设备上流畅、高效地渲染2D和3D图形。
多线程视频解码（Windows，Mac OS，Linux)*——本版本介绍了一个新的多线程视频解码器，解决了很多旧版本中的视频播放问题。这个新型的架构使Flash视频技术在各平台的发展上都能与时俱进。
Flash Player后台更新机制（Windows）**—— 新版本的运行时可以更有效地递交到最终用户手中（后台更新机制仅在正式发布版本中启用），（译者注：后台更新机制是指新版本播放器的更新流程由以往的前台转到后台，避免了对部分用户的操作困扰和不必要的打扰）。
鼠标锁定，鼠标的相对坐标，右键与中键的点击事件 —— 无限滚动与新的鼠标事件可以用于开发第一人称视角的应用体验。
硬件加速功能的驱动准入日期前移到2008年1月1日。***
怠速事件**** —— 本次发布版本介绍了一个全新的ThrottleEvent事件。
－－－－－－－－－－－－
关于多线程视频解码的说明
－－－－－－－－－－－－
多线程管道是为了支持低端设备和没有成功启用硬件加速渲染的设备而写的一套技术。这套管道的现代化优势对于从移动设备，电视机，上网本以及到高端的个人电脑都是非常明显的。
在Flash Player 11.2中，这种新的视频管道同样支持桌面电脑平台（包括上网本）并且能为它们在以下方面得到增强：
对实时视频编码中偶尔出现的抖动消除。
通过减少掉帧可以为特定平台的高帧率内容提高了50％的帧率。
检索帧的准确性
在高分辨率、高位率内容解码时，Flash Player界面表现以及后台ActionScript运行效率的持续不变。在此之前由于解码对主线程资源的占用导致Flash界面和ActionScript运行效率表现不佳
对于HTTP流，ActionScript可以自主地获取流数据并传递给视频堆。以前视频在检索的时候会停止，并且会解码实际检索点之前的内容。使用多线程的视频解码，不仅检索得更靠谱，而且检索之后的内容也可以快速播放。
对视频管道的架构进行了超过50次的修正，使其更具先进性。
－－－－－－－－－－－－
关于Flash Player后台更新的说明
－－－－－－－－－－－－
在Window平台上发布的Flash Player 11.2.202.x版本包括Flash Player后台更新功能，这是一个新的特性。如果你之前已经启动了后台更新，那么你的Flash Player将在新版本的发布之后自动更新到最新。（如果你没有启动后台更新选项，你可以在Flash Player设置面板的高级选项里启动这个功能。要打开Flash Player设置面板，你可以在Flash内容上右键点击后选择&#8221;Global Settings&#8230;&#8221;，或者在Window控制面板中选择Flash Player）。
你的系统会每隔24小时检查一次Flash Player的版本更新信息。请注意每次更新检查只有在运行结束后才会在Windows任务日程中被体现。下一次的检查会在24小时之后带来实际的网络流量。如果你保持系统运行超过24小时，你会看到更新已经完成——包括ActiveX组件和plug-in插件。要验证新版本是否更新成功，你可以用浏览器打开一个含有Flash内容的页面，右键点击Flash内容，在弹出的菜单底部确认版本信息。
注意在浏览器中已经打开的Flash内容，如果是在更新之前已经下载的，将不会使用更新过的播放器。（译者注：这里其实是说在更新的时候不会要求关闭浏览器，这与前台安装不同）
在后台更新的过程中，如果Firefox正在使用，Firefox则会继续使用旧版本的Flash Player（译者：即使在未关机情况下重启Firefox）。要解决这个问题，有两种办法，一是删除前版本的NPSWF.dll，路径是：\Windows[SysDir]\Macromed\Flash* ，
或者重启电脑，让Firefox去自动下载新的插件。对于64位的操作系统，可能需要删除\Windows\System32\Macromed\Flash文件夹下的NPSWF.dll，以及\Windows[SysWow64]\Macromed\Flash整个目录。
注意，由于考虑安全性的问题，Flash Player的后台更新会升级安装的所有Flash播放器版本（10.1以上）。对于Window 7 x64系统，如果安装Flash Player的时候Internet Explorer浏览器正在运行，在页面刷新时由于浏览器会尝试去下载新的Player版本，所以会弹出一个IE安全警告。如果要避免这个，需要重启浏览器。
－－－－－－－－－－－－－－－－
关于Windows平台上启用硬件加速功能对驱动的准入说明
－－－－－－－－－－－－
之前，硬件加速的功能只对2009年1月1日之后安装的驱动开放，现在这个时间已经被前移到了2008年1月1日。任何使用Direct模式（或者在AIR中使用renderMode=direct）渲染的包含Stage3D或者StageVideo的内容，只要显卡的驱动是在2008年1月1日之后更新的，那么Flash就会尽可能使用显卡资源去进行图形渲染。
－－－－－－－－－－－－－－－－
关于怠速事件的说明
－－－－－－－－－－－－
当Flash Player进入怠速、暂停或者恢复正常状态的时候，舞台会派发一个ThrottleEvent事件。怠速状态时Flash Player会以较低的帧率运行（也就是说，帧率降低但没有完全停止）。比方说，当Flash内容失焦或者被最小化的时候就会进入怠速状态。
在进入怠速状态之前，会派发一个ThrottleEvent事件，ThrottleEvent.state=ThrottleType.THROTTLE，并且通过访问ThrottleEvent.targetFrameRate属性可以得到怠速后的帧率，一般会在2到8之间。这样开发者可以在事件侦听器中编写代码来准备应对怠速状态，当侦听器运行结束后，Flash Player正式进入怠速。
当Flash Player从怠速状态中恢复正常，同样会派发一个ThrottleEvent事件，ThrottleEvent.state=ThrottleType.RESUME。同理，ThrottleEvent.targetFrameRate [...]]]></description>
		<wfw:commentRss>http://jamesli.cn/blog/?feed=rss2&amp;p=1394</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>使用ANE获取iDevice的音频输入</title>
		<link>http://jamesli.cn/blog/?p=1388</link>
		<comments>http://jamesli.cn/blog/?p=1388#comments</comments>
		<pubDate>Wed, 22 Feb 2012 06:41:45 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Action Script]]></category>
		<category><![CDATA[Mobile技术]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://jamesli.cn/blog/?p=1388</guid>
		<description><![CDATA[AIR有自带的音频输入接口Microphone，但是朋友在项目中发现最新的build里有一个不小的bug，致使在iPad和iPhone上调用Microphone接口后无法消除回声音量。目前这个bug已经提交并且会在近期的AIR正式版本中被修复。不过这也给了我一个机会研究了一下如何绕过AIR的API直接去请求原生的音频输入接口。本文就是我的研究成果。
本文解决的是用来检测朝内置麦克吹气的交互行为，并且在交互的同时允许应用内部的音频正常播放。

Objective-C 对音频的处理过程比较复杂，官方给出了一个例子SpeakHere，非常详细地讲解了如何编写录音和回放音频的过程，有时间有兴趣的朋友可以研究下。我在本文会通过一个通俗易懂的例子来讲解一下如何使用AVAudioRecorder检测吹气。
在搭建好ANE的编程环境后，我们来定义几个FRE API：
FREObject initMic //初始化内置麦克风的录音行为
FREObject removeMic //停止录音行为
FREObject getMicPower //获得麦克风的输入量
这样我们就可以假象一个程序逻辑：当需要启用麦克风的时候调用initMic，然后在EnterFrame或者Timer事件中实时请求getMicPower，最后关闭Mic的时候调用removeMic。
initMic:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
FREObject initMic(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
    BOOL success = NO;
&#160;
    if(session == nil){
        //判断录音设备是否可用
        session = [AVAudioSession sharedInstance];
      [...]]]></description>
		<wfw:commentRss>http://jamesli.cn/blog/?feed=rss2&amp;p=1388</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>使用ANE调用Box2D的C++类库</title>
		<link>http://jamesli.cn/blog/?p=1381</link>
		<comments>http://jamesli.cn/blog/?p=1381#comments</comments>
		<pubDate>Thu, 02 Feb 2012 13:06:31 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Mobile技术]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://jamesli.cn/blog/?p=1381</guid>
		<description><![CDATA[Box2D是众所周知的2D物理引擎，它有很多语言版本，我们AS开发者可能比较熟悉AS3版本，但如果在移动设备上跑AS3的Box2D效果很不理想。大家都知道著名的手机游戏“愤怒的小鸟”就是使用的Box2D的C++类库，如果Flash应用也可以调用高效的C来进行物理运算那么一定是非常Happy的事情。感谢猫粮的帮助，我找到了Box2D的作者为我们写好的一个AIR与C++的调用接口类，本文我将介绍如何利用这个ANE类库来实现Flash对C++版本Box2D的调用。
这个ANE类库可以到https://github.com/mnem/box2d_ane去下载
动手之前先确认如下几个事情：
1，Xcode版本需要是4.1。在4.2下无法打包C++的动态链接类库，原因我仍在与内部同事沟通中。
2，AIR打包工具ADT版本在3.0以上。这是对ANE的最低支持版本。
3，需要具备iOS开发的经验以及条件（开发者帐号）
在下载下来的压缩包中，打开extension文件夹。其中，文件夹default是AS3的版本源代码，native文件夹里是原生类资源，ane文件夹中是AS类资源（以前介绍过，任何一个ANE项目都包括一个原生类和AS类）。
1，建立项目
双击native/ios/NAH_B2D/NaHBox2D.xcodeproj，可以直接创建一个Xcode项目。这个项目通过box2d文件夹下的cmake文件自动创建项目结构，所以在创建项目的时候需要保持native文件夹下的结构不变。
打开FlashBuilder，使用ane文件下的资源创建一个Flex Library项目。这个项目用来创建ANE的AS类文件。
2，创建应用
在开发者后台创建一个应用，申请证书以及设备授权文件（具体操作见我之前的博客文章）。
在FlashBuilder中创建一个AS项目，作为test项目，引用上一步创建的Library。
我在本文提供了一个例子，大家可以最后下载下来运行来看效果。这篇文章不对代码进行罗嗦，但我要对这个Box2D的ANE版本做一个大致的功能介绍。这是这个例子的运行视频：

这个Box2D的ANE接口类需要用到AS3类来提供数据类型，如果你熟悉如何用AS3版本来创建材质和物体，那么在这个ANE版本里也是几乎一样的代码。但它并非是一个完善的接口类库，它虽然提供了一些基本的方法，比如world创建，body和材质的创建，但对于AS类接口来说还远远不够。类库中只有对规则矩形的创建接口，而没有对圆形和自定义刚体的创建接口。所以这是一套需要开发者自行扩展的API，需要开发者对Box2D的使用需求有一定的了解，并且熟悉C++代码。
我并非是一个Box2D的老用户，只用它开发过一两个项目，所以在这个例子里我只对它做了有限的几个扩充。大家可以从代码注释中找到我添加的几个AS接口和C++方法。
希望这个程度的介绍可以帮到一些切实需要使用C类来提高效率的开发者，它与AS类库的效率对比是非常显著的。
下面是我准备的一些下载资源
Box2D_ANE_Example.zip
]]></description>
		<wfw:commentRss>http://jamesli.cn/blog/?feed=rss2&amp;p=1381</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

