2010-02-25 13 views
1

J'ai un jeu avec une grande carte rasterComment augmenter les performances du défilement raster sur Mac?

Maintenant, nous utilisons jpeg (4900x4200)

Et durring le jeu dont nous avons besoin pour faire défiler cette carte.

Nous utilisons les éléments suivants:

Carte de classe étend mx.containers.Canvas

et mx.controls.Image sur elle

dans le constructeur, nous avons:

public function Map() { 
     super(); 
     image.source = ResourceManager.interactiveManager.map;//big image 
     addChild(image); 
...... 
} 

pour défilement nous sommes utiliser:

if(parentAsCanvas==null){ 
     parentAsCanvas = (parent as Canvas); 
    } 

    parentAsCanvas.verticalScrollPosition = newX; 
    parentAsCanvas.horizontalScrollPosition = newY; 

Dans les fenêtres, nous avons de très bonnes performances. Sous Linux et Mac en flashplayer, nous avons aussi de bonnes performances.

Mais dans les navigateurs, la performance est assez lente! Que pouvons-nous faire pour le résoudre?

Répondre

0

J'ai lu l'article suivant http://www.insideria.com/2008/04/flex-ria-performance-considera.html

J'ai trouvé la résolution de mon problème.

Si j'ouvre mon SWF dans le navigateur comme "http://host/myswf.swf" J'ai une énorme performance perdre dans le navigateur que la raison de travailler LaoyoutManager, qui recalcule les positions et les tailles de toutes les toiles dans l'application. Et ce processus consomme plus de 60% de la capacité de performance (oui, nous avons beaucoup de Canvas dans notre application).

Et quand j'ai mis mon application dans le bloc html de taille de contant dans la page html, tous les problèmes étaient disparus! J'ai 80% d'augmentation de performance!

3

C'est lent car vous affichez une grande image tout le temps.

Voici quelques petites choses qui traversent mon esprit:

  • Essayez d'utiliser la propriété scrollRect dans un objet Bimtap tenant votre image BitmapData pour afficher uniquement la zone visible puis utilisez le x scrollRect et y passer à un nouvelle région
  • Essayez d'utiliser un BitmapData la taille de la zone visible et utiliser copyPixels() pour obtenir la zone de droite pour afficher, en utilisant à nouveau un rectangle
  • Essayez d'utiliser BitmapData.scroll()

Voici quelques extraits:

scrollRect:

//assuming map is BitmapData containing your large image 
//100x100 is a test scroll area 
var scroll:Rectangle = new Rectangle(0,0,100,100); 
var bitmap:Bitmap = new Bitmap(map); 
bitmap.scrollRect = scroll; 
addChild(bitmap); 

this.addEventListener(Event.ENTER_FRAME, update); 
function update(event:Event):void{ 
    scroll.x = mouseX; 
    scroll.y = mouseY; 
    bitmap.scrollRect = scroll; 
} 

copyPixels:

var scroll:Rectangle = new Rectangle(0,0,100,100); 
var scrollPoint:Point = new Point(); 
var map:BitmapData = new Map(0,0); 
var bitmap:Bitmap = new Bitmap(new BitmapData(100,100,false)); 
bitmap.bitmapData.copyPixels(map,scroll,scrollPoint); 
addChild(bitmap); 

this.addEventListener(Event.ENTER_FRAME, update); 
function update(event:Event):void{ 
    scroll.x = mouseX; 
    scroll.y = mouseY; 
    bitmap.bitmapData.fillRect(scroll,0xFFFFFF); 
    bitmap.bitmapData.copyPixels(map,scroll,scrollPoint); 
} 

Pas parfait, mais il devrait vous donner une idée

HTH, George