★Flash 3D【 Papervision3D 2.0 】情報交換★ (154レス)
★Flash 3D【 Papervision3D 2.0 】情報交換★ http://mevius.5ch.net/test/read.cgi/swf/1227434456/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
44: Now_loading...774KB [sage] 2009/03/19(木) 21:31:58 ID:sOf7DsqH マテリアルをつけてない素のCubeを出したり消したりだとどーよ? http://mevius.5ch.net/test/read.cgi/swf/1227434456/44
47: 41 [sage] 2009/03/20(金) 00:18:12 ID:nPh+mKh4 >>44 返信がりがとうございます 自分の説明不足でしたが、Cube作成→トゥイーン→消去は、作った一つのCubeを出したり消したりのサイクルではなく、 新たにCubeを作り出してトゥイーン後破壊し、また新たに別のcubeを作りトゥイーンさせ破壊・・・というTimerを使った繰り返しの処理なんです var timer:Timer = new Timer( 600 ); timer.addEventListener( TimerEvent.TIMER, timerFunc ); timer.start(); function timerFunc():void{ createCube(); } function createCube():void { Cubeを作成して、>>41のTweenerイベント処理、終了後にtweenEndへ } function tweenEnd( cube:DisplayObject3D ):void { >>41のCubeを削除の処理 } マテリアル未使用Cubeは作り方がわかりませんでした・・・ そもそものCubeを綺麗に削除する方法のセオリーって無いのでしょうか http://mevius.5ch.net/test/read.cgi/swf/1227434456/47
50: 44 [sage] 2009/03/20(金) 20:37:00 ID:lXny2v1Y >>45 すまん、寝ぼけてた オレも前からプリミティブの解放はよくわかってなかったんで調べ中。 まずは単純なplaneで plane = new plane(); myScene.addChild(plane); って感じで10個登録してから、これを解放してみる。 mySceneに含まれているプリミティブの個数を調べようと myScene.numChildrenすると、DisplayObjectContainer3DのnumChildrenが呼ばれて 10って値が返ってくる。ここまではいいんだけど、myScene.childrenを使ってプリミティブの 名前を取り出そうとすると、nullが5個表示されてしまって、残りの5個が正しく名前が表示される。 でも、myScene.childrenList()を呼ぶとちゃーんと10個分の名前が表示される。 この2つの処理の違いは、DisplayObjectContainer3D.asをみると、 なんだけど、ちゃんと10個表示される方はこれ↓ name = name || child.name || String( child.id ); this._children[ child ] = name; でもって、最初の5個がnullになっちゃう方は this._childrenByName[ name ] = child; っていう方法で格納してるみたいだ。 _childrenと_childrenByNameは共にDictionaryクラス。_childrenByNameが妙な事になってるから これを返すmyScene.childrenを使ってremoveChildしようとしても5個はnullだから 解放されないわけだ、ダメじゃん。 続く、かもしれない。 http://mevius.5ch.net/test/read.cgi/swf/1227434456/50
57: 44 [sage] 2009/03/21(土) 10:06:09 ID:fKmdslcf >>41と>>47について、 > プレビュー中は使用量のグラフがずっと上がりっぱなしの状態でした、 っていうのは、ずっとグラフが上がり続けるって感じ? それとも上がったり下がったりを繰り返しつつも、徐々に最大値が上がっていく感じ? 手元の環境だと、Cube生成すらしてないSWFを作ってプレビューするだけでも メモリ使用量が上がったり下がったりを繰り返しつつも、徐々に最大値が上がってくんだよね。 一応、こっちで>>41と>>47をテストしてみたら、ずっと上がり続けるってことはなくて、 上がったり下がったりを繰り返しつつも、徐々に最大値が上がっていく感じでした。 http://mevius.5ch.net/test/read.cgi/swf/1227434456/57
59: 44 [sage] 2009/03/21(土) 12:02:14 ID:fKmdslcf あと、>>49の > var mat:MaterialObject3D; > for each(mat in materials){ > trace("test2"); > mat.unregisterObject(this); これは機能してないね。 materialsはDictionaryを持つクラスだけど、クラスに対してfor eachしても Dictionary内のデータが取り出せるわけじゃないので。 かといってmaterialsはDictionaryのメンバ変数を返すような仕組みがないので どうにもならない。なので自前で削除処理をするしかないかも。 ただ、Dictionaryで持ってる情報は使われなくなったらGCで勝手に削除されるらしいんで あまり気にしなくてもいいのかも。 >6回ループが起こると思うんですが・・・ 1つのマテリアルにallという名前をつけているのであって、6面分6個のマテリアルを 生成するわけではないですから、1回のループです。 1個のマテリアルに対して、front,back...と名前をつけて貼り付けた場合は6個になるんじゃないかな。 http://mevius.5ch.net/test/read.cgi/swf/1227434456/59
62: 44 [sage] 2009/03/22(日) 11:00:50 ID:PCij10Uc 最低限必要なだけのコードだけどCubeの生成と削除。削除はかなり手抜きだけど これで10分ほど放置しても30fps。メモリは増減しつつ微妙に増えてるけど。 package { import 略; public class Main extends MovieClip { public var viewport :Viewport3D; public var scene :Scene3D; public var camera :Camera3D; public var renderer :BasicRenderEngine; public function Main() { SWFProfiler.init(stage, this); init(); } public function init():void { init3D(); addEventListener( Event.ENTER_FRAME, loop ); var timer:Timer = new Timer( 600 ); timer.addEventListener( TimerEvent.TIMER, timerFunc ); timer.start(); } public function timerFunc(e:TimerEvent):void { var myCube:Cube = new Cube( new MaterialsList({all:new ColorMaterial(Math.random()*0x100)}), 20, 20, 20 ); myCube.x = Math.random()*200 - 100; myCube.y = Math.random()*200 - 100; myCube.z = Math.random()*200; scene.addChild(myCube); Tweener.addTween( myCube, { scale :2, time:2, onComplete:animEnd, onCompleteParams:[ myCube ] } ); } http://mevius.5ch.net/test/read.cgi/swf/1227434456/62
63: 44 [sage] 2009/03/22(日) 11:01:58 ID:PCij10Uc public function animEnd(cube:Cube):void { scene.removeChild(cube); cube = null; } public function init3D():void { viewport = new Viewport3D(0, 0, true, true); addChild( viewport ); renderer = new BasicRenderEngine(); scene = new Scene3D(); camera = new Camera3D(); camera = new Camera3D(); camera.zoom = 100; renderer.renderScene(scene, camera, viewport); } public function loop(event:Event):void { renderer.renderScene(scene, camera, viewport); } } } FPSはCPUパワーによるけど、この程度の処理なら30fps出ると思う。 http://mevius.5ch.net/test/read.cgi/swf/1227434456/63
65: 44 [sage] 2009/03/22(日) 16:26:11 ID:PCij10Uc や、厳密にはCubeとMaterialは削除をしっかりしないとダメだと思いますよ。 でも削除しなくてもメモリが増えっぱなしとかFPSが低下していくようなことには ならないという意味でのサンプルです。 厳密な削除方法は結局、よくわからないけどね。(てかAS3の削除処理は面倒すぐる) http://mevius.5ch.net/test/read.cgi/swf/1227434456/65
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.660s*