|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Banned
[+1 30.08.14]
[+1 26.02.14] Регистрация: Apr 2012
Сообщений: 162
|
Класс грузит память, есть другие решения?
Просто жутко грузит флешку! Есть идеи как уменьшить объём занимаемой памяти?
P.S. earth1.jpeg - цилиндрическая карта. 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(); } } } Последний раз редактировалось Koopa; 12.05.2013 в 20:17. |
|
|||||
Banned
[+1 30.08.14]
[+1 26.02.14] Регистрация: Apr 2012
Сообщений: 162
|
при любом размере текстуры, грузит почти до максимума.(память стабильна-не растет)При добавлении нескольких экземпляров все становится жутко.
|
|
|||||
Lorem ipsum
|
Такое несущественное влияние развернутой битмапдаты на занимаемую приложением память навевает подозрение, что проблема перерасхода (если он и есть) не здесь.
Это потому, что каждый экземпляр неизвестно зачем хранит свою копию битмапдаты загруженной текстуры земли (image). Следовало бы снять с класса _3D (мои глаза!) ответственность за загрузку текстуры — зачем это вообще сделано? Загрузить "землю" отдельно, взять BitmapData и просто давать ссылку на нее каждому новому экземпляру класса, например так: var planet:_3D = new _3D(earthBitmapData); (мои глаза!)
__________________
Поймай яблоко 2! |
|
|||||
Banned
[+1 30.08.14]
[+1 26.02.14] Регистрация: Apr 2012
Сообщений: 162
|
Цитата:
Цитата:
Цитата:
|
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
А какой размер у vertices? Вообще можно было бы самому посмотреть, что как. Текстуру 2х2 попробовать, фильтры снять, число вершин уменьшить радикально.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
>>Просто жутко грузит флешку! Есть идеи как уменьшить объём занимаемой памяти?
тут не совсем понятны надежды уменьшить нагрузку за счет оптимизации памяти имхо нормально приведенный код пользует память, а то что грузит, так от graphics.drawTriangles чудес давно никто не ждет как вариант: уходить на движки, использующие Stage3D ради интереса глянул в away3d примерно такой же расклад и с такой же картой, так он памяти берет в два с лишним раза больше, но тормозов нет даже и в намеке 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(); } } } |
|
|||||
Lorem ipsum
|
Ну т.е. подчеркивание в начале имени класса — это по-твоему единственный выход? Не надо так делать, не привыкай.
Это ты так ответил на вопрос, зачем у тебя внутри класса текстура грузится каждый раз заново?
__________________
Поймай яблоко 2! |
|
|||||
Banned
[+1 30.08.14]
[+1 26.02.14] Регистрация: Apr 2012
Сообщений: 162
|
Цитата:
Цитата:
|
|
|||||
>> Она грузится для каждого экземпляра
дык об этом и речь: если потребуется две одинаковые планеты, будем иметь две загрузки и два экземпляра bitmapData, вторые очевидно избыточны ну и просто из удобства: не должен класс, предназначенный для рендеринга\отображения заниматься загрузкой, впрочем дело хозяйское, канеш |
Часовой пояс GMT +4, время: 23:56. |
|
« Предыдущая тема | Следующая тема » |
|
|