|
主题: 加快projector启动速度
|
 donlee
职务:普通成员
等级:1
金币:1.0
发贴:271
注册:2000/12/8 8:52:18
|
#12001/3/26 7:42:40
一年多以前,我曾在通力和director-online问过类似问题,但没有引起什么反应, 后来在国内外多次看到类似问题,director-online是有一篇文章谈了一下,但我不太满意,近一年来我断断续续地总结,积累了一些经验,算抛砖引玉吧!如果版主觉得有价值,欢迎转贴与大家共享。 内容详见: www.macromediachina.com/forum/view.asp?fid=director&id=17337 引用:
制作快速启动的projector
donlee
以Director作为多媒体开发平台,最终生成的可执行文件被称之为projector,通常它的启动速度比较慢,往往用户双击了应用程序图标后,一时看不到程序的启动,于是多次点击,造成同一程序的多个副本同时启动,整个过程雪上加霜,如果应用程序是放在光盘上直接运行,尤其令人难以忍受。为了解决这个问题,Macromedia随Director5.0发布了一个小文件--launcher.exe,通过简单的设置可以先启动launch.exe,显示一个“请稍候..."之类的信息,与此同时在后台启动真正的projector。但在启动过程中所显示的用户界面非常单调,无法令人满意。目前Director最新版本为8.0,但对此尚没有理想的解决方案,怎样获得尽可能快速启动的projector,成为很多开发人员共同关心的问题,下面的几种措施可供参考。
一、使用splash screen技巧 较大的软件安装过程中,往往在复制文件的同时,显示进度条或splash screen之类的东西,以避免用户尴尬地等待。Director 8.0版本所生成的projector也具有此功能,我们可以制作一个位图文件projector.bmp(与应用程序的主文件名相同)作为splash,启动projector后,立即在屏幕上显示出此图片,尽管实际的启动时间并没有缩短,但避免了原来令人尴尬的“没有反应”情况下的等待。
二、恰当设置projector.ini文件 打开director.exe同目录下的director.ini文件看一下,有这样一项设置: [Settings] SingleInstance=1 建立一个projector.ini文件,内容如法炮制,其作用在director.ini内有清楚的说明,这里不再做更多的解释,此文件内的其它设置也很值得一看。 有人提出用下面的方法实现类似功能:在程序启动时通过fileio xtra或getpref、setpref等方法向一个特定文件内读写程序已启动的标记,一个考虑得比较全面的例子可在http://www.image.dk/~hede/lingo/direct/soloist/soloist.html上找到。但这种做法的效率并不比设置ini文件更高些,如果是在光盘上执行,程序还要更复杂些。
三、制作stub projector 上面谈到的两种措施并未使程序的启动时间有实质性缩短,为了真正加快程序的启动速度,我们要先分析一下projector在启动过程中需要完成哪些工作。 当用户启动了projector,如果这是一个standard(在create projector的options下选择)模式的projector,则它的内部已经包含了全部必要的文件,一般来说,这些文件包括资源文件dirapi.dll、msvcrt.dll、iml32.dll和proj.dll(这四个文件可以在director.exe同一目录下找到),以及用户在开发过程中所用到的所有xtra文件,我们也可以用下面的方法获知projector中已经包含了哪些文件:制作一个简单的、standard模式的projector,然后执行它,同时通过资源管理器或类似方法看一下系统的temp目录(一般是C:\Windows\TEMP)会有一个类似tempfolder.aaa的文件夹,这里面就是上面提到的那些文件。这里我们可以知道,当projector启动时,它从自身释放出这些文件到系统的临时目录下,然后使用这些文件。 可以想见,如果不把这些文件打进包里,而放在外部,岂不是无须解压和写磁盘,从而加快了启动速度吗?答案是肯定的。事实上,我们可以更进一步,制作一个stub projector,方法如下:新建一个movie,在它的属性中把它分辨率设为1*1,位置设定在屏幕之外,整个movie只有一个moviescript类型的member,其内容为: on startmovie go to movie "main" end 用此movie制作一个projector,在create projector的optinos中选中shockwave模式,所得的exe文件大小约为50K。这就是一个stub projector。把我们真正的movie存为main.dir(或main.dxr、main.dcr),然后建立一个名为xtras(子目录名必须是xtras)的子目录,把上面提到的dll文件和所有必要的xtra文件复制到此子目录就完成了。 上面只是简略地介绍stub projector的制作过程,朋友们可以在http://www.macromedia.com/support/director/ts/documents/d8_fast-start_stub_proj.htm 看到关于stub projector更详尽的文档,相关文档还讨论了关于xtra文件外置的其它优点。 这里最重要的一点是只复制必要的xtra文件,因为程序启动时会把xtras子目录下的所有xtra文件加载到内存中,多余的xtra不仅拖延启动时间,而且会在程序运行时占用系统资源。至于哪些xtra是自己所必须的,与所用到的媒体类型、过渡效果的使用以及程序内部的设置等等诸多因素有关,已经大大超出了本文所讨论的范围。
四、恰当选择movie最初呈现内容 我们知道,在movie中可以通过lingo语句go to movie或play movie来切换不同的movie,所以为了尽快完成movie加载,可以让projector先播放一个非常小的movie,一般以小的视频片断或软件的主界面为好,尽量避免使用过大的媒体文件或文本内容,以此为入口调用其他movie,或在后台加载即将播放的movie。
五、动态加载xtra 前面已经谈到,projector启动时,会自动加载xtras子目录下的所有资源和xtra文件,我们可以把一些暂时不用且体积较大的xtra文件(一般为lingo xtra,如Beatnik等)放到其它目录(如othxtras)下,等程序启动后在movie的适当位置(不应在第一帧内)用openxlib加载,以缩短projector的启动时间。 加载xtra可参考以下script: on LoadOtherXtras openxlib the applicationPath & "othxtras" --或 openxlib the applicationPath & "othxtras\Beatnik.x32" end 第四、五两种方法可结合起来灵活运用,以确保程序尽快完成初始的启动。
六、光盘刻录时的最后优化 对于直接在光盘上运行的projector,考虑到光驱的寻道时间等因素,在刻录光盘前应注意适当安排文件在磁盘上的次序,并在刻录软件中适当设置选项(如在Easy CD Creator的General中选中Preserve normal file ordering),应尽可能把启动时要加载的资源和素材文件放到光盘上相邻的位置,以最大限度地减少在光盘上寻找文件所耗费的时间。
在实际的项目中,上述措施不一定全部采用,一般前三项是应该重点考虑的,当主movie文件含有大的媒体或xtra文件,后几种手段会有比较明显的效果。
谢谢Donlee, well done, 我把它转贴过来了。
编辑历史:[这消息被flyingbird编辑过(编辑时间2001-03-26 08:25:00)] [这消息被flyingbird编辑过(编辑时间2001-03-26 08:26:31)] [这消息被flyingbird编辑过(编辑时间2001-03-26 08:28:13)]
|
 莫特探员
职务:普通成员
等级:1
金币:1.0
发贴:255
注册:2000/9/18 8:38:25
|
#22001/3/26 9:27:15
非常的好,其实这个文章早就应该写出来了。 MM 的论坛上早有类似的文章。 我做光盘的时候也是这么作的。也和一些网友说过,但是从来没有系统的写过这些。 donlee 干了一件非常有意义的事情。应该放在技术精华区里面。
|
 worthy
职务:普通成员
等级:1
金币:0.0
发贴:98
注册:2001/2/9 17:09:14
|
#32001/3/27 10:36:10
太好了,这是一个困扰我很久的问题了。 多谢指点。
|
 koala_5d
职务:普通成员
等级:2
金币:1.0
发贴:189
注册:2000/12/25 19:27:07
|
#42001/3/27 12:41:43
太好了,下期的盘我就这么该进。
|
 andyfl
职务:普通成员
等级:1
金币:0.0
发贴:127
注册:2001/1/17 3:38:50
|
#52001/3/28 22:00:39
除了以上的观点,还可以用Multimedia Builder做一个引导可执行文件(速度很快!),然后自动调用projector...
|
 D计划-混沌
职务:管理员
等级:6
金币:15.2
发贴:3528
注册:2007/4/9 9:48:37
|
#62001/3/28 23:57:50
呵呵,对呀,洪恩的盘就有一些有趣的小东东,有洪恩的兄弟吗,说话
|
 acneyouth
职务:普通成员
等级:1
金币:1.0
发贴:181
注册:2004/6/9 10:01:26
|
#72001/3/30 16:40:03
我发现如果打包成shockWave以外的形式时,即使在projector的同级目录下有那几个.dll,projector还是顽固的在系统的临时目录中解压出它们。 如果打包成shockwave的话,用户的系统是否也一定要有shockWave呢?
|
 5D精英
职务:普通成员
等级:3
金币:10.0
发贴:1340
注册:2000/10/24 12:13:42
|
#82001/3/30 18:13:09
使用splash screen,splash完了的时候,主程序的窗口焦点要转到激活他的窗口后面,十分不爽。
|
 Call Me Simon
职务:普通成员
等级:2
金币:2.0
发贴:646
注册:2000/9/19 13:56:51
|
#92001/3/30 18:57:50
acneyouth在上个贴子中说 引用: 我发现如果打包成shockWave以外的形式时,即使在projector的同级目录下有那几个.dll,projector还是顽固的在系统的临时目录中解压出它们。 如果打包成shockwave的话,用户的系统是否也一定要有shockWave呢?
你说得很对, 如果不以shockwave的形式打包的话, projector一定要把所有的必须的文件打进去, 也就是那些dll文件。 由于你已经加入了那些文件, 用户端不需要安装shockwave.
|
 acneyouth
职务:普通成员
等级:1
金币:1.0
发贴:181
注册:2004/6/9 10:01:26
|
#102001/3/31 10:46:44
谢谢flyingbird!
|
 zzxiong
职务:普通成员
等级:1
金币:0.0
发贴:9
注册:2000/9/24 0:34:35
|
#112001/3/31 11:46:21
太好了,谢谢。
|
 瑶瑶
职务:普通成员
等级:1
金币:0.0
发贴:4
注册:2000/12/26 8:36:10
|
#122001/4/5 15:45:24
"使用splash screen,splash完了的时候,主程序的窗口焦点要转到激活他的窗口后面,十分不爽。",有什么办法解决吗? 引用:
guo
|