【AS】ActionScript技術交換スレ Part4

■ このスレッドは過去ログ倉庫に格納されています
2005/12/22(木) 01:22:31ID:Dj6CR8TB
ムービー内の詳しいASの組み方はもちろん、PerlやJava・PHPを介したCGI連携といった技術や、
XMLSocketを使用したオンラインゲームなど、ムービー以外の用途として活躍するActionScriptの技術交換スレです。
また、AS2.0/3.0の話、Flash Media ServerとかColdFusionやRemoting、コンポーネント等、
他スレでは話題に上がりづらいFLASH周りのコアな技術交換&雑談にもご利用下さい。

前スレ
http://pc8.2ch.net/test/read.cgi/swf/1071929938/

前々スレ
http://pc4.2ch.net/test/read.cgi/swf/1054659810/

前々々スレ
http://pc3.2ch.net/test/read.cgi/swf/1030886688/

※:なおこのスレでは「NowLoadingどうやるの?」みたいな
  初歩的な質問は受け付けませんのであしからず。
  その手の質問やそれに近いレベルの質問は↓でドゾー
ActionScript 誰かが物凄い勢いで解答するスレ 10
http://pc8.2ch.net/test/read.cgi/swf/1134826648/

参考サイトや参考スレは>>2-5以内。
2007/04/12(木) 14:19:33ID:ktJSj56X
なんだ、ただのしったか君か。
2007/04/12(木) 14:32:32ID:90P0V9Rw
>>316

Flash9 Public Alphaとか見る限り、
フレーム上でもかけるよ。

Flex2 Builderの方では、触ったかぎりフレームという概念自体がない
2007/04/12(木) 14:58:45ID:koi5NMUt
[Frame()]タグでゴニョゴニョするってのはあるけど、わかりやすい方法ではないね
2007/04/12(木) 15:13:58ID:JdJEaK3B
>>316
「AS2と同じ」と言われてもピンとこないのですが…


Flexスレで、プリローダ作るのに[Frame]メタデータ使ってたんで、
もしやASだけでフレームスクリプトが書けちゃうアンドキュメンテッドな技法があるのかなと思って聞いてみたんですが、
そうでもなさそうな感じですかね。
タイムラインが使いたければFlashを、っていう住み分けになっていくのでしょうか。


スクリプトだけで、もしくはコンパイラの指定なんかで
ごりごりフレームが増やせちゃったりできるといいんだけど。
2007/04/12(木) 15:14:51ID:8q1634YF
FlexじゃなくてFlashの話。
2007/04/12(木) 16:18:29ID:90P0V9Rw
>>320

あぁ・・・そんなメタデータあった・・・ すっかり忘れてた。

Flex使おうってコーダー肌の人なら、
シンプルなタイムラインなら
自力で実装するの難しくないと思うよ。

関数を配列に突っ込んでいって、
onEnterFrameで1づつインデックス動かして、
中の関数を実行すれば擬似Timelineは作れると思う。
2007/04/12(木) 17:01:25ID:JdJEaK3B
>>322
実は、こっちのスレだったかFlexスレだったかで、
addChild/removeChildを繰り返すとPlayerが落ちる
って話しが出てましたから、
空白のキーフレーム追加でばっちり解決っ!ってなことを目論んでました。
「フレームスクリプトが書ける」のならフレームの追加もスクリプトでできるんじゃないかと…

しかしこの話題は海の向こうでも揉めてるようでw
http://www.mail-archive.com/flexcoders@yahoogroups.com/msg59707.html

>>擬似タイムライン
今見つけたんですが、(有名だったらすみません)
http://d.hatena.ne.jp/asahiufo/20061119
とかおもしろそうですね。
2007/04/12(木) 18:34:40ID:kDLRii/9
>addChild/removeChildを繰り返すとPlayerが落ちる
>って話しが出てましたから、
>空白のキーフレーム追加でばっちり解決っ!ってなことを目論んでました。
状況がわかりにくいな
2007/04/13(金) 10:31:07ID:mpAQrj+i
すみません。
ステージ上にMCをいくつか配置した後、
一旦ステージをまっさらにする必要があるのですが、
その際removeChild使ってムービークリップを一つずつ消していくんじゃなくて、
空白のキーフレームを挿入して一発で前部消してしまう、ってことがしたかったのです。
2007/04/13(金) 13:41:22ID:mxneYkC+
AS3でそれをやると、よほど注意しないと
イベントのヌルポとかで死ぬよ
2007/04/13(金) 14:11:43ID:hUfDsHqK
それは階層の設計でどうにでもなるからわざわざフレーム使うのはおかしい。
ShapeかBitmapの書き換えは良く使うけどSpriteはスクリプト制御で足りから
ランタイム中に追加フレームがどうしても必要なケースって想定できないなあ。
ありゃあったで便利だけど。


2007/04/13(金) 14:55:13ID:mxneYkC+
>>325

個人的にはステージにcontainerってスプライト造って、
全部のMCはその中に入れる。
全て消すときはcontainerをremoveChildする、が妥当じゃないかと。
2007/04/13(金) 16:25:37ID:mpAQrj+i
>>327
先のMLでもそういう風に言われてるみたいです。
>>328
らじゃ。その方向でいきます。
2007/04/20(金) 16:14:28ID:8Uhr7SoJ
FlexBuilderって、Flexプロジェクトと、ActionScriptプロジェクトがあるじゃないすか。
Flexプロジェクトって、構造がよく分かんなくて気持ち悪いから、ActionScriptプロジェクトで作ってるんだけど
ActionScriptプロジェクトで制作しつつ、Flexコンポーネント(ColorPickerとか)を使うって出来ないんすか?
2007/04/20(金) 17:13:06ID:TaF8Bl29
>>330

俺それ仕事でやったことあるよ。
ASプロジェクトだと、Flex系のクラスが読み込まれないから
プロジェクト右クリックから、
プロパティ→ビルドパス→ライブラリパス→SWCの追加を選んで、
flex.swcやframework.swf, rpc.swcあたりを追加すると
Flexのクラスが使えるようになる。

ただFlexのデータクラスは使えるけど、ビジュアルコンポーネントは多分無理。

ビジュアルコンポーネント使いたかったら、FlexプロジェクトでMXMLにスクリプトだけで

<mx:Script>
public function init(){
var main:Main = new Main()
main.run()
}
</mx:Script>

みたいなことだけ書いて、applicationのapplicationComplete="init()"で起動すればOKかと。
2007/04/20(金) 19:01:11ID:8Uhr7SoJ
>>331
レスどもっす!
やっぱ、ビジュアルコンポーネントは使えないのかー。一部だけ使いたいのにな…。
データコンポーネントも、ActionScriptからの使い方があんまり詳しく乗ってないすよね。
WebServicesクラス使いたかったんだけど、いまいち分からなかった...orz
MXML上では<operation>要素を追加すればいけるけど、
ASだとoperations:ArrayにAbstractOperationクラスを突っ込むみたいな違いが…。

もうちょい勉強しよ。
2007/04/28(土) 22:16:47ID:E9mvMSLJ
閑散としてるなぁ... (´・ω・`)

最近papervision3Dやっててタノシス。
Papervision3Dの、AS2番ってSVN1から落としてきても
エラーでまくりで、ちゃんと動かなくね? 俺だけかな…。
2007/04/29(日) 00:02:49ID:f0vH5pGP
>>333
なんか日本語環境で表示おかしくなる文字があるから
いっかい何かのテキストエディタで一回全ソース保存し直せばうごくかも。

というか俺はそうした。
335333
垢版 |
2007/04/29(日) 04:34:16ID:VzBrSgkt
うお。ホントだ…。エラーでなくなった。
import のファイル名とか絶対合ってるのに何でなんだぜ?って思ってますた... orz
2007/04/30(月) 20:04:19ID:nKF0ArW1
>>335
ところで、
Papervision3DだったらAS3版のほうが良いと思うぞ。AS2だとあまり速度が出ない。
300ポリゴンを越えたあたりでAthlon64 3200+ で30Fpsの表示が怪しくなってくる。

AS3コンパイル環境もそろえようと思えばすべてタダでそろうし。
337333
垢版 |
2007/05/01(火) 20:05:45ID:1/Iggacb
>>336
やっぱAS2版だと、あんまパフォーマンス良くないんだ…。
AS3版では実際プロトタイプとか作ってみました。

ただ、サイト全体AS3っていう案件は、まだ無いだろうから
Flash Player 8 の案件で、ちょろっと3D効果出すのに使えたらいいなーっと。
2007/05/01(火) 20:30:37ID:p3gzszCx
AS3でサイト構築いいねぇ
重くて使えなかった物理演算グリグリ
2007/05/12(土) 13:07:08ID:16mwY0np
Flexからはじめたものです。

数万単位のSpriteを一度に出したり消したりすると、ガベージコレクションが
間に合わなくて、最終的にタイムアウトを起こしてしまうんですが、
なんとかならないでしょうか?

特に個々のcacheAsBitmapを有効にしていると、キャッシュが破壊されて
デスクトップ全体を巻き込む大惨事に発展するんですが・・・。
2007/05/12(土) 13:39:51ID:pUI/ypHy
数万単位のSpriteを一度に出したり消したりしなくて良いようにする。
2007/05/12(土) 14:03:33ID:aiHBWBeT
>>339

3000個ずつ10フレームにずらすとか、工夫しろ。

あと3万個をcacheAsは無理だろう。
1個10kbだとしても、300Mいくぞwww

342339
垢版 |
2007/05/12(土) 22:15:52ID:16mwY0np
339です。

結局、キャッシュは大元のキャンバスだけに効かせるようにしました。
単純にtransformオブジェクトの操作だけで出来るもの(移動や色の変更など)は、
自分でキャッシュを指定するまでもなく速いようなので。

>3000個ずつ10フレームにずらすとか、工夫しろ。
なるほど、フレームをずらすとタイムアウトが避けられるというわけですね。
Flexからはじめたのでフレームという概念がちと怪しいのですが、
UIComponentでいえば、validateNow()で1フレーム進むと考えていいんでしょうか?

数万単位のSpriteを一度に出したり消したりする、というのは、
ちょうど作っているのがドロー系のソフトウェアに近いものなので
オブジェクトを一度に削除したりする上に、アンドゥにも対応する必要が
あるからです。
せっかくモデル部分だけをアンドゥにスタックするように
作ったのに、削除したSpriteがちっとも開放されてくれないという・・・orz
343339
垢版 |
2007/05/12(土) 22:55:40ID:16mwY0np
あ、サンプル見たらわかりました。
callLater使ってちょぼちょぼ追加するのが健康によさそうですね。
2007/05/13(日) 04:24:32ID:p9qM+rmC
なんでドロー系のソフトでSpriteを数万も使おうとするのか全くわからん。
数万もレイヤーがあるのか
345339
垢版 |
2007/05/14(月) 08:16:39ID:Tplo/ZJ+
>344
ビットマップ転送で1枚のSpriteに直接描くとラクですが、
描いた曲線などのマウスヒット判定が必要なのでボツになりました。


2007/05/14(月) 10:28:04ID:vjPgWV8P
>>345

数万個にhittestは無理じゃない?普通に。
クアッドツリー(四分木)とかそういうの使って、衝突判定しないと。

2007/05/17(木) 14:39:27ID:CpLI7TJQ
Flash8使ってます。長めのノベルゲームを作ってみたいのですが、テキストフィールドにシーン毎にテキストを書くと手間が非常にかかってしまいます。
そこでシナリオファイルを読み込ませて処理させたいのですが、外部からテキストを読み込ませる方法だと外から丸見えになってしまうので困ってしまいます。
こういう時はどういう方法を使うのがベターなんでしょうか?
変数に長い文字列を割り当てて処理させる方法がいいんですかね?
なにか格好が悪いので、もう少しスマートな方法がないものかなと思うのですが……。
あと、あまり長い文字列割り当てるとメモリ消費量は大丈夫なのかなという心配もあります。

var buf:String = "*start"
+ ",[image name='Aくん' pos=left]"
+ ",Aくん「こんぬつは」";

var aScenario:Array = buf.split(",");
trace(aScenario[0]);

こんな感じでやってます。
2007/05/17(木) 15:32:18ID:fSOG1ggW
課金がからむFlashゲームとか見ると
getやらpostで送信されるデータの中身見れなかったりするね。
ああいうの結構特殊なことやってるんだろうなあ。

as3ならばByteArrayを用いれば
やりとりされるデータをぱっとみわからなくすることができそうだけど。
2007/05/17(木) 23:56:09ID:NjF7RrCJ
>>348

素人の盗み見を排除するだけでよければ、
文字コードをいくつかずらして保存したテキストファイルを読み込んで、
逆にずらして復元すればいいんじゃないかと。
350339
垢版 |
2007/05/18(金) 01:05:48ID:pzV8S/bB
>346
結局、Shape内の座標1ドットだけbitmapDataに書き出してヒット判定する
メソッドを作成しますた。

複数のShapeの単純な重ね合わせ処理をsetPixel()使ってドット単位で合成するのは
DisplayObjectContainerの重ねあわせよりも速いですか?
こういった言語はビットマップを直接処理するのは遅いものだと思っていたのですが、
上の処理がわりと速かったので、明日やってみようかと。
2007/05/18(金) 08:19:03ID:bQAitxEI
>>350

もしAS3でやってるんなら、Rasterってライブラリをググッて探すとよい。
ディフォのベクター描画よりもはやい、ビットマップ描画ライブラリがある。

2007/05/18(金) 12:07:09ID:+OU3bNWl
>>348に関連するけど、ゲームのランキングとか
どのぐらい、パッと見で分からなくすればいいのか悩む。
353339
垢版 |
2007/05/19(土) 02:33:26ID:PS4eqgbR
>351
ありがとうございます。
ビットマップ上で直接描画するライブラリを用意する方向は
考慮していなかったので目からウロコです。
これを拡張する方向でやってみます。

スケールとか考えるとまたユウウツですけどね(^^;
2007/05/30(水) 10:25:16ID:dBRfZMi1
なんかできた

AVM1Fixer
http://www.kaikoga.net/m/archives/20

Flash8以前で作ったswfファイルをActionScript3.0でフルアクセスできるように変換するという
必要でない人には本当に役に立たないソフトです。

これはJavaでswfファイルを前もって変換するためのソフトなんですが、
swfファイルを直接バイナリで読み込んで動的に変換する方法がブログの世界では人気みたいです。
ByteArrayの値を書き換えるだけでは
(現時点では)Flash8の無圧縮のswfに限定されるみたいですが。

ただ、ByteArrayに6バイトの値を挿入できればFlash7以前のswfも動的に変換できるし、
ByteArray.uncompress()あたりを振り回せば理論上は圧縮swfも動的に変換できるはずなんです。
まだ誰もやってないだけで。
私はやりません。
2007/05/30(水) 11:32:16ID:YgXOam6i
>>354
ためしてないけど乙
2007/05/30(水) 12:23:53ID:YmQVd23D
こういった改造で以前のバージョンのswfにアクセス可能になるのであれば
公式にサポートしてくれてもよいような気もするが
やはりどこかに何か問題があるのかな。
2007/05/30(水) 18:34:37ID:ZP+IQkWi
フルアクセスってAS2の関数の実行も可能?
とりあえずlcとajaxbridgeで事足りるからいいんだけど。
2007/05/30(水) 20:36:14ID:dBRfZMi1
>>356
改造で読み込んだswfについてまであどべさんはサポートしたくないでしょう。
私もしたくないです。

具体的には、時代を遡るほど使われてるタグが微妙に変化していくので
(タグってのは簡単に言うとswfファイルの中で使われてる言葉のこと)
昔のswfほどFlashPlayerにとって想定外な入力になります。
たとえ問題がなかったとしても、全部の場合についてテストするのは私もしたくないです。

>>357
さすがにAS2.0の関数は全部消えるです。残念ながら。
AS2.0の関数を動かすにはAVM1で動かすしかないので、必然的にLCなどで通信するしかない。

直接MovieClip.gotoAndPlay()が叩けるって意味でした、まぎらわしくてごめんなさい。
2007/05/30(水) 20:38:35ID:dBRfZMi1
あと、ボタンアクションをswfファイルから削除するのが相当めんどくさいのもある。

ただ、Flash9で読み込むと何も起こらないけど
Flash8以前で読み込むと動くAS、みたいなのが作れそうなのはちょっと面白い気がする。
2007/05/30(水) 21:31:48ID:YmQVd23D
>改造で読み込んだswfについてまであどべさんはサポートしたくないでしょう。

ちがーう、
簡単な改造で過去バージョンのswfが読み込めるのであれば
改造せずともサポートしてくれてもよいだろう、と言ったの。

>たとえ問題がなかったとしても、全部の場合についてテストするのは私もしたくないです。

問題がないのであればテストする必要がないだろうが。
あなたの言っていることは前後関係が全部逆。
人の話を単に否定したいだけかい。
2007/05/30(水) 21:45:00ID:YgXOam6i
ふるいversionのswfをサポートするって事は、当然AS2以前のサポートも期待されるわけで、
それが動かないものをサポートしといって叩かれるより、サポートしませんって言ったほうが
良いと判断したとかじゃね。
2007/05/30(水) 21:46:06ID:YgXOam6i
俺、日本語でおk
ようするに面倒くさかったんだろってことだ
2007/05/31(木) 01:41:52ID:1H14ChTK
これは個人的に研究してた。

スゴイ限定された使い方だけど、
swfアニメやスキンを投稿するサイトでは
意味があるかもしれないと思うよ。

まだFlash9が普及してないので、flash8しかない人用の当面の救済措置とか。

あとfla8 to 9 で変換すれば、
スクリプトの使用を強制的に無効化できるわけだし。

FlashPlayerは基本思想として、
解析不能なバイトコードは無視する・・・
って仕様なので、ロード失敗しても最悪空swfとして扱われるだけだと思う。
保障はしたくないけど。
2007/05/31(木) 01:49:43ID:1E97spjB
>>363
Flash9が普及していないならわざわざ変換する意味は無いと思うぜ。
swf投稿サイトでは普通AS3コンテンツからFlash8でコンパイルしたSWFをロードしないぜ?
2007/05/31(木) 02:10:53ID:1H14ChTK
>>364

AS3じゃないと実現できない何かをする投稿サイトがあって、
けどFlash CS3持ってないと投稿できないんじゃアレなので、
Flash8で作ったモノも投稿できるようにしたいケースって意味だよ。
2007/06/04(月) 23:17:29ID:AKrTCQmf
pixlibの日本語解説を読みたいんですが甘いでしょうか。
367Now_loading...774KB
垢版 |
2007/07/20(金) 01:32:55ID:yp5z/ewa
プリローダーがうまく作れません。

★1フレーム目★
onClipEvent (load) {
%9_root.stop();%9//タイムラインの1フレーム目で止めておく
}

onClipEvent (enterFrame) {
%9// すべて読み込んだら3フレーム目へ
%9if (_root._framesloaded==_root._totalframes) {
%9%9_root.gotoAndStop(3);
%9}
}
★2フレーム目★
_root.gotoAndPlay(1);
★3フレーム目★
サムネイルアルバムみたいなやつ。3M程。

どうやってもいきなり『_root._framesloaded==3』となり、3フレーム目にすっとんでしまいます。
誰か助けてください。
環境は、MX、XPSP2です。
368367
垢版 |
2007/07/20(金) 02:05:39ID:yp5z/ewa
スレ違いでした。済みません。
369Now_loading...774KB
垢版 |
2007/07/26(木) 16:37:52ID:zltikblJ
http://www.r-kei.com/labo/
370Now_loading...774KB
垢版 |
2007/08/16(木) 16:14:17ID:L52GkxEf
age
2007/09/03(月) 22:50:58ID:sG4PYBym
AS3のパフォーマンスチューニングのサイトありませんか?
フラットシェーディングの2万ポリゴンを100x100のサイズにDDAベースで
描画するのに2秒ぐらいかかってまして。
2007/09/04(火) 05:10:38ID:Qjx2ixJf
それは何をしようがどうにもならんと思うのだが……。
むしろなぜ2万ポリゴンも表示したいのか。
2007/09/04(火) 08:12:25ID:sSSeypNF
>>372
3になって高速化したと聞いたのでどのくらいなのか調べてました。
数値計算をぶんまわす用途だと、Javaとの比較で一桁、Cで二桁程度は実行速度が
違うという感覚でいいんでしょうか。

Mozillaに寄贈されたASのVMがあるようなので、そっちも調べてみようと思います。
374373
垢版 |
2007/09/14(金) 20:15:32ID:z0XjBaTk
なんとなく分かった。
バイトコードをJITコンパイラでネイティブコードに落としてはいるけどそれだけのようです。
調べた限りでは実行時情報を使った最適化のようなことはしてないし、フロー解析のようなことも
恐らくしてない。

現状で限界までパフォーマンスが要求される用途に使われていないっていうのと
スクリプト言語だっていうのであまりその辺りに重きを置いていないのかも。
2007/09/14(金) 20:21:30ID:8iqGs0FY
>>374

AS3の高速化ってのは、
そこよりも再生するバーチャルマシンが変わったことによる点が大きいと思うよ。

厳密な型指定がついたから、
変数のやり取り毎に内部で型の判定しなくてすむとかそういう部分。
2007/09/14(金) 20:39:53ID:z0XjBaTk
>>375
分かりにくかったならすみません。>>374はVMのソース調べた結果わかったことです。

確かに型情報使ってある種の高速化はされてます。
たとえば+演算子の処理内容は数値か文字列か他のオブジェクトかで実行する前に異なる処理に
コンパイルされるし、単純な配列としてのアクセスとハッシュテーブルとしてのアクセスも
区別されてる。

それでも、AVM1で純粋にインタプリタとして実行するのと比べ格段に早くなってるにしても、AVM2も
がちがちに最適化をしてるわけではありません。
サーバーサイドで長時間実行されるなら好きなだけJITに時間かけて実行時性能を最大にするような
最適化をかけてもいいけど、FLASH読み込んだ後数十秒コンパイルするようなことは用途的に
許容できないからそんなバランスになってるんだろうと思います。
2007/09/15(土) 14:35:02ID:0+rt5rir
君が100倍はやいVMを開発してアドビに売れば、みんなウハウハですよ。
2007/09/15(土) 18:53:36ID:4kZu1cKL
そのためのオープンソースです。


ネタでなく、実際そんなとこなんだろうし。
2007/09/15(土) 19:10:23ID:0Wjgo2PV
実際ちょっと調べてみてます。100倍は無理だと思いますけど。
2007/09/15(土) 23:17:00ID:MG3DeQda
スクリプト処理が多少高速化しても結局描画が足引っ張るから体感ではたいして変わらんべ。
2007/09/16(日) 01:33:28ID:U5mjIxKH
君が描画スピードが100倍はや(ry
2007/09/25(火) 13:10:06ID:tZRO7eiE
FAMEで構築してる人いる?
2007/09/26(水) 00:50:00ID:MiPjmbL8
でもなんか画像の拡縮率をランダムに変えて高速に表示するベンチマークぽいのを見たけど
AS2とAS3では見た目でスピードの違いがわかったよ。
2007/09/26(水) 15:49:37ID:QommhW5X
AS3は10倍の速度アップと言われててあれだからな。描画は変わらんから
スクリプトアニメーションをAS3にしたら意図しない抑揚がついて笑った。
385Now_loading...774KB
垢版 |
2007/09/29(土) 12:20:21ID:v8zp+XND
http://www.creatistblog.com/pv3d/dynamics/
↑みたいにmxmlでUI作って、その上にpapervision3dのっけたいんだけどサンプルとかどっかに落ちてないかな
2007/09/29(土) 21:46:11ID:s97Y48Yz
pv3dにFlexサンプルが入ってるがそれじゃ駄目なん?
387Now_loading...774KB
垢版 |
2007/09/29(土) 23:11:14ID:v8zp+XND
サンプルにあるのはflaなんですよ。やっぱsdkだけじゃだめっすか
2007/09/30(日) 04:37:33ID:HaNsjBy/
普通にmxmlのサンプルが入ってるが
389Now_loading...774KB
垢版 |
2007/09/30(日) 12:27:52ID:mDxt2mQ7
え、まじですか。どこにありました?
2007/09/30(日) 12:32:11ID:xkzeIep9
俺のケツん中だよ
2007/09/30(日) 12:57:44ID:wF6IDFif
そうだ!お前、俺の
2007/10/10(水) 18:07:50ID:lkIfy0+l
AstroとThermo……
社用案件がFlex1.5時代の保守中心なのに時代はどんどん進むなー
なんだよquakeIIIが動くとか
2007/10/11(木) 17:11:18ID:TvISlJWE
やっぱASプログラマーって少ないんだよな・・・。
メモリ開放関連でずっとぐぐってたけど解決しなくて俺涙目

1280, 960の■のBitmapDataを生成して、Bitmap型に入れてSpriteに加えるプログラム(Heavy.as)を、
オブジェクトとして読み込んで配列に加えては消していくのを繰り返すプログラムを作ってみたんだけど、
メモリが延々と増え続けていって俺涙目。
Heavy.asに一定時間ごとに音を鳴らすプログラム入れて試してみたら、ずっと一定時間ごとになり続けているあたりで、
参照を消しても対象のオブジェクトは消されないことがわかるし・・・。
解決策はHeavy.as内に、Heavy.as内にある全てのBitmapData型にdisposeして、
イベントも全てremoveEventListenerするようなプログラムかかないといけないのかな。

直に丸々削除するような関数でもあれば楽だったんだけどなぁ
2007/10/11(木) 19:40:02ID:hnfCfgZq
よくわからん。もし問題なければそのHeavy.asみせて。
2007/10/11(木) 20:02:34ID:LoIZVITO
ひでぇ設計と日本語
2007/10/11(木) 20:14:56ID:TvISlJWE
>>394
http://www.uploda.org/uporg1060798.zip.html
中に入っているTest.swfを実行すると、
延々とメモリ使用量が増えていく・・・はずなんだが、
Windowsでやってみたらちゃんとガベージコレクションされてるのか一定以上増えなくて俺更に涙目。
これ解決しないとゲーム完成に辿り着けないのにor2=3
2007/10/11(木) 21:17:08ID:MRuNtHOA
Delete関数は何のために書いたの?
2007/10/11(木) 21:17:21ID:OhoJXt7D
個人的には396は新手のブラクラだと思った

>>393
・ガベージコレクションはいつ呼び出されるか分からない
・普通に追加したイベントリスナーは参照してるのと同じ
・というかメモリの確保や解放はそもそもコストの高い操作
・サイズの大きいBitmapDataはメモリを大量に使うよ、一回計算してみれば?
個人的には同じBitmapDataを使い回して
中身を毎回BitmapData.fillRect()か何かで塗りつぶすコードに書き換えてみる事を勧める

ガベージコレクションを真面目に働かせるのが目的ならともかく
普通に動かすならオブジェクトの作りすぎは禁物

※以下独り言
ゲーム系の制作とWebアプリ系の制作は求められる技術がまるで違うにもかかわらず
AS系職人とかいう名前付けられて一緒くたにされて俺涙目
2007/10/11(木) 21:34:33ID:TvISlJWE
>>397
Test.as側からのHeavy.asに対する参照を外す際、
それを使ってHeavy.as内のBitmapDataを空っぽにすると
ちゃんと軽くなるってのを確かめる時につけたのがそのまんま残ってただけです。

>>398
ブロック崩しを作ってて、都合上ブロックの生成・削除を繰り返さないといけないことになってるんだけど、
それでちゃんと消してるはずなのにメモリが一向に減らないからどうなんだろうと思って、
ちょっと極端なプログラムを書いて試してみたんだ。

BreakBlock ┬ Block ― Sprite ― Bitmap ― BitmapData
        ├ Block …
        :
        └ Block …
って感じのつくりで、BreakBlockからのBlockへの参照を外せば、
Blockはその下のBitmapDataやらと一緒に消えてくれるかなと思ってたんだけど、
一向に消える気配がなくてどーすりゃええんよーと思ってたところ。

参照から外しても、その内部でイベントが働いたりしてると消えないのかなぁ
2007/10/11(木) 23:00:35ID:OhoJXt7D
>>399
Flash Player 9のガベージコレクションは参照を消せば直ちにメモリが解放されるわけじゃないよ
ガベージコレクションが動くまではずっとメモリに残りっぱなし。

そしてそのガベージコレクションの動くタイミングだけど、かなり遅いと思っていい。
厳密なタイミングが知りたいなら、
どこかで書いたような気がするけどSystem.totalMemoryが便利
まあ、AS3で本格的なゲームを作ろうと思ってる人なら一度目で見て実感するのがいいよ


俺が使った回避策としては
ブロックを削除するかわりにインスタンスをどこかに保存しておいて
生成する代わりに保存したインスタンスを再利用すれば面白いほど速くなると思うよ
この場合は変数の再初期化のし忘れに要注意だけどな

全部BitmapData.copyPixel()で描画するように書き直すのも最終手段としてはアリだな
2007/10/11(木) 23:19:41ID:hnfCfgZq
Test.asの
heavyArray[0] = null;
って、もしかして
heavyArray[heavyArray.length - 1] = null;
のつもり?
2007/10/12(金) 00:17:52ID:u518jYM4
頭を潰しているんだろ
pop
2007/10/12(金) 00:32:39ID:FMV0xOnK
>>400
丁寧にありがとうございます。
今のところ、システム的に全てを残すというものが難しいので、
もう少しいろいろと工夫してみようと思います。

>>401
空のArray型にpush(一番下に追加)した後、すぐpop(一番下を削除)を繰り返すだけなので、
項目数は絶対に1つしかないです。
だから、この場合だと[0]でも[heavyArray.length - 1]でも同じ結果になります。
2007/10/14(日) 22:00:34ID:sRm1NK7O
てか、ブロック崩しの場合、画像はブロックの下のレイヤーだよね?
個々のブロックは真四角描いてBevelFilterでもかませときゃ
それっぽいのが出来そうだし。

どうしてもBitmapデータをブロック上に描きたいんだい!って場合は、
大きなひとつのBitmapDataから、一部を切り出してgraphicsの
bitmapFill+drawRectで描くShapeの派生クラスを作ったらどうかな。
少なくともBitmapのメモリの心配はなくなると思うよ。

自分Flex使いなので、派生クラスとか普段作らないヒトだったらゴメン
2007/10/15(月) 22:44:26ID:FkcAGeVT
>>404
どうやら、メモリが一向に減らなかった原因は
・BitmapDataにはガーベジコレクションが働かない(使わなくなったらdispose()で消さないといけない)。
・派生クラスをオブジェクトとして用いた時、その内部でTimerイベントなど、何らかのイベントが働いていると参照を外してもガーベジされない
だったみたいです。
一つの解決策を教えていただいて申し訳ありませんが、
とりあえずこれでメモリは問題なさそうなので、しばらくこれで様子を見てみようと思います。
2007/10/15(月) 23:19:26ID:gZWlglvB
>405
うん。イベントリスナは忘れずに外さないと。
慣れるまでは、イベントハンドラの最初にtraceを入れておいたほうがいい。
弱参照も、指定できるところはしておいたほうが無難。

BitmapDataオブジェクト自体、数を作らないように工夫したほうがいいよ。
Bitmapコンポーネント自体、BitmapDataを使い回しするように実装されてるわけだし、
dispose()をしてもすぐ消えるわけではないので。


2007/10/15(月) 23:46:21ID:FkcAGeVT
>>406
アレ、1つのBitmapに対応するようにBitmapDataが存在するように思ってたけど、
もしかして
bitmapData:BitmapData = new BitmapData(48, 24, true, 0x00000000);
bitmap1:Bitmap = new Bitmap(bitmapData);
bitmap2:Bitmap = new Bitmap(bitmapData);
ってできたりする・・・?
だとしたら漏れの思考ティウンティウン\(^o^)/
2007/10/16(火) 17:55:03ID:qFYFJp0p
>>407

できるよ。
その場合bitmapDataを更新すれば、全てのBitmapの表示が更新される。
2007/10/16(火) 21:58:22ID:vC2WbUkQ
>>408
ありがとう。
さっそく仕様変更してみたら、かなり軽くなった。

一つ気になる点は、
bitmapData1:BitmapData = new BitmapData(48, 24, true, 0xFFFF0000);
bitmapData2:BitmapData = new BitmapData(48, 24, true, 0xFFFF0000);
bitmap:Bitmap = new Bitmap(bitmapData1);
addChild(bitmap);
ってした後、イベントでbitmapの参照先をbitmapData2に変更したくなった場合、
一旦removeChild(bitmap);で外した後、
bitmap = new Bitmap(bitmapData2);
って上書きして、再度addChild(bitmap);で加えなおさないといけないのかな。

直接参照先を変更できるようなものがあるといいんだけど、
探しても見つからなかったし、特にこれで問題でないからこのままで動かしてるんだけど・・・。
大丈夫なのかしら
2007/10/16(火) 23:25:14ID:hnbB0n94
>>409
もしBitmap.bitmapDataプロパティをまだ知らないなら
LiveDocs辺りで調べておくといいと思う
2007/10/17(水) 12:30:10ID:U2Klb6Zs
>>410
あー、bitmapDataプロパティを変更してやれば、
入れ直さなくても参照先が変更されるのですね。
存在は知っていて、それに対してdrawRectやらの描画をすると、
参照先のBitmapDataに変更が効くのはわかってましたけど、
このプロパティを変えることで参照先を変更できるというのには気がつきませんでした。
2007/10/21(日) 20:22:33ID:MZ6bCI92
AS3始めたばっかりの初心者です
次のようなコードを書いてみたんですが
実行しても何も表示してくれません
イマイチ原因がわからないので誰かご教授してください
お願いします

package {
import flash.display.*;
import flash.geom.*;

public class Etude extends Sprite {
public function Etude() {
addChild(new BgShape());
}
}
}
import flash.geom.*;
import flash.display.*;


class BgShape extends Shape {
public function BgShape(){
//タイル
var tile:BitmapData = new BitmapData(20,20,true,0xffffffff);
tile.fillRect( new Rectangle(0,0,10,10),0xffcccccc);
tile.fillRect( new Rectangle(10,10,10,10),0xffcccccc);

// 描画してるはずなのに?
graphics.beginBitmapFill(tile);
graphics.endFill();
}
}
2007/10/21(日) 20:30:13ID:CUQqP5yL
ちょっと今試せる環境にいないから外してるかもわからんけど

graphics.beginBitmapFill(tile);
//ここで四角形か何か図形を書く
graphics.endFill();

いちおう、ここじゃなく質問スレのほうがいいような希ガス
2007/10/21(日) 21:02:45ID:MZ6bCI92
>>413
うーん、図形は描画されても背景は白いままですね…
どうもスレ違いっぽいんで質問スレに行きます
ありがとうございました
2007/10/31(水) 22:32:24ID:/AgDGvI8
動画(flvとか)を再生するのはできるのですが,
これを1フレームごとに静止画として抽出して処理したいのですが
そもそも可能でしょうか?
2007/11/01(木) 00:10:12ID:nSqaJiY0
できる。

・・・が、詳しいやり方は忘れてしまった。
動画にフィルターかけて表示したりする手法に必須な処理のはずだから、
その関連で調べれば出る・・・のかな。

var bmpData:BitmapData = new BitmapData(400, 300);
bmpData.draw(video);
って感じでかけなかったっけ?
417415
垢版 |
2007/11/01(木) 22:07:31ID:q229Ncrz
なるほど。
BitmapData.drawメソッドを使えばできそうな感じですね。
今度実際にサンプル作って確認してみます。
■ このスレッドは過去ログ倉庫に格納されています