[Flash/Flex] 使用Flash的C++编译器Flascc的提示和窍门

来源:互联网 发布:mysql innodb 修复 编辑:程序博客网 时间:2024/05/16 05:47

Flash c++编译器(FlasCC)提供了一个完整的基于GCC C / c++开发环境,这样你可以把C/C++代码编译到指定的Adobe Flash Player 和 Adobe AIR中。通过flascc你可以出任何你已经编写好的C/C++的代码到网页上。

这篇文章包含了一下tips 还有一些捷径让你能够更容易的开始使用flascc。

用GDB调试的一些Tips

       像大部分的GCC基础工具链,flascc是用GDB作为它的调试工具的。它提供了一个自定义版本的GDB可以在Flash Player里面把调试由flascc编译而来的C/C++代码。

设置FLASCC_GDB_RUNTIME的运行环境

       为了能执行GDB,你需要定义一个可用的FLASCC_GDB_RUNTIME的环境变量,它可以是一个单机版的Flash Player的debugger 或者是一个已安装浏览器版本的Flash Player Debugger的完全限定的路径。If the path contains spaces use either double quotes (Windows) or escape spaces with a backslash (Mac)

例如:

  • Windows上:


        FLASCC_GDB_RUNTIME="/cygdrive/c/Program Files (x86)/Mozilla Firefox/firefox.exe"

  • 在 Mac OS X上:


        FLASCC_GDB_RUNTIME=export                                                                                             

        FLASCC_GDB_RUNTIME=/Users/flex/runtimes/player/11.3/mac/Flash\Player\Debugger.app

使用火狐里面的GDB

       如果你是在使用火狐浏览器,那么你就可能要扩大或者禁用你的插件检测时间从而避免当你在调试时浏览器过早的终结你的SWF。如果想要知道更多想过的内容,可以看MozillaZine上关于这个主题的文章

在一个远程站点上,把GDB连接到一个SWF

       如果你的flascc程序是在一个远程站点上运行的(例如:一台服务器上),需要设置一个FLASCC_GDB_RUNTIME的环境配置指向你的浏览器(像上面的描述那样),还有需要在你开始用到它的时候需要传递远程程序的URLGDB,例如:

gdb www.mysite.com/games/mygame.html

利用GDB调试SWCs

       当你砸编译SWC时,你需要指定一个命名空间。所以在你调试一个SWC时,你就需要告诉GDB你要用到的as3 命名空间命令集。你只能在每个会话中调试一个SWC。想要知道更多的信息,你可以查看在你安装flascc的地方的docs/Reference.html下的GDB的那段或者网上查看

使用GDB去调用命令

       当用GDB调试时,你可以在你的代码中通过一个命令去调用你的一个函数。这有可能是任意你想调用的函数,或者它也可以是你添加到严格调试的一个函数。例如:

       (gdb) call dumpValues()

让一个SWF在你的GDB上再次运行(不需要顾及相关警告)

       当你在你的GDB上重新运行SWF时,你可能会看到这样的一个警告:

warning: Temporarily disabling breakpoints for unloaded shared library "remote:0.elf"

    你可以忽略这个警告,因为它是安全的。

下面就是一个SWFGDB中运行和重运行的例子:

  1. <path>/sdk/usr/bin/gdb call.swf 
  2. GNU gdb (GDB) 7.3 Copyright (C) 2011 Free Software Foundation, 
  3. Inc. 
  4. License GPLv3+: GNU GPL version 3 or later <" target="_blank">http://gnu.org/licenses/gpl.html>
  5. This is free software: you are free to change and redistribute 
  6. it. 
  7. There is NO WARRANTY, to the extent permitted by law. Type "show 
  8. copying" 
  9. and "show warranty" for details. 
  10. This GDB was configured as "--host=x86_64-apple-darwin10 
  11. --target=avm2-elf". 
  12. For bug reporting instructions, please see:
  13. <..." target="_blank">http://www.gnu.org/software/gdb/bugs/>... 

  14. (gdb) b main 
  15. No symbol table is loaded. Use the "file" command. 
  16. Make breakpoint pending on future shared library load? (y or 
  17. [n]) y Breakpoint 1 (main) pending. (gdb) r 
  18. Starting program: call.swf 
  19. 0xdddddddd in ?? () 
  20. Breakpoint 1, 0xf0000247 in main (argc=0, argv=0x200ff0) at 
  21. call.c:66 
  22. 66 int s = 2; 
  23. (gdb) r
  24. The program being debugged has been started already. 
  25. Start it from the beginning? (y or n) y 
  26. warning: Temporarily disabling breakpoints for unloaded shared 
  27. library "remote:0.elf" 
  28. Starting program: call.swf 
  29. 0xdddddddd in ?? () 
  30. Breakpoint 1, 0xf0000247 in main (argc=0, argv=0x200ff0) at 
  31. call.c:66 
  32. 66 int s = 2; 
  33. (gdb)
复制代码

当你看到“No symbol table is loaded...”的信息时,你不需要理会

      在某些情况下,在你运行GDb时,你可能会看到下面的信息:

      No symbol table is loaded.... pending on future shared library load

      你也可以忽略它,因为它是安全的。

使用<longLocalVariableString>去查看GDB中的长字符串

       GDB如果是不会在本地列表显示长度大于80个字符的ActionScript 3 的字符串。为了能看到这些字符串,你需要使用到monitor eval command.

例如,监测 myLongVariable所显示的字符的值与长度无关。

最优化的 tips

      当你完成了调试并准备优化的时候,请考虑一下下面的建议:

生成一个最优化的程序

       默认情况下,flascc版本的GCC会生成ActionScript 的字节码。这样为你提供了最快的编译时间还有充足的发展周期。然而,对于全面的优化,你在调用GCC时需要使用到-emit-llvm 或者 -O4选项。这下选项将会转换成LLVM的位码,它会创建一个Link Time Optimized的构造。尽管这个转换过程需要编译比较长的时间,但是你可以所有的东西转换成一个由LLVM位码组成的最终并且完整的构建。例如下面的命令行将会创建一个完整的构建:

  1. gcc test.c -emit-llvm -c -o test.o 
  2. gcc test.c -O4 -c -o test.o 
  3. gcc test.c -emit-llvm -emit-swf -o test.swf 
  4. gcc test.c -O4 -emit-swf -o test.swf
复制代码


使用GCC去生成一个SWC

       当你使用一个GCC去生成一个SWC时,你需要使用到 -emit-swc=选项去指定AS3包名,里面包括生成的代码还有flascc的模板代码。这可以让你砸一个SWF里面连接多个flascc生成的SWCs,而不用任何的函数或者导致类之间的冲突。下面这个例子是来自/tutorials/05_SWC/makefile:

  1. "$(FLASCC)/usr/bin/g++" -O4 MurmurHash3.cpp as3api.cpp main.cpp 
  2. -emit-swc=sample.MurmurHash -o MurmurHash.swc
复制代码

      如果想要知道更多的信息,你可以查看在flascc的安装目录下docs/Reference.html 中的构建SWCs部分。

优化 SWCSWF的大小

     尽管GCC提供很多选项可以让你的输出最小文件大小,下面是最常见的技术:

  • 利用GCC -O4选项生成LLVM的位码并创建一个最优化的构建。

  • 利用一个输出文件来制定一个构建里面应该包含的东西。例如,像/tutorials/12_Stage3D/exports.txt.

  • l利用LLVM所提供的,找到各种选项中最优化的那些部分。


使用一个旧版本的SWF

       SWF的确定是取决于可用AIRFlash Player APIs 。例如,SWF 17 等同于AIR 3.4 和 Flash Player 11.4;如果你指定SWF 16 ,那么你的程序就只能访问到AIR 3.3 和 Flash Player 11.3 的 APIs。如果你因为某些原因需要用到更加老版本的SWF,通过使用GCC-swf-version= option(默认版本是SWF 17,如果你想把它变成 SWF 16,那么你可以像这样指定 -swf-version=16)

更多SWF 版本和Flash Player 版本之间的映射信息可以参考如何创建扩展的文件中

利用C++去封装Flash 的类

       Flascc提供一下头文件可以让你去封装一下Flash 的高级类(例如Number 还有Array),还可以封装Flash 库(例如flash.display.Stage 和 flash.display.Stage3D)。这些封装可以为相应的ActionScript类提供方法、属性、事件的访问。如果想了解更多的内容,那么你可以在你安装flascc的地方的docs/Reference.html下查看C/C++ActionScript之间的交互部分。这些封装也被用在tutorials/12_Stage3D/stage3d.cpp.

自定义默认的预加载

       Flascc程序会在加载SWF显示时都包含一个简单的预加载。你可以为你的flascc程序中为它自定义一个预加载。在这种情况下,如果机器有有限的内存,你可以减少Java堆的规格(默认是 –jvmopt="-Xmx1500m")从而使它降到一个小的范围,例如 –jvmopt="-Xmx256m".你可以在GCC生成文件的时候这样做。例如:

  1. gcc -jvmopt="-Xmx256M" hello.c -o hello.exe
复制代码

      相反的,如果你运行的是64位的Java并且你的机器中还有内存剩余,那么你可以增加Java堆的大小。

      可用的64Java的下载地址:Oracle software downloads

更多的Tips

      下面是有关使用flascc的更多Tips

在你的SWC文件中使用一个类作为控制台

       当你连接到一个SWC时,你必须为这个对象指定一个控制台。

      你需要在调用initLib()之前调用CModule.vfs.setConsole(this),还有包括write()方法的实现:

  1. public function write(fd:int, buf:int, nbyte:int, 
  2. errno_ptr:int):int 
  3. {   var str:String = CModule.readString(buf, nbyte); 

  4.     trace(str);
  5.      // or display this string in a 
  6. textfield somewhere? 
  7.     return nbyte; 
  8. }
复制代码


      可以查看04_Animation tutorial中的Console.as查看另外一个例子。

自定义SWF的大小

       为了能够指定一个SWF的大小,可以通过传递-swf-size=widthxheight到GCC中,例如:

  1. -swf-size=200x200.
复制代码

定义一个导入,这样可以使你在一个函数中调用Context3d

      使用as3import注释,定义一个导入,这样可以使你在一个函数中调用Context3d。下面的例子是摘要于/tutorials/Example_BulletPhysicsLibrary/bullet.i:

  1. void positionAndRotateMesh() __attribute__((used,
  2. annotate("as3sig:public function positionAndRotateMesh(mesh:*, 

  3. rigidBody:*):void"), 
  4. annotate("as3packagerg.bulletphysics"), 
  5. annotate("as3import:flash.geom.Vector3D")));
复制代码

在那些已经封装好返回结构还有对象的值的函数中要预防内存泄漏

      当在你的C/C++头文件中使用SWIG编译器创建SWCs是,要注意一下的东西:

  • 默认情况下,为那些返回结构还有对象值的函数进行封装会导致内存泄漏。SWIG根本不知道它应该何时去释放这些值,所以它会希望那些代码调用封装器在它占用的时候去释放那些值。

  • Flascc没有想std::string那样的标准类型映射,更加没有C++中的标准库类。由于这样,当在封装器中用到std::string或者相似的类时,可能不会像预期那样运行,你需要编写用于特定程序的类型映射去实现你想要达到的效果。


使用as3wig 去创建一个C++的接口

       你可以为现有的ActionScript 3 ActionScript字节码用flasccAS3 接口封装生成器生成一个C++的接口库。例如在你安装文件下的/tutorials/12_Stage3D/makefile地方,特别是以下这一行:

  1. sdk/usr/lib/as3wig.jar -i AGAL.abc -o AGAL
复制代码

创建一个自定义控制台的实现

      当你加载你的SWF时,控制台类将会是最先创建和执行。是一个ActionScript的类去控制flascc所编译的代码什么时候和怎样初始化的。It is also used by the underlying flascc POSIX implementation as the object that handles read and write requests to the various standard input, output, and error terminal streams. 在某些情况下,你可能想要创建一个自定义控制台实现。例如,尽管你在包含在Flash++.h中的C++封装器去与你的Flash APIs进行交互,但是你可能在你的控制台程序中更倾向于使用纯正的ActionScript 3.对于更多有关控制台的类,可以参照在安装目录下的/docs/Reference.html下ActionScriptAPI 文档。

不要使用fsync()

       Flascc 并不支持fsync().反而它会在你关闭文件的时候提交你的改变的地方。

使用CModule.startBackground() 和 CModule.startAsync()

       在 com.adobe.flascc.CModule ActionScript 类中包含一些便捷的方法可以读取或者写入到domainMemory。它也负责管理任何由flascc特定的全局状态(例如,VFSPOSIX接口的实现)。在不同的方法里面,要注意到下面不同的地方:

  • startAsync()- 调用会导致main() 执行的libc __start1 函数。

  • startBackGround() - 会创建一个背景的成员,用于在这个成员中调用libs 中的 __start1函数。这个方法需要SWF 18Flash Player 11.5)或更高。


      想知道更多有关CModule类的信息,可以在flascc的安装目录/docs/apidocs/index.html下的ActionScriptAPI 文档。

下一步

       为了能了解到更多,你可以查看Adobe Gaming flascc page

       这个只能在一个非营利性的、知识共享的、不许修改的情况下得到的许可。

评论系统目前被关闭了,因为我们正在转向一个新的评论系统。在这段时间,如果有任何意见的反馈,可以通过我们的反馈方式。非常感谢你。



原文链接:http://www.adobe.com/devnet/games/articles/flascc-tips-tricks.html

原创粉丝点击