Starling 2D框架简介

本系列是对Introducing Starling pdf的翻译,下文是对adobe开发人员中心的一片日志的转载,地址为http://www.adobe.com/cn/devnet/flashplayer/articles/introducing_Starling.html

Starling 是在 Stage3D APIs 基础上开发的一种 ActionScript 3 2D 框架(可用于 Flash Player 11 和 Adobe AIR 3的桌面)。 Starling 是为游戏开发设计的,但是你可以将它应用于很多其它的应用程序。 在不必涉及低级 Stage3D APIs 情况下,Starling 使得编写具有快速 GPU 加速功能的应用程序成为可能。

大多数 Flash 开发人员希望利用这种能力提高 GPU 的加速功能(通过使用 Stage3D 技术),而不必编写如此高级的框架和深入研究低级的 Stage3D APIs。 Starling 是完全基于 Flash Player APIs 而设计,并将 Stage3D(Molehill)复杂性抽象化。 因此每个人都能看到直观的程序。

Starling 是为 ActionScript 3开发人员而设计,尤其是这些涉及2D游戏开发的人员。 在使用 ActionScript 3 之前,你必须基本了解它。由于 Starling 轻便、灵活并易于使用,你也可以将它应用于其它项目需求,例如 UI 编程。 这种框架要求设计得越直观越好,因此任何 Java™ 或者.Net™ 开发人员都可以马上开始使用它。

Starling使用概述

Starling 直观并易于使用。Flash 和 Flex 开发人员能够快速地了解它,因为它遵循大多数 ActionScript 规则并将低级 Stage3D APIs 的复杂性抽象化。Starling 使用熟知的概念,例如DOM显示列表、事件模型以及熟知的如 MovieClip、Sprite、TextField 等APIs,而不是依靠诸如顶点缓冲(vertices buffer)、透视矩阵(perspective matrices)、着色程序(shader programs)和组合字节码(assembly bytecode)进行编码。

Starling在很多领域都很轻便。 类的数量是有限的(大概有80k的代码)。 除了Flash Player 11 或者 AIR 3(以及在未来的版本中使用的移动支持)之外,它没有外部依赖。 这些因素使得你的应用程序很小并使你的工作流程简单。

Starling能够免费使用并富有朝气。 它根据 Simplified BSD 许可获得授权,因此你可以免费地使用它,即便是在商业应用程序中也是如此。 我们每天都在使用它并且我们依靠一个活跃的团队不断地完善它。

在后台操作中,Starling 使用 Stage3D APIs —它们是在桌面上基于 OpenGL 和 DirectX ,在移动设备上基于 OpenGL ES2而运行的低级的 GPU APIs。 需要重点注意的是,Starling 是 Sparrow 的 ActionScript 3 端口,它等同于基于 OpenGL ES2 APIs 的ISO库(参见图1):

图1. Stage3D (Molehill) 分层位于 Starling 之上
图1. Stage3D (Molehill) 分层位于 Starling 之上

Starling 重新创建了很多 Flash 开发人员熟知的 APIs 。 下图列举了通过 Starling 暴露的图形元素 APIs(参见图2)。

图2. Starling支持DisplayObject继承
图2. Starling支持DisplayObject继承

在 3D GPU APIs 基础上可以创建 2D 内容,这看起来有点奇怪。 当涉及 Stage3D APIs 时,很多人认为这些 APIs 是严格地限制在 3D 内容中的。 实际上这是名称造成的误解:如果它叫做 Stage3D ,那么你怎么可以使用它创建 2D 元素呢?下图说明了关于使用 drawTriangles API 绘制 MovieClip 能力的问题(参见图3)。

图3. 可以使用drawTriangles API创建2D影片剪辑吗?
图3. 可以使用 drawTriangles API 创建2D影片剪辑吗?

GPU 具有较高的效率并能快速地绘制三角形。 通过使用 drawTriangles API ,你可以绘制两个三角形,然后选取一种纹理并且使用UV映射将它应用到三角形中。 这样可以创建了一个带有纹理的四边形,它代表一个 sprite 。 通过更新每一个帧上的三角形的纹理,最后的结果就是一个 MovieClip 。

幸好我们没有必要通过这些细节使用 Starling 。 你只需要提供帧数,将它们提供给一个 Starling MovieClip ,这就是所有需要做的(参见图4)。

图4. 使用 drawTriangles API 和一个带有纹理的四边形,你可以创建一个2D图形
图4. 使用 drawTriangles API 和一个带有纹理的四边形,你可以创建一个2D图形

为了更好地了解 Starling 如何降低复杂性,检查你必须写入的代码以便于用低级的 Stage3D APIs 显示简单的带有纹理的四边形。

复制代码
 1 // create the vertices
2 var vertices:Vector.<Number> = Vector.<Number>([
3 -0.5,-0.5,0, 0, 0, // x, y, z, u, v
4 -0.5, 0.5, 0, 0, 1,
5 0.5, 0.5, 0, 1, 1,
6 0.5, -0.5, 0, 1, 0]);
7
8 // create the buffer to upload the vertices
9 var vertexbuffer:VertexBuffer3D = context3D.createVertexBuffer(4, 5);
10
11 // upload the vertices
12 vertexbuffer.uploadFromVector(vertices, 0, 4);
13
14 // create the buffer to upload the indices
15 var indexbuffer:IndexBuffer3D = context3D.createIndexBuffer(6);
16
17 // upload the indices
18 indexbuffer.uploadFromVector (Vector.<uint>([0, 1, 2, 2, 3, 0]), 0, 6);
19
20 // create the bitmap texture
21 var bitmap:Bitmap = new TextureBitmap();
22
23 // create the texture bitmap to upload the bitmap
24 var texture:Texture = context3D.createTexture(bitmap.bitmapData.width,
25
26 bitmap.bitmapData.height, Context3DTextureFormat.BGRA, false);
27
28 // upload the bitmap
29
30 texture.uploadFromBitmapData(bitmap.bitmapData);
31
32 // create the mini assembler
33 var vertexShaderAssembler : AGALMiniAssembler = new AGALMiniAssembler();
34
35 // assemble the vertex shader
36 vertexShaderAssembler.assemble( Context3DProgramType.VERTEX,
37 "m44 op, va0, vc0\n" + // pos to clipspace
38 "mov v0, va1" // copy uv
39 );
40
41 // assemble the fragment shader
42 fragmentShaderAssembler.assemble( Context3DProgramType.FRAGMENT,
43 "tex ft1, v0, fs0 <2d,linear, nomip>;\n" +
44 "mov oc, ft1"
45 );
46
47 // create the shader program
48 var program:Program3D = context3D.createProgram();
49
50 // upload the vertex and fragment shaders
51 program.upload( vertexShaderAssembler.agalcode, fragmentShaderAssembler.agalcode);
52
53 // clear the buffer
54 context3D.clear ( 1, 1, 1, 1 );
55
56 // set the vertex buffer
57 context3D.setVertexBufferAt(0, vertexbuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
58 context3D.setVertexBufferAt(1, vertexbuffer, 3, Context3DVertexBufferFormat.FLOAT_2);
59
60 // set the texture
61 context3D.setTextureAt( 0, texture );
62
63 // set the shaders program
64 context3D.setProgram( program );
65
66 // create a 3D matrix
67 var m:Matrix3D = new Matrix3D();
68
69 // apply rotation to the matrix to rotate vertices along the Z axis
70 m.appendRotation(getTimer()/50, Vector3D.Z_AXIS);
71
72 // set the program constants (matrix here)
73 context3D.setProgramConstantsFromMatrix(Co
74 ntext3DProgramType.VERTEX, 0, m, true);
75
76 // draw the triangles
77 context3D.drawTriangles( indexBuffer);
78
79 // present the pixels to the screen
80 context3D.present();
复制代码

上述范例中的代码创建了一个正方形的2D实例(参见图5):

图5. 使用drawTriangles API 和一个带有纹理的四边形创建一个2D对象的结果
图5. 使用drawTriangles API 和一个带有纹理的四边形创建一个2D对象的结果

上述范例中所示的代码无疑是非常复杂的。 那是访问低级 APIs 需要付出的代价。 从另一方面说,你可以控制很多方面,但是它需要大量的代码来设置一切。

通过 Starling,你可以编写如下代码替换上述代码:

复制代码
 1 // create a Texture object out of an embedded bitmap
2 var texture:Texture = Texture.fromBitmap ( new embeddedBitmap() );
3
4 // create an Image object our of the Texture
5 var image:Image = new Image(texture);
6
7 // set the properties
8 quad.pivotX = 50;
9 quad.pivotY = 50;
10 quad.x = 300;
11 quad.y = 150;
12 quad.rotation = Math.PI/4;
13
14 // display it
15 addChild(quad);
复制代码

作为一个熟知如何使用 Flash APIs 的 ActionScript 3 开发人员,你可以立即使用这些已暴露的 APIs 开始工作,与此同时 Stage3D APIs 的所有复杂部分都可以在后台进行处理。

如果你使用重绘区域(redraw regions)功能进行试验,在 Starling 将在 Stage3D 上,而不是在预期的传统显示列表上渲染一切。 如下的截图说明了这种行为。 该四边形在每一帧上旋转,重绘区域(redraw regions)只显示FTP计数器,而不是 Stage3D 的内容(参见图6):

图6. 使用Stage3D渲染内容的范例
图6. 使用Stage3D渲染内容的范例

需要记住在使用 Stage 3D 构架时,通过 GPU 可以完全地渲染并合成相应的内容。 因此,在 GPU 上运行的用于显示列表的重绘区域(redraw regions)功能不能使用。

分层限制

当你使用 Starling(以及Stage 3D)时,记住开发内容有一个限制。 正如之前所述,Stage3D 完全是嵌入在 Flash Player 中的全新的渲染构架。 GPU 表层放置在显示列表之下,这意味着任何在显示列表中运行的内容将放置到 Stage3D 内容之上。 在编写这篇文章时,运行在显示列表里的内容仍然不能放置在 Stage3D 分层之下(参见图7)。

图7. 使用Stage3D渲染内容的堆叠顺序
图7. 使用Stage3D渲染内容的堆叠顺序

此外,还要注意 Stage3D 对象不是透明的。 如果这是可能的,那么你可以使用 Stage Video 技术(Flash Player 10.2引入的功能)播放视频,同时可以用通过 Stage3D 渲染的内容覆盖视频。 希望未来的 Flash Player 版本支持这一功能。

设置项目

你可以访问官方的 Github页面下载Starling。 此外,你可能发现访问 Starling 网站也会受益匪浅。

Starling根据 Simplified BSD许可获得授权,所以你可以在任何类型的商业或者非商业项目上使用Starling。 如果你需要更多的信息,你可以联系 Starling 框架团队。

在你下载Starling之后,你可以像引用其它AS3库一样引用Starling库。 为了使用Flash Player 11 beta的新版本,你必须把SWF版本13作为目标,这是通过将额外的编译器参数即-swf-version=13 传递给Flex编译器实现的。如果你正在使用 Adobe Flex SDK,那么请按照如下步骤操作:

  1.  Flash Player 11下载新的playerglobal.swc。
  2. 从Flex 4.5 SDK表中下载 Flex 4.5 SDK (4.5.0.20967)。
  3. 将相应的版本安装到你的开发环境中。
  4. 在 Flash Builder 中,通过选中File > New > ActionScript project 创建一个新的ActionScript项目。
  5. 打开 Property inspector(右击并选中Properties选项)。 在左边的菜单列表中,选中ActionScript Compiler。
  6. 使用右上角的 Configure Flex SDK 选项将项目指向 Flex build 20967。单击OK。
  7. 设置你的项目目标为SWF版本13。
  8. 打开Property inspector并从左侧菜单列表选中 ActionScript Compiler。
  9.  -swf-version=13 添加至 'Additional compiler arguments' 输入。这就保证了输出的 SWF 把 SWF 版本13当做目标版本。如果你在命令行而不在 Flash Builder 中进行编译,那么你必须添加相同的编译器参数。
  10. 核查你已经在你的浏览器中安装了新的Flash Player 11 版本。

设置场景

在你已经准备好了你的开发环境之后,你就可以深入研究相应的代码,并且看看你如何能够充分利用这一框架。 使用 Starling 非常简单,你只需创建一个 Starling 对象并添加到你的主类即可。 在本文中,当涉及到诸如 MovieClip, Sprite 以及其它对象时,我所指的都是 Starling APIs,而不是来源于 Flash Player 的本地对象。

首先,Starling构造器(constructor)需要多重参数。 下面是签名:

1 public function Starling(rootClass:Class, stage:flash.display.Stage, viewPort:Rectangle=null, stage3D:Stage3D=null, renderMode:String="auto")

 

事实上,只有前面3个经常使用。 相关的 rootClass 参数需要一个至扩展 starling.display.Sprite 的类的引用,而第二个参数是我们的 stage,然后是一个 Stage3D 对象:

复制代码
 1 package 
2 {
3 import flash.display.Sprite;
4 import flash.display.StageAlign;
5 import flash.display.StageScaleMode;
6 import starling.core.Starling;
7
8 [SWF(width="1280", height="752", frameRate="60", backgroundColor="#002143")]
9 public class Startup extends Sprite
10 {
11 private var mStarling:Starling;
12
13 public function Startup()
14 {
15 // stats class for fps
16 addChild ( new Stats() );
17
18 stage.align = StageAlign.TOP_LEFT;
19 stage.scaleMode = StageScaleMode.NO_SCALE;
20
21 // create our Starling instance
22 mStarling = new Starling(Game, stage);
23
24 // set anti-aliasing (higher is better quality but slower performance)
25 mStarling.antiAliasing = 1;
26
27 // start it!
28 mStarling.start();
29 }
30 }
31 }
复制代码

 

在下面的代码中,Game类在被添加到 Stage 时可以创建一个简单的四边形:

复制代码
 1 package 
2 {
3 import starling.display.Quad;
4 import starling.display.Sprite;
5 import starling.events.Event;
6
7 public class Game extends Sprite
8 {
9 private var q:Quad;
10
11 public function Game()
12 {
13 addEventListener(Event.ADDED_TO_STAGE, onAdded);
14 }
15
16 private function onAdded ( e:Event ):void
17 {
18 q = new Quad(200, 200);
19 q.setVertexColor(0, 0x000000);
20 q.setVertexColor(1, 0xAA0000);
21 q.setVertexColor(2, 0x00FF00);
22 q.setVertexColor(3, 0x0000FF);
23 addChild ( q );
24 }
25 }
26 }
复制代码

上述代码将一个侦听器添加到 Event.ADDED_TO_STAGE 事件中,并在事件处理程序中对应用程序进行初始化。 这样你就可以安全地访问 Stage。

注意: 关注一下这个微妙的细节:上面描述的 Game 类从 starling.display 程序包中,而不是从 flash.display 程序包中扩展了 Sprite 类。必须检查你的导入语句并确保你不是使用本地 API 来替代 Starling API。

正如在 Flash 中所预期的,Starling 中的对象有一个默认的位置0,0。因此添加几行命令使四边形位于 Stage 的中央:

1 q.x = stage.stageWidth - q.width >> 1;
2 q.y = stage.stageHeight - q.height >> 1;

现在,测试一下项目以便于观察相应的结果(参见图8):

图8. 四边形位于Stage的中央
图8. 四边形位于Stage的中央

注意锯齿消除功能(anti-aliasing)值允许你设置锯齿消除功能所需的类型。 一般来说,值为1就基本上可以接受,但是你可以选择其它值。 该框架支持的锯齿消除功能(anti-aliasing)值的变化范围是0到16,但是,下面的列表给出了最常用的值:

  • 0: 无锯齿消除(anti-aliasing)。
  • 2: 最低程度的锯齿消除(anti-aliasing)。
  • 4: 高质量的锯齿消除(anti-aliasing)。
  • 16: 极高质量的锯齿消除(anti-aliasing)。

你很少需要用到超过2的设置,尤其是对2D内容。 然而,根据你的项目要求,你需要针对具体情况作出相应的决定。 在图9中,比较一下两个截图,观察两个锯齿消除(anti-aliasing)值(1和4)之间的细微差别。

图9. 比较一下锯齿消除(anti-aliasing)值为1(左)和4(右)之间的视觉差别
图9. 比较一下锯齿消除(anti-aliasing)值为1(左)和4(右)之间的视觉差别

试验一下使用2以上的值为你的项目设置所需的质量。 当然,选择较高的值会影响性能。 注意 Stage3D 不会受到 SWF 文件的 Stage 质量影响。

下面给出能够与 Starling 对象一起使用的其它 API 的描述:

  • enableErrorChecking: 允许你启用或者禁止启用错误检查。 指定是否将渲染器遇到的问题报告给应用程序。 当 enableErrorChecking 设置为ture时,Starling 内部调用的 clear() 和 drawTriangles() 方法是同步的并可以抛出错误。 当 enableErrorChecking 设置为 false 时,clear() 和 drawTriangles() 方法是异步的且不报告错误。 启用错误检查将会减弱渲染性能。 只有当调试项目时启用错误检查功能,而在部署最终版本前禁止启用该功能。
  • isStarted:指示是否调用了 start。
  • juggler: juggler 是一个简单对象。 它仅保存了一列执行 IAnimatable 的对象,并且在被要求这样做的情形下提前了它们的时间(通过调用它自己的 advanceTime:方法)。 当一个动画完成时,它将会将其抛弃。
  • start: 开始渲染和进行事件处理。
  • stop: 停止渲染和进行事件处理。 当游戏进入后台运行状态以节约资源时,使用这个方法可以停止渲染。
  • dispose: 当你希望处理当前 GPU 内存上已渲染的全部内容时,调用这个方法。 该API能够在其内部处理了一切事务(例如着色程序(shader programs)、纹理和其它一切事务)。

一旦创建了你的 Starling 对象,调试记录会自动地输出,显示关于渲染的信息。 在默认情形下,当 SWF 文件正确地嵌入到页面或者当在独立的 Flash Player 中进行测试时,Starling 会输出如下代码:

[Starling] Initialization complete.
[Starling] Display Driver:OpenGL Vendor=NVIDIA Corporation Version=2.1 NVIDIA-7.2.9 Renderer=NVIDIA GeForce GT 330M OpenGL Engine GLSL=1.20 (Direct blitting)

当然,特定的硬件细节将会随着你的配置而变化。 上述信息表明已经使用了 GPU 加速功能,因为它包括驱动版本的细节。 为了便于调试,你可能希望能够强迫 Flash Player 内部使用的软件回退,以便了解当你的内容在软件上运行时它的表现如何。

添加如下的代码以便于通知 Starling 你希望使用软件回退功能(software rasterizer):

1 mStarling = new Starling(Game, stage, null, null, Context3DRenderMode.SOFTWARE);

当你使用软件时,输出的信息会确认你正在使用software 模式:

[Starling] Initialization complete.
[Starling] Display Driver:Software (Direct blitting)

确保你也在 software 模式下测试了你的内容,以便于更好地了解它在这种模式下的性能。 如果用户的配置使用旧版本的驱动(为了保持一致性,所有2009年之前的驱动都包含于黑名单中),那么你的内容可能回退到软件。

在下一节中,当你将你的 SWF 文件嵌入到页面时,你需要看一下 Stage3D 的要求。

Wmode 要求

你必须记住为了启用Stage 3D 和 GPU 加速功能,在页面中你必须使用 wmode=direct 作为嵌入模式。 如果你没有指定任何值或者选择除“direct”之外其它值,例如 “transparent”、“opaque” 或 “window”,则Stage 3D 将均不可用。相反,当 requestContext3D onStage3D被调用时,你会得到一个运行时异常的提示,告知你Context3D对象的创建失败。

下图列举了一个运行时异常的对话框:

图10. 在 Context3D不可用的情形下,运行时异常对话框
图10. 在 Context3D不可用的情形下,运行时异常对话框

如果你的应用程序嵌入时使用了错误的wmode,那么必须小心处理这种情形。 你需要通过显示一条解释这一问题的信息以便给出合理的响应。 幸运的是,Starling为你自动地处理了这一问题并显示如下信息:

图11. 当应用程序没有正确嵌入时显示的警告信息
图11. 当应用程序没有正确嵌入时显示的警告信息

Stage质量

作为一个Flash开发人员,stage质量的概念对你来说并不陌生。 记住当使用 Stage3D以及作为结果的Starling时,stage质量不会影响相应的性能。

渐进的增强功能

当GPU加速功能不起作用时,Stage3D将回退到软件中,并且将在内部使用一个名称为SwiftShader (Transgaming)的软件回退引擎。 为了保证你的内容在此种情形下运行正常,你需要检测什么时候你应该在software模式下运行,并且移除在software模式下可能会减慢运行速度的潜在影响。

在2D内容环境下,软件回退功能能够处理很多对象并提供良好的性能,但是,为了检测这一点,你仍然可以使用静态的属性环境从Starling对象中读取Context3D对象:

// are we running hardware or software?
var isHW:Boolean = Starling.context.driverInfo.toLowerCase().indexOf("software") == -1;

记住使用软件回退功能设计你的内容是一种很好的做法,它将提供一种渐进式的体验,从而确保在任何情形下都能获得最佳体验效果

转载于:https://www.cnblogs.com/klh5211314/p/3158674.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度

Android AutoCompleteTextView 控件实现类似被搜索提示&#xff0c;效果如下 1.首先贴出布局代码 activity_main.xml&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res…

java即时聊天系统毕业_(完整版)基于Java即时聊天系统的设计与实现毕业论文设计...

目录1 前言...................................................................................................................................1.1 课题选题背景...................................................................................................…

java与算法_Java与算法之(1) - 冒泡排序

冒泡排序法的原理是&#xff0c;每次比较相邻的两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。例如对4 3 6 2 7 1 5这7个数字进行从小到大的排序&#xff0c;从最左侧开始&#xff0c;首先比较4和3因为是从小到大排序&#xff0c;4和3的顺序显然是错误的&#xff0…

JQuery链式操作简单的菜单列表

看到这个简单的菜单demo&#xff0c;也是为了再看看JQuery对DOM的操作&#xff0c;一直都记不牢&#xff0c;特别是siblings&#xff08;&#xff09;这个总是想不起来。 这次再过一遍JQuery&#xff0c;不管简单的还是复杂的demo 还是坚持练习一遍吧&#xff01;只为记录&…

利用JS实现点击上一周或下一周却换

1.页面加载显示当前年份的第几周 效果如图&#xff1a; html代码&#xff1a; <font size"2" color"black"> <input id"btnweek5" type"button" class"btn" value"上周" οnclick"EduCommissio…

java reference 传引用_Java的引用(reference)---Roni

摘自《Java面向对象编程》一书,作者:孙卫琴 来源:www.javathinker.org在JDK1.2以前的版本中&#xff0c;当一个对象不被任何变量引用&#xff0c;那么程序就无法再使用这个对象。也就是说&#xff0c;只有对象处于可触及状态&#xff0c;程序才能使用它。这就像在日常生活中&am…

C# 以管理员身份运行程序

刚看了一篇博友写的“以管理员身份运行程序”, 所以我也来写一个简单易懂的&#xff0c;简单两步搞定&#xff0c;不用写任何代码&#xff1a; 第一步&#xff1a; 右键选择项目 > 添加 > 新建项 &#xff1b; 找到 应用程序清单文件&#xff0c;后缀名为manifest&#x…

会计转行从事IT,如何在一年时间内全职学习?

2019独角兽企业重金招聘Python工程师标准>>> https://www.zhihu.com/question/21427478/answer/18227060 转载于:https://my.oschina.net/soho00147/blog/836138

如何生成后缀表达式

如果计算一个表达式&#xff0c;比如 456*2&#xff0c;随着计算器的不同&#xff0c;简单的四功能计算器是30&#xff0c;许多科学计算器知道乘法的优先级高于加法&#xff0c;所以科学答案是21。典型计算顺序可以是计算45&#xff0c;存为临时变量a&#xff0c;再计算6*2&…

【原生JS插件】LoadingBar页面顶部加载进度条

先展示一下已经实现的效果&#xff1a; 预览地址&#xff1a;http://dtdxrk.github.io/js-plug/LoadingBar/index.html 看到手机上的浏览器内置了页面的加载进度条&#xff0c;想用在pc上。 网上搜了一下&#xff0c;看到几种页面loading的方法&#xff1a; 1.在body头部加入lo…

qtp启动java程序_转: QTP六脉神剑之调用Java程序

查看( 1147 ) /评论( 21 )六脉神剑之调用程序0Xp1zLN_0版权声明&#xff1a;原创作品&#xff0c;转载请以链接方式注明出自http://www.51testing.com/?35&#xff0c;否则将追究法律责任。51Testing软件测试网y|X,taS51Testing软件测试网b;|w6I"g6oK本文出自songfun的51…

第八章 Python 对象和类

一、什么是对象 在 Pyth 中&#xff0c;对象就是经过实例化的&#xff0c;具体可以操作的一组代码的组合&#xff1b; 对象一般包含数据&#xff08;变量&#xff0c;更习惯称之为属性 attribute&#xff09;&#xff0c;也包含代码&#xff08;函数&#xff0c;也称之为方法&a…

Spring WebSocket初探2 (Spring WebSocket入门教程)

2019独角兽企业重金招聘Python工程师标准>>> WebSocket前端准备 SockJS&#xff1a; SockJS 是一个浏览器上运行的 JavaScript 库&#xff0c;如果浏览器不支持 WebSocket&#xff0c;该库可以模拟对 WebSocket 的支持&#xff0c;实现浏览器和 Web 服务器之间低延迟…

String类的使用 Part2

StringBuilder 类的使用 属性&#xff1a; namespace StringBuilderTest {class Program{static void Main(string[] args){StringBuilder s new StringBuilder("hello,world!");Console.WriteLine(s);//Length属性Console.WriteLine("s.Length{0}", s.Le…

JAVA项目怎么不是蓝色_解决IDEA创建maven项目时pom.xml没有变蓝的问题

如下所示&#xff1a;选中pom.xml&#xff0c;右键点击add as maven project&#xff0c;稍等片刻后就可以了补充知识&#xff1a;Idea导入maven项目不自动识别pom.xml*Idea导入maven项目不自动识别pom.xml*当在idea中导入maven项目时&#xff0c;不能自动识别pom文件解决方法&…

C# 6.0:Expression – Bodied Methods

Expression-bodied 方法是C# 6.0 中另一个能简化代码的特性。我们已经对lambda表达式将funciton和delegation关联起来的这种用法很熟悉了。Expression-bodied 将lambda 表达式的这种用法扩展到了方法上。 像下面代码所示&#xff0c;我们有一个GetTime() 方法返回一个格式化的时…

POJ 1228 Grandpa's Estate --深入理解凸包

题意&#xff1a; 判断凸包是否稳定。 解法&#xff1a; 稳定凸包每条边上至少有三个点。 这题就在于求凸包的细节了&#xff0c;求凸包有两种算法&#xff1a; 1.基于水平序的Andrew算法 2.基于极角序的Graham算法 两种算法都有一个类似下面的语句&#xff1a; for(int i0;i&…

赵强老师免费公开课第一季:Hadoop的背景起源

标签&#xff1a;免费直播课 Hadoop 大数据 赵强原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://51edu.blog.51cto.com/8899635/1897555 Hadoop大数据免费公开课招募啦~~~赵强…

.NET Windows服务应用程序

此文旨在记录个人对windows服务的理解以及学习记录&#xff0c;高人可以直接绕行。 1.Windows 服务体系结构 http://technet.microsoft.com/zh-cn/library/aa998749(vexchg.65).aspx Windows 服务&#xff08;也称服务应用程序&#xff09;是无论用户是否登录都运行在 Windows …

bootstrap-代码-内联代码

说明通过 <code> 标签包裹内联样式的代码片段示例<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"view…