Hatena::Groupactionscript

ConquestArrow.addEventListener();

2007-07-01

[]Flex3SDK betaの隠しAPI 14:29 はてなブックマーク - Flex3SDK betaの隠しAPI - ConquestArrow.addEventListener();

ドキュメントに載っていないAS3の隠しAPI(関数、クラス)シリーズ番外編。

「Flex3にも隠しAPIはあるのかな…、でもFlex3でも基本部分はFlex2と同じだから、すくなくともコア部分にはないだろうな…」と思っていたら予想に反してあった。betaなのでオミットされる可能性はもちろんあるが、とりあえずメモ。

調べたSDKに同封のmxmlcのバージョン:Version 3.0 build 172357

flash.samplerパッケージ

  • flash.sampler.Sample
  • flash.sampler.NewObjectSample
  • flash.sampler.DeleteObjectSample
  • flash.sampler.getGetterInvocationCount
  • flash.sampler.getSetterInvocationCount
  • flash.sampler.getSize
  • flash.sampler.isGetterSetter
  • flash.sampler.getMemberNames
  • flash.sampler.clearSamples
  • flash.sampler.getSampleCount
  • flash.sampler._getInvocationCount
  • flash.sampler.getInvocationCount
  • flash.sampler.getSamples
  • flash.sampler.stopSampling
  • flash.sampler.pauseSampling
  • flash.sampler.startSampling

Flex3ではAIR向けにパッケージが沢山追加されているが、意外にもAIR向け以外のパッケージも追加されていた。使い方は調べていないが、名前から推測すると実行時のプロファイラと色々連携しそうな感じではある。

flash.utilsパッケージ

  • flash.utils.ObjectInput
  • flash.utils.ObjectOutput

どうみても対になる2つのクラスが。

toplevel

  • UninitializedError

toplevelに新しいエラーが追加されていた。初期化に失敗した時にthrowされる?

nitoyonnitoyon2007/07/25 09:23隠しAPIはどうやって調べているんでしょうか?

ConquestArrowConquestArrow2007/07/27 01:04Flex2SDK/Flex3SDKの中にframeworkディレクトリがありますが、このなかにはコンパイル時に共通で読み込まれるSWCファイルがあります。中でも重要なのはplayerglobal.swcファイルでコアAPIが含まれています。

で、このSWCファイルなんですが、実はSWFとXMLをZIPで固めたもので、拡張子を書き換えるとlibrary.swfとcatalog.xmlに解凍できます(ちなみに、library.swfは再生しない方がいい、とどこかに書いてありました)。catalog.xmlは文字通りそのSWCに含まれるクラスなどの情報を列挙したもので、playerglobal.swcの場合はコアAPIが列挙されることになります。これを除けば本来Undocumentなクラスやパッケージがみえる、というカラクリです。たとえば、まだ紹介していませんが、flash.profilerパッケージなど興味深い名前のものが幾つか見つかることでしょう…。

catalog.xmlで分かる情報は、パッケージ、クラス、パッケージ内関数で、クラスメソッドは分かりません。Flex2SDKの場合は、asc.jarなどを組み合わせた方法でクラスメソッドとその引数など大分細かくわかる方法があるのですが、Flex3SDKではどうも対策されてしまったようで、catalog.xml以上のことはわかりません。flash.system.System.gc()みたいな便利なメソッドが追加されているのかもしれませんが、残念ながらFlex3に関しては不明です。

MoheMohe2012/04/15 13:54Your post has lifted the level of debtae

トラックバック - http://actionscript.g.hatena.ne.jp/ConquestArrow/20070701

2007-05-26

[][]drawRoundRectComplexパフォーマンス対決 20:52 はてなブックマーク - drawRoundRectComplexパフォーマンス対決 - ConquestArrow.addEventListener();

前回の記事で紹介した、drawRoundRectComplex()だが、Flex2には実は同名のメソッドが存在する。mx.utils.GraphicsUtilクラスのdrawRoundRectComplex()メソッドだ。

使い方もほぼ同じで、第一引数に描画対象のGraphicsクラスのインスタンスを指定する以外は同じである。

GraphicsUtil.drawRoundRectComplex(graphics:Graphics, x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number):void

これはstaticなメソッドなので実際の使い方は次のようになる。

package{
	//import 
	import flash.display.*;
	import mx.utils.GraphicsUtil;
	[SWF(width="200", height="200")]
	public class GraphicsUtilTest extends Sprite{
		public function GraphicsUtilTest(){
			this.graphics.beginFill(0xFFFFFF);
			GraphicsUtil.drawRoundRectComplex(
				this.graphics,
				10,
				10,
				180,
				180,
				10,	//top left
				10,	//top right
				10,	//bottom left
				10	//bottom right
			);
		}
	}
}

f:id:ConquestArrow:20070526203311p:image

ちなみに、このメソッドは隠しでもなんでもなく、リファレンスに乗っている。

使い方がほとんど同じ、なら気になるのはパフォーマンスの差である。そこでさくっと調べてみた。

テストコード

package {
	import flash.display.*;
	import flash.utils.getTimer;
	import mx.utils.GraphicsUtil;
	
	public class RoundRectComplexTest extends Sprite{
		private static const DRAW_TIMES:uint = 10000;
		public function RoundRectComplexTest(){
			
			var g:Graphics = this.graphics;
			
			trace("Graphics:",this.procGraphics(g));
			trace("GraphicsUtil:",this.procGraphicsUtil(g));
		}
		
		private function procGraphics(g:Graphics):String{
			var old:int = getTimer();
			for(var i:uint; i<DRAW_TIMES; i++){
				g.beginFill(0xFFFFFF);
				g.drawRoundRectComplex(
					10,
					10,
					180,
					180,
					30,
					30,
					30,
					30
				);
			}
			
			return (getTimer() - old).toString();
		}
		
		private function procGraphicsUtil(g:Graphics):String{
			var old:int = getTimer();
			for(var i:uint; i<DRAW_TIMES; i++){
				g.beginFill(0xFFFFFF);
				GraphicsUtil.drawRoundRectComplex(
					g,	//graphics
					10,
					10,
					180,
					180,
					30,
					30,
					30,
					30
				);
			}
			
			return (getTimer() - old).toString();
		}
		
	}
}

それぞれ10000回描画してみてかかった時間を測定した。念のため、10回測定してその平均もだしてみた。結果は以下の表。

GraphicsGraphicsUtil
1回目97132
2回目115134
3回目106132
4回目97131
5回目113155
6回目130151
7回目99140
8回目101141
9回目99135
10回目100132
平均(ms)105.7138.3

mxmlc: Version 2.0.1 build 162628

10000回やって差が約30msだとほとんど差が無いが、それでもやはりGraphics.drawRoundRectComplexの方が速い。

うーん、ドキュメント化されていない謎は深まるばかり。

トラックバック - http://actionscript.g.hatena.ne.jp/ConquestArrow/20070526

2007-05-23

[]Graphics.drawRoundRectComplex(x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number) 00:45 はてなブックマーク - Graphics.drawRoundRectComplex(x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number) - ConquestArrow.addEventListener();

ドキュメントに載っていないAS3の隠しAPI(関数、クラス)シリーズ。

Graphics.drawRoundRectComplex(x:Number, y:Number, width:Number, height:Number, topLeftRadius:Number, topRightRadius:Number, bottomLeftRadius:Number, bottomRightRadius:Number):void

見にくいので整えた。

drawRoundRectComplex(
	x:Number,
	y:Number,
	width:Number,
	height:Number,
	topLeftRadius:Number,
	topRightRadius:Number,
	bottomLeftRadius:Number,
	bottomRightRadius:Number
)

drawRoundRectが角の縦と横の半径の指定だけなのに対し、こちらは、4つの角のそれぞれ別の半径を設定できる関数。これまで紹介した中でも一番、何故Undocumentedなのかわからないもの。

こんな図形が簡単に。

f:id:ConquestArrow:20070523004243p:image

package {
	import flash.display.*;
	[SWF(width="200", height="200")]
	public class DrawRoundRectComplex extends Sprite{
		public function DrawRoundRectComplex(){
			var s:Shape = new Shape();
			var g:Graphics = s.graphics;
			g.beginFill(0xFFFFFF);
			g.drawRoundRectComplex(
				10,
				10,
				180,
				180,
				50, //top left
				0, //top right
				0, //bottom left
				50 //bottom right
			);
			this.addChild(s);
		}
	}
}

JaelynJaelyn2011/12/13 17:00Woah nelly, how about them appels!

rakyjnrakyjn2011/12/14 03:47ZDPKI6 <a href="http://sqlykgoosirj.com/">sqlykgoosirj</a>

yhqsxnmpyuwyhqsxnmpyuw2011/12/15 01:473CHblS , [url=http://nibpyyjjxwia.com/]nibpyyjjxwia[/url], [link=http://nqeuctohksuk.com/]nqeuctohksuk[/link], http://wkqmybqaufdt.com/

gereonnjuvcgereonnjuvc2011/12/15 19:18UOmrtS <a href="http://siofxvaknlwq.com/">siofxvaknlwq</a>

qcodjkppxdqcodjkppxd2011/12/16 00:37yOKNQb , [url=http://nygxtjhgiuui.com/]nygxtjhgiuui[/url], [link=http://ujbdssbyrwcn.com/]ujbdssbyrwcn[/link], http://gcldhtdiytsm.com/

トラックバック - http://actionscript.g.hatena.ne.jp/ConquestArrow/20070523

2007-05-17

[]System.vmVersion 01:09 はてなブックマーク - System.vmVersion - ConquestArrow.addEventListener();

ドキュメントに載っていないAS3の隠しAPI(関数、クラス)シリーズ。

System.vmVersion

(おそらく)AVMのバージョンを返すSystemクラスのプロパティ。

このバージョンは内部的なもので、AS1/2を実行するAVM1かAS3を実行するAVM2か、ではなく、AVM2(AVM+)の内部バージョンらしい。

例:「FlashPlayer WIN 9,0,45,0 debugの場合」

import flash.system.*;

...

var str:String = System.vmVersion;
trace(str);	//ex. 「1.0 d597」

手元のFlashPlayer9では1.0 d597と返ってきた。

SiphoSipho2012/12/29 17:58Thanks for introducing a little ratioalntiy into this debate.

vbjdymovbjdymo2013/01/02 12:083OqHdd , [url=http://xnhbihnwtwge.com/]xnhbihnwtwge[/url], [link=http://kztpdrwzuvto.com/]kztpdrwzuvto[/link], http://fnwbmninufvj.com/

トラックバック - http://actionscript.g.hatena.ne.jp/ConquestArrow/20070517

2007-05-12

[]flash.debugger.enterDebug() 11:23 はてなブックマーク - flash.debugger.enterDebug() - ConquestArrow.addEventListener();

ドキュメントに載っていないAS3の隠しAPI(関数、クラス)シリーズ。

flash.debugger.enterDebug()

デバッガーを起動できる関数。クラスに属しているわけではなくて、package直下の関数。そもそも、flash.debuggerというpackage自体が隠しpackageになっている。コード中の任意の箇所でデバッグを開始できる利点がある。デバッグ版のプレイヤーで右クリックメニューから起動するのと同じ?

使い方

//インポート
import flash.debugger.enterDebug;

...

enterDebug();

参考:Conditionally enter Debugger in Flex 2

[]Error.throwError(type:Class, index:uint, ... rest) 16:32 はてなブックマーク - Error.throwError(type:Class, index:uint, ... rest) - ConquestArrow.addEventListener();

ドキュメントに載っていないAS3の隠しAPI(関数、クラス)シリーズ。

Error.throwError(type:Class, index:uint, ... rest)

任意のエラーをthrowするErrorクラスの関数。第一引数typeにはエラー系のクラス(Error, ArgumentError, EvalError...)を指定し、第二引数indexにはエラーコードを指定する。第三引数以降は、そのエラーコードに対応したエラーメッセージ中のリファレンスだと「_」であらわされている所に入る文字列を指定する。

基本的には内部で使われている様子。普通はthrow new Error(...)なんていう形が基本なのであんまり使いどころがない。

第一引数ErrorでなくてClassなのが不思議なところだが、Tamarinのソースの中に入っていた実装をみるとErrorとその子孫クラスしか想定してなさそうだったので他のクラスを指定しても意味がなさそうだ。

OtmanOtman2012/04/15 10:31That's a smart way of lokiong at the world.

djsasjdjsasj2012/04/19 00:38NkKrLd , [url=http://toitvxjvvxzq.com/]toitvxjvvxzq[/url], [link=http://oweivlzunyov.com/]oweivlzunyov[/link], http://mhaxeqmzrejp.com/

トラックバック - http://actionscript.g.hatena.ne.jp/ConquestArrow/20070512