11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
楼主: general_clarke
上一主题 下一主题

[交流 & 讨论] AS3转码其他语言(本帖以 C#+Unity 举例),工具开发记录

[复制链接] TA的其它主题
 楼主| 发表于 2019-2-22 18:58:54 | 显示全部楼层
前文例举的第29项
AS3::作为形参的object或*型引用默认值可以设置成任意类型,如
public function func(a:*, b:* = 10, c:* = false){xxx}
C#::不支持,object形参默认值只支持null

解决:利用C#多态,将上述函数头转换为三个,分别是
void func(object a){object b = 10;object c = false;xxx}
void func(object a, object b){object c = false;xxx}
void func(object a, object b, object c){xxx}


这里有稍加注意地方。
为转码尽量可读可维护,
对普通函数可以转换为

  1. public virtual void testFunc(object a, object b, object c)
  2. {
  3.         xxxx
  4. }
  5. public virtual void testFunc(object a)
  6. {
  7.         testFunc(a, 10, false);
  8. }
  9. public virtual void testFunc(object a, object b)
  10. {
  11.         testFunc(a, b, false);
  12. }
复制代码


虽然会牺牲执行效率(多一层堆栈),
相对的
因为查错是在C#端进行,项目上线前后也不可避免某些紧急bug时C#程序员跳过AS3转换步骤直接修改C#源码
这种写法能使其只改一个函数即可。


但是对于构造函数不支持这样的写法,
只能写成
最初的形式
回复

使用道具 举报

 楼主| 发表于 2019-3-4 08:42:41 | 显示全部楼层
本帖最后由 general_clarke 于 2019-3-4 08:51 编辑

因本文进度已跟上我公司进度,
个人近期工作是对此转码项目提供编辑器支持,
转码近期不会推进,此文暂停数周更新。
回复

使用道具 举报

 楼主| 发表于 2019-4-4 16:58:25 | 显示全部楼层
本帖最后由 general_clarke 于 2019-4-4 18:10 编辑

编译时问题已几乎归零,运行时错误也在向个位数发展。

出现最多的运行时错误是undefined和一般对象对比的问题。
例如

  1. AS3::
  2. var a:Sprite = arr[0];
复制代码


其中arr[0]可能是undefined,在我方案中这是一个Undefined类的对象。
在AS3中,把undefined赋值给引用类型会当做null处理。
在C#中把undefined赋值给Sprite类型对象会出错。

因此需要翻译成

  1. C#::
  2. Sprite a = arr[0] as Sprite;

  3. Sprite a = (arr[0] == FlashCore.undefined?null:arr[0])
复制代码


在AS3中,将一个通配类型对象(含arr[0]这种)赋值给一个具体类型变量的情况太多了。
如果为每次赋值都加入as语句,这将是性能的巨大开销
事实上Air运行时真的就是这么做的。。每次从通配类型对象赋值给具体类型变量作一次检查,所以慢,这甚至是AIR运行时缓慢的主要原因之一

因此做了一个兼容方案
只在这种赋值后立刻出现判空时,才做上述类型转换


  1. AS3::
  2. var 具体类型变量:具体类型 = 通配类型对象
  3. if(具体类型变量){
  4.   //xxx
  5. }
  6. C#::
  7. 具体类型 具体类型变量= (通配类型对象==FlashCore.undefined?null:通配类型对象)
  8. if(转成布尔值(具体类型变量)){
  9.   //xxx
  10. }
复制代码


回复

使用道具 举报

 楼主| 发表于 2019-4-4 19:57:03 | 显示全部楼层
本帖最后由 general_clarke 于 2019-4-29 17:51 编辑

虽然还有个别贴图和精度问题,
简单来说

成功了

QQ截图20190404195842.png
QQ图片20190404195903.jpg
回复

使用道具 举报

 楼主| 发表于 2019-4-4 20:23:33 | 显示全部楼层
本帖最后由 general_clarke 于 2019-4-29 17:50 编辑

【七】

除个别第三方库问题外(贴图问题由于Spine的AS3版和C#不一致造成, 不属转码部分另案修理),
现方案已能正常运行。

AS3作出任何代码修改后,C#端仍需手工处理才能运行的细节问题少于10处。

我感觉转码工作已可告一段落了。

首先是舒了一口气。
通常公司不会给出几个月时间研究这种引擎级别的东西,平时本人也需要同时维护线上项目和制作转码
这套转码方案已占用了不少个周末,终有个完整的清明节能陪陪老婆。

方案完成就我个人而言没有感觉过多的激动,
因为方案成功并不是今天争取到的,
而是从方案设计的第一天,设计成功的方案没有失败的道理。
此后开始实现逐日逐月点滴积累,添砖加瓦
除自己自己持之以恒
远见的老板和优秀的C#同僚对完成工具非常重要

这个方案完成,即表示也能简单地将AS3转为H5(JS)、Java或其它版本。
这也表示经过几个月努力实现了个小目标
即使Adobe不更新,可以安心地把AS3写下去,永不过时


=======================
这篇文章断断续续更新了5个月,
时致工具完成,发现未说的很多。

未说的有数百个bug的细节处理办法
有几个月同时开发工具与维护项目的辛苦
也有对鼓吹“as已死”水友的一肚子复杂感情。

未说的太多也便无需多说,自己的路自己来走。

=======================
工具进步,永无止境

转C#部分暂告一段落,后续捡炼有营养部分不时更新。
回复

使用道具 举报

发表于 2019-5-9 16:10:18 | 显示全部楼层
general_clarke 发表于 2019-4-4 20:23
【七】

除个别第三方库问题外(贴图问题由于Spine的AS3版和C#不一致造成, 不属转码部分另案修理),

很多步骤看的云里雾里,但是真的好佩服,竟然还有这种操作?
我们也是同时使用AS3+C#,但是用的是比较low的办法,C#加载swf,用flash做简单界面,C#做一些其他的数据处理,网络通信,硬件操作等
但是实际上,flash的效果在上面还是大打折扣的,有时候好好的一个动画,上去还会特别卡顿。
能达到您这种水平的,对编程真的是研究到底层了,一般人都是浅尝辄止,能用就行的。
万分崇拜。
回复

使用道具 举报

 楼主| 发表于 2019-5-16 14:23:22 | 显示全部楼层
本帖最后由 general_clarke 于 2019-5-16 14:45 编辑
早起的虫儿 发表于 2019-5-9 16:10
很多步骤看的云里雾里,但是真的好佩服,竟然还有这种操作?
我们也是同时使用AS3+C#,但是用的是比较low的 ...

是否深挖这个人各有志吧。
坚持优化as和浅尝辄止的做法其实本质都是不希望失去现有的环境。
达到团队的一定位置,就有些事情明知逆水行舟也不上不行。

加工as和flash有很多先行者,
大一点的Haxe、LayaFlash,包括Starling,龙骨

就楼主个人群聊所知,仍有不少as使用者不止在等adobe更新,也在自行让as进化
比如as3解释as3的AScript
C系语言做AVM的apple-juice
基于Starling的全套编辑器大召唤师的工具等
比起其中不少人,楼主也是小字辈。
唯希望有as3使用者知道还有这么条路。

这个帖子只能表达大致的思路、流程和一些要点
因为总的工作量很大,将几个月代码浓缩成几篇帖子,详细说明每一个步骤不太现实。
如对其中某些部分有疑问可发帖回复。乐于沟通。






回复

使用道具 举报

发表于 2019-8-14 16:46:09 | 显示全部楼层
好象很高级的样子。
回复

使用道具 举报

发表于 2020-5-14 17:52:50 | 显示全部楼层
mark,论坛的精华帖!
回复

使用道具 举报

发表于 2020-5-14 18:04:47 | 显示全部楼层
本帖最后由 qykings 于 2020-5-14 18:08 编辑
general_clarke 发表于 2018-11-14 16:25
【四】

和多数as3工程师一样,楼主平时在用FlashBuilder

Idea编辑器对Mac系统很友好,fb不行,会崩溃,在新一点64位不支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表