刚开始学习Starling框架,遇到了不少问题,苦于无解,向Starling中文交流群求助。问题得到一 一解决。在这里非常感谢他们的热心回答。这篇博客就当作我在学习过程中遇到的问题的的罗列总结吧。希望对各位有所帮助,文章中如果有不对的地方,非常欢迎和感谢能够留言指出。
问题1:为什么我在调试的时候,Console(控制台)输出的信息是
[Starling] Initialization complete.
[Starling] Display Driver:Software Hw_disabled=oldDriver (Direct blitting)
出现如上的信息,说明Starling框架并没有起到作用,而是根据内部的SwiftShader(Transgaming)的的软件回退引擎,采用software模式运行。
这时候就要检查下自己电脑的显卡了。关于显卡,先补充点知识,来自网上:
集成显卡是将显示芯片、显存及其相关电路都做在主板上,与主板融为一体;集成显卡的显示芯片有单独的,但现在大部分都集成在主板的北桥芯片中;一些主板集成的显卡也在主板上单独安装了显存,但其容量较小,集成显卡的显示效果与处理性能相对较弱,不能对显卡进行硬件升级,但可以通过CMOS调节频率或刷入新BIOS文件实现软件升级来挖掘显示芯片的潜能;集成显卡的优点是功耗低、发热量小、部分集成显卡的性能已经可以媲美入门级的独立显卡,所以不用花费额外的资金购买显卡。
独立显卡是指将显示芯片、显存及其相关电路单独做在一块电路板上,自成一体而作为一块独立的板卡存在,它需占用主板的扩展插槽(ISA、PCI、AGP或PCI-E。独立显卡单独安装有显存,一般不占用系统内存,在技术上也较集成显卡先进得多,比集成显卡能够得到更好的显示效果和性能,容易进行显卡的硬件升级;其缺点是系统功耗有所加大,发热量也较大,需额外花费购买显卡的资金。 独立显卡成独立的板卡存在,需要插在主板的相应接口上,独立显卡具备单独的显存,不占用系统内存,而且技术上领先于集成显卡,能够提供更好的显示效果和运行性能。
GPU(类似于主板的CPU) 全称是Graphic Processing Unit,中文翻译为"图形处理器"。NVIDIA公司在发布GeForce 256图形处理芯片时首先提出的概念。GPU使显卡减少了对CPU的依赖,并进行部分原本CPU的工作,尤其是在3D图形处理时。GPU所采用的核心技术有硬件T&L(几何转换和光照处理)、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬件T&L技术可以说是GPU的标志。GPU的生产主要由nVidia与ATI两家厂商生产。
DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有Direct Graphics(Direct 3D Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光。DirectX开发之初是为了弥补Windows 3.1系统对图形、声音处理能力的不足,而今已发展成为对整个多媒体系统的各个方面都有决定性影响的接口。最新版本为DirectX 10。
OpenGL是OpenGraphicsLib的缩写,是一套三维图形处理库,也是该领域的工业标准。计算机三维图形是指将用数据描述的三维空间通过计算转换成二维图像并显示或打印出来的技术。OpenGL就是支持这种转换的程序库,它源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。SGI在1992年7月发布1.0版,后成为工业标准,由成立于1992年的独立财团OpenGL Architecture Review Board (ARB)控制。SGI等ARB成员以投票方式产生标准,并制成规范文档(Specification)公布,各软硬件厂商据此开发自己系统上的实现。只有通过了ARB规范全部测试的实现才能称为OpenGL。1995年12月ARB批准了1.1版本,最新版规范是在SIGGRAPH2007公布的OpenGL 3.0。
确保你电脑的显卡支持DirectX或者OpenGL,如果你的机子显卡是集成显卡的话,可能不支持;如果有独立显卡,确保当前开启了高性能GPU。由于我使用的笔记本有着双显卡。
一个是AMD的独显,一个是英特尔高清显卡系列属于集成显卡。当时在FlashBuilder下编码调试的时候,谁知道我的笔记本开启的是省电GPU模式,控制台输出是software模式。如果读者遇到类似情况,可以按照如下开启高性能GPU模式,切换到独立显卡。
图1
右击桌面,出现图1,选择显示卡属性。
图2
在电源选项中选择可切换显卡
图3
选择高性能GPU,OK。过个几秒,等待系统切换。
童年注:
高性能GPU:就是切换到了独立显卡,但相对要耗电一些,但带来的是性能上的提高。
省电GPU:集成显卡,在集成显卡模式下,要省电一些。如果在没有外接电源只有笔记本电池的情况下,开启这个模式可以省电,延长续航时间。
切换完毕后,再次回到FlashBuilder中,调试看控制台信息:
[Starling] Initialization complete.
[Starling] Display Driver:DirectX9 (Direct blitting)
显然Starling的GPU加速已经成功开启。
问题2:为什么我调试的时候舞台上没有任何东西,但是在bin-debug文件夹下打开我的swf文件却能看到东西呢?
如果你调试采用的是浏览器调试,不是swf直接调试,也就是你在项目属性里的编译器选项里面勾选了HTML包装器,使用的是系统默认浏览器或者IE浏览器,确保你的浏览器安装了debug版本。
如何知道我是否安装呢?
用这个网址测试。 http://www.flashplayerversion.com/
如果是Yes,你调试仍然看不见舞台上的东西,看看你的入口文件中是否有
1
2
|
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
|
如果有的话注释掉,再次调试测试,应该就可以看见了。
如果出现
的话,打开html包装器文件夹也就是html-template文件夹,用文本编辑器打开html-template.html文件,在js里面的params加入如下一行
params.wmode = "direct";
就像如下:
1
2
3
4
5
6
|
var params = {};
params.quality = "high";
params.bgcolor = "${bgcolor}";
params.allowscriptaccess = "sameDomain";
params.allowfullscreen = "true";
params.wmode = "direct";
|
问题3:出现了如下错误
Error:Error #3669: 输入大小错误
at flash.display3D::Context3D/configureBackBuffer( )
在浏览器下,SWFOBJECT嵌入swf的时候,有瞬间的stage的width和height是0导致的,而 stage.scaleMode = StageScaleMode.NO_SCALE这句话会瞬间导致stage的width和height为0。
那怎么解决?
方法1:不用html包装器,在编译器里面不勾选
方法2:在使用html包装器的情况下,可以延迟初始化starling。
1
2
3
4
5
6
7
8
9
10
11
12
|
private
var
mStarling:Starling;
public
function
StartUp():
void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
setTimeout(initStarling,
1000
);
}
private
function
initStarling():
void
{
mStarling =
new
Starling(Game,stage);
mStarling.antiAliasing =
1
;
mStarling.start();
}
|
setTimeout(initStarling,1000);这是Flash预留了1秒处理舞台尺寸,然后处理初始化starling函数。
方法3:在使用html包装器的情况下,加入舞台重置尺寸事件的侦听来处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public
function
StartUp()
{
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
if
(stage.stageWidth>
0
&& stage.stageHeight>
0
){
start();
}
else
{
stage.addEventListener(Event.RESIZE,onResize);
}
}
private
function
onResize(e:Event):
void
{
if
(stage.stageWidth>
0
&& stage.stageHeight>
0
){
stage.removeEventListener(Event.RESIZE,onResize);
start();
}
}
public
function
start():
void
{
starlingEngin =
new
Starling(Game, stage);
starlingEngin.antiAliasing =
1
;
starlingEngin.start();
}
|
群里网友也提到了用Preloader预加载处理窗口大小,读者可以去尝试下。