Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Класс грузит память, есть другие решения? (http://www.flasher.ru/forum/showthread.php?t=199074)

Koopa 12.05.2013 19:53

Класс грузит память, есть другие решения?
 
Просто жутко грузит флешку! Есть идеи как уменьшить объём занимаемой памяти?
P.S. earth1.jpeg - цилиндрическая карта.


Код AS3:

package GameObjects {
        import flash.display.Graphics;
        import flash.display.Shape;
        import flash.geom.Matrix;
        import flash.display.Loader;
        import flash.net.URLRequest;
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.events.Event;
        import flash.geom.Point;
        import flash.geom.Rectangle;
        import flash.events.MouseEvent;
        import flash.system.System;
        import flash.filters.DropShadowFilter;
        public class _3D extends Shape{
                public var radius:Number;
                public var sectorsPerQuarter:uint;
                public var vertices:Vector.<Number>=new Vector.<Number>();
                public var indices:Vector.<int>=new Vector.<int>();
                public var uvtData:Vector.<Number>=new Vector.<Number>();
                public var matrix:Matrix=new Matrix();
                public var image:BitmapData;
                public function _3D():void {
 
                }
                public function drawSphere3(radius:Number=10,sectorsPerQuarter:uint=10):_3D{
                        this.radius=radius;
                        this.sectorsPerQuarter=sectorsPerQuarter;
                        var loader:Loader=new Loader();
                        var request1:URLRequest=new URLRequest("earth1.jpeg");
                        loader.load(request1);
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadComplete);
                        return this;
                }
                private function loadComplete(e:Event):void{
                        graphics.beginBitmapFill(e.target.content.bitmapData);
                        image=e.target.content.bitmapData;
                        var simpleAngle:Number=((180/(2*sectorsPerQuarter))*(Math.PI/180));
                        var currentRadius:Number;
                        radius*=20;
                        var angle:Number;
                        var line:Number=0;
                        var point:Point=new Point();
                        var yCount:uint=0;
                        e.target.removeEventListener(Event.COMPLETE,loadComplete);
                        for(var i:Number=-(simpleAngle*sectorsPerQuarter);i<=(simpleAngle*sectorsPerQuarter);i+=simpleAngle){
                                line=Math.sin(i)*radius;
                                currentRadius=Math.cos(i)*radius;
                                var xCount:uint=0;
                                for (var j:Number=-(simpleAngle*sectorsPerQuarter);j<=(simpleAngle*sectorsPerQuarter);j+=simpleAngle){
                                        point.x=Math.sin(j)*currentRadius;
                                        point.y=line;
                                        vertices.push(point.x,point.y);
                                        uvtData.push(xCount/(4*sectorsPerQuarter),yCount/(2*radius)-.05,1);
                                        xCount++;
                                        yCount++;
                                }
                        }
                        for (i=0;i<(vertices.length-(sectorsPerQuarter*2+1));i++){
                                if(i%(sectorsPerQuarter*2+1)!=20 && (i+1)%(sectorsPerQuarter*2+1)!=0){
                                        indices.push(i,i+1,i+(sectorsPerQuarter*2+1), i+1,i+(sectorsPerQuarter*2+1),i+(sectorsPerQuarter*2+2));
                                }
                        }
                        graphics.drawTriangles(vertices,indices,uvtData);
                        this.shadowPlanet();
                        addEventListener(Event.ENTER_FRAME,rotate);
                }
                public function shadowPlanet(image:BitmapData=null):void{
                        var filter:DropShadowFilter=new DropShadowFilter();
                        var filter2:DropShadowFilter=new DropShadowFilter();
                        filter.distance=50;
                        filter2.distance=100;
                        filter.angle=0;
                        filter2.angle=180;
                        filter.alpha=.7;
                        filter2.alpha=.4;
                        filter.color=0x000000;
                        filter2.color=0xffffff;
                        filter.blurX=50;
                        filter2.blurX=100;
                        filter.inner=true;
                        filter2.inner=true;
                        this.filters=[filter,filter2];
                }
                private function rotate(e:Event):void{
                        graphics.clear();
                        graphics.beginBitmapFill(image/*,matrix*/);
 
                        for(var i:uint=0;i<uvtData.length;i+=3){
                                uvtData[i]+=.01;
                        }
                        graphics.drawTriangles(vertices,indices,uvtData);
                        graphics.endFill();
                }
        }
}

P.S.S. Вызов:
Код AS3:

var planet:_3D=new _3D();
                        planet.drawSphere3();
                        var k=addChild(planet);


expl 12.05.2013 21:47

А размеры текстуры какие?
Память монотонно растёт/пилообразно/не растёт, находится на максимуме?

Koopa 12.05.2013 21:52

при любом размере текстуры, грузит почти до максимума.(память стабильна-не растет)При добавлении нескольких экземпляров все становится жутко.

Zebestov 12.05.2013 22:53

Цитата:

Сообщение от Koopa (Сообщение 1132917)
При любом размере текстуры, грузит почти до максимума

Такое несущественное влияние развернутой битмапдаты на занимаемую приложением память навевает подозрение, что проблема перерасхода (если он и есть) не здесь.
Цитата:

Сообщение от Koopa (Сообщение 1132917)
При добавлении нескольких экземпляров все становится жутко

Это потому, что каждый экземпляр неизвестно зачем хранит свою копию битмапдаты загруженной текстуры земли (image).

Следовало бы снять с класса _3D (мои глаза!) ответственность за загрузку текстуры — зачем это вообще сделано? Загрузить "землю" отдельно, взять BitmapData и просто давать ссылку на нее каждому новому экземпляру класса, например так: var planet:_3D = new _3D(earthBitmapData); (мои глаза!)

Koopa 12.05.2013 23:17

Цитата:

Это потому, что каждый экземпляр неизвестно зачем хранит свою копию битмапдаты загруженной текстуры земли (image).
Цитата:

зачем это вообще сделано?
затем, чтоб в входной параметр класса передать image.

Цитата:

_3D (мои глаза!)
Что не нравится? 3D есть?

-De- 12.05.2013 23:21

А какой размер у vertices? Вообще можно было бы самому посмотреть, что как. Текстуру 2х2 попробовать, фильтры снять, число вершин уменьшить радикально.

silin 12.05.2013 23:30

>>Просто жутко грузит флешку! Есть идеи как уменьшить объём занимаемой памяти?

тут не совсем понятны надежды уменьшить нагрузку за счет оптимизации памяти
имхо нормально приведенный код пользует память, а то что грузит, так от graphics.drawTriangles чудес давно никто не ждет

как вариант: уходить на движки, использующие Stage3D
ради интереса глянул в away3d примерно такой же расклад и с такой же картой, так он памяти берет в два с лишним раза больше, но тормозов нет даже и в намеке
Код AS3:

package
{
        import away3d.cameras.*;
        import away3d.containers.*;
        import away3d.controllers.*;
        import away3d.entities.*;
        import away3d.materials.*;
        import away3d.primitives.*;
        import away3d.textures.*;
        import away3d.utils.*;
        import flash.display.*;
        import flash.events.*;
 
        [SWF(backgroundColor="#000000",frameRate="30")]
 
        public class TestGlobe extends Sprite
        {
 
                [Embed(source="map.jpg")]
                public static var map_jpg:Class;
 
                private var scene:Scene3D;
                private var camera:Camera3D;
                private var view:View3D;
                private var cameraController:HoverController;
 
                private var earthMaterial:TextureMaterial;
                private var earth:Mesh;
 
                private var сontainer:ObjectContainer3D;
 
                public function TestGlobe()
                {
 
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
 
                        scene = new Scene3D();
                        camera = new Camera3D();
                        view = new View3D();
                        view.scene = scene;
                        view.camera = camera;
                        cameraController = new HoverController(camera, null, 0, 0, 600, -90, 90);
                        cameraController.yFactor = 1;
                        addChild(view);
 
                        earthMaterial = new TextureMaterial(Cast.bitmapTexture(map_jpg));
 
                        earth = new Mesh(new SphereGeometry(200, 200, 100), earthMaterial);
                        сontainer = new ObjectContainer3D();
                        сontainer.rotationX = -23;
                        сontainer.addChild(earth);
                        scene.addChild(сontainer);
                        cameraController.lookAtObject = сontainer;
 
                        addEventListener(Event.ENTER_FRAME, render);
 
                }
 
                private function render(e:Event):void
                {
                        earth.rotationY += 0.2;
                        view.render();
                }
 
        }
}


Zebestov 13.05.2013 01:59

Цитата:

Сообщение от Koopa (Сообщение 1132934)
Что не нравится? 3D есть?

Ну т.е. подчеркивание в начале имени класса — это по-твоему единственный выход? Не надо так делать, не привыкай.
Цитата:

Сообщение от Koopa (Сообщение 1132934)
затем, чтоб в входной параметр класса передать image

Это ты так ответил на вопрос, зачем у тебя внутри класса текстура грузится каждый раз заново? :away:

Koopa 13.05.2013 14:01

Цитата:

Ну т.е. подчеркивание в начале имени класса — это по-твоему единственный выход? Не надо так делать, не привыкай.
ради интереса покопайся в классах АС.
Цитата:

Это ты так ответил на вопрос, зачем у тебя внутри класса текстура грузится каждый раз заново
Она грузится для каждого экземпляра.Нагляднее:
Код AS3:

public function drawSphere3(im:String="earth1.jpeg",radius:Number=10,sectorsPerQuarter:uint=10):_3D...
...
var request1:URLRequest=new URLRequest(im);


silin 13.05.2013 14:15

>> Она грузится для каждого экземпляра
дык об этом и речь: если потребуется две одинаковые планеты, будем иметь две загрузки и два экземпляра bitmapData, вторые очевидно избыточны
ну и просто из удобства: не должен класс, предназначенный для рендеринга\отображения заниматься загрузкой, впрочем дело хозяйское, канеш


Часовой пояс GMT +4, время: 10:46.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.