Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung

Rendering von Bitmaps

Das Thema "Rendering von Bitmaps" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 27.06.2011, 13:36   #1 (permalink)
Erfahrener Benutzer

Modell: HTC Legend

Registriert seit: 05.04.2010
Beiträge: 205
Abgegebene Danke: 63
Erhielt 6 Danke für 6 Beiträge
Standard Rendering von Bitmaps

Hallo zusammen,

ich versuche derzeit ein kleines Spiel zu programmieren. Dafür habe ich bitmaps auf dem Screen, die ich hin und her drehe und über den Bildschirm laufen lasse. Da die Images der Bitmaps gerade Ränder haben, sehe ich nun, das die Ränder der Bitmapzeichnung beim Verschieben über das Hintergrundbild immer wie abgebrochen wirken. Also eine lange Linie nach dem Drehen in vielleicht 3 schräg laufende Linien unterteilt wird, mit kantigen Unterbrechungen entsprechend der Pixel. Kann man die Bitmaps in Android auch rendern, so dass weiche Ränder entstehen. Kennt jemand das passende Stichwort dazu oder besser noch ein Tutorial?

Vielen Dank
Duckemai

Geändert von Duckemai (27.06.2011 um 13:41 Uhr)
Duckemai ist offline   Mit Zitat antworten
Alt 27.06.2011, 20:24   #2 (permalink)
Android Experte
 
Benutzerbild von v Ralle v

Modell: Samsung Galaxy S2 mit CM9 | Asus Transformer Prime

Registriert seit: 27.08.2010
Beiträge: 782
Abgegebene Danke: 124
Erhielt 162 Danke für 128 Beiträge
Standard AW: Rendering von bitmaps

Das Fachwort dazu ist Antialiasing. Google mal danach, vielleicht hilft. Ich selber habe keine Erfahrung dazu mit einer Bitmap.
__________________
Auch ich freue mich, wenn man bei mir den DANKE Button drückt
PowerPoint OpenOffice Remote - Kostenlose App um PowerPoint, OpenOffice und LibreOffice fernzusteuern.
Shutdown Remote - Kostenlose App um seinen PC aus der Ferne herunterzufahren.
v Ralle v ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei v Ralle v für diesen Beitrag:
Duckemai (28.06.2011)
Alt 28.06.2011, 13:46   #3 (permalink)
Erfahrener Benutzer

Modell: HTC Legend

Registriert seit: 05.04.2010
Beiträge: 205
Abgegebene Danke: 63
Erhielt 6 Danke für 6 Beiträge
Standard AW: Rendering von bitmaps / invalidate()

Ja perfekt! Genau das war das Stichwort. Das Rendering klappt nun super,
leider ruckeln die Bitmaps nun. Habe jetzt schon viel über invalidate() gelesen, aber wirklich funktionieren tut es nicht.

Da heißt es, wer einen Thread benutzt muss invalidate() nicht aufrufen. Ich
benutze einen, Bitmaps ruckeln aber. Auch habe ich sowohl den Aufruf in einer onDraw() und einer doDraw() versucht. (Ich benutze eine SurfaceView). Invalidate() bringt das System zum Absturz, bei postInvalidate() ruckeln die Bitmaps munter weiter.

Kann mir jemand sagen, wo das invalidate/postinvalidate denn nun hingehört, damit es funktioniert? Am besten bei Benutzung der doDraw().

Vielen Dank,
Duckemai
Duckemai ist offline   Mit Zitat antworten
Alt 28.06.2011, 17:32   #4 (permalink)
Android Experte
 
Benutzerbild von DieGoldeneMitte

Registriert seit: 05.02.2010
Beiträge: 609
Abgegebene Danke: 75
Erhielt 136 Danke für 119 Beiträge
Standard AW: Rendering von bitmaps

Ohne detaillierte Codekenntnis ist das kaum zu beantworten.

Aber allgemein fährt man mit Off-Screen-Rendering ruckelfreier.
D.h. du malst in eine Bitmap hinein (die erstmal nicht auf dem Bildschirm
landet) und diese Bitmap kannst Du dann in deinem SurfaceView (zB in einem
extra Thread) mit einer Framerate deiner Wahl en bloc schreiben.
__________________
Kein Support via PN/eMail. Bitte das Forum benutzen - dort haben alle etwas davon.
Bei Entwicklerfragen zu abstürzenden Apps bitte immer die Ausgabe von LogCat posten.
Tipp: Zum "Danke" sagen gibt es einen Button.
DieGoldeneMitte ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei DieGoldeneMitte für diesen Beitrag:
Duckemai (30.06.2011)
Alt 28.06.2011, 18:15   #5 (permalink)
Erfahrener Benutzer

Modell: HTC Legend

Registriert seit: 05.04.2010
Beiträge: 205
Abgegebene Danke: 63
Erhielt 6 Danke für 6 Beiträge
Standard AW: Rendering von bitmaps

Das ist ein sehr interessantes Stichwort. Habe gleich mal Google angeworfen um vielleicht so etwas wie ein Tutorial zu finden. Leider scheint Off-Screen-Rendering vorwiegend für OpenGL sehr populär zu sein. Ich arbeite aber mit Java2D. Kennst Du vielleicht ein Tutorial dazu?

Vielen Dank
Duckemai
Duckemai ist offline   Mit Zitat antworten
Alt 29.06.2011, 13:58   #6 (permalink)
Android Experte
 
Benutzerbild von DieGoldeneMitte

Registriert seit: 05.02.2010
Beiträge: 609
Abgegebene Danke: 75
Erhielt 136 Danke für 119 Beiträge
Standard AW: Rendering von Bitmaps

Das eigentlich zu simpel für ein Tutorial.

Also im Prizip geht das so (aus der Hüfte geschossen):

1.) ein eigener Canvas:
Code:
package my.package;

class OffScreenView extends View {
   public OffScreenView(Context context, AttributeSet attrs) {
     super(context, attrs);
   }

   Bitmap buffer = null;
   Canvas offScreen = null;

   public void onDraw( Canvas c ) {
     if( buffer==null ) {
      buffer = Bitmap.createBitmap( c.getWidth(), c.getHeight(), Bitmap.Config.ARGB_8888 );
      offScreen = new Canvas(buffer);
     }
     c.drawBitmap(buffer,0,0,null);
   }

}
Nun malst du mit offScreen anstatt mit c. Und machst kein postInvalidate oder so!

2.) Im Lauyout definieren:
Code:
<my.package.OffScreenView
    android:layout_width="..."
    ...
   android:id="@+id/offscreen"
/>
3.) Update thread bauen:

Code:
class Updater implements Runnable {
  OffScreenView theView;
  boolean running;
  public Updater( OffScreenView theView ) { this.theView = theView; ... }
  public void run() {
     while( running ) {
        theView.postInvalidate();
        try { Thread.sleep( 1000 / FRAMERATE ); } catch( InterruptedException wont_care ) {}
     }
  }
}
4.) In der Activity den Updater einbinden:

Code:
....MyActivity...

   private Updater upd;

   public void onCreate( Bundle bundle ) {
     super.onCreate(nundle);
     upd = new Updater( (OffScreenView)findViewById(R.id.offscreen)) );
     ...
  }

   public void onResume() {
      super.onResume();
      new Thread(upd).start();
   }
      
   public void onPause() {
      super.onPause();
      upd.running = false;
   }
__________________
Kein Support via PN/eMail. Bitte das Forum benutzen - dort haben alle etwas davon.
Bei Entwicklerfragen zu abstürzenden Apps bitte immer die Ausgabe von LogCat posten.
Tipp: Zum "Danke" sagen gibt es einen Button.

Geändert von DieGoldeneMitte (29.06.2011 um 14:14 Uhr)
DieGoldeneMitte ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei DieGoldeneMitte für diesen Beitrag:
Duckemai (30.06.2011)
Alt 29.06.2011, 18:59   #7 (permalink)
Erfahrener Benutzer

Modell: HTC Legend

Registriert seit: 05.04.2010
Beiträge: 205
Abgegebene Danke: 63
Erhielt 6 Danke für 6 Beiträge
Standard AW: Rendering von Bitmaps

Wow!!! Vielen Dank für die Mühe. Ich versuche es gleich mal und gebe Feedback.
Duckemai ist offline   Mit Zitat antworten
Alt 30.06.2011, 00:28   #8 (permalink)
Erfahrener Benutzer

Modell: HTC Legend

Registriert seit: 05.04.2010
Beiträge: 205
Abgegebene Danke: 63
Erhielt 6 Danke für 6 Beiträge
Standard AW: Rendering von Bitmaps

Tja, was soll ich sagen. Ich habe erstmal deine Ausarbeitungen 1 zu 1 übernommen. Ich war ganz überrascht, dass das Spiel mit Deinem Vorschlag ohne zu murren startete. (Respekt! Wer so aus der Hüfte schießen kann, der braucht auch nicht mehr zu zielen! )

Ich habe es durchdebugged.
Die Anwendung läuft durch den start() im Activity,
dann durch Bitmap.createBitmap in der OffScreenView und durch die drawBitmap der OffScreenView. Aber alles nur einmal und dann nie wieder.

Also habe ich boolean running im Updater auf true initialisiert. Jetzt sieht
es schon anders aus:
Die Anwendung läuft durch den start() im Activity,
jetzt endlich auch durch theView.postInvalidate() im Updater
dann durch Bitmap.createBitmapin der OffScreenView
und ab hier läuft er im Wechsel zwischen postInvalidate() und drawBitmap.

Sah aus, als würde es klappen. Doch die Bitmaps ruckelten mehr als vorher.


Der Durchlaufen von Hauptthread(HT), postInvalidate(pI) und Buffer_onDraw(B_oD) sieht in etwa so aus:
1 x HT
1-3 x pI
1 x B_oD
...und wieder von vorne.

Ich habe dann mit dem Thread.sleep herumgespielt. Mal hoch gesetzt, mal
runter. Mal ausgeschaltet. Irgendwie scheint mein Hauptthread, dadurch dass ich ihn auf FPS begrenze, das Ruckeln mitzuverursachen. Denn dort gibt es ebenfalls einen Thread.sleep. Womit ich wieder bei dem leidigen Thema einer GameLoop bin. Da habe ich noch nichts gefunden, das ein schnelles System ruckelfrei ausbremsen kann.

Gruß
Duckemai

Geändert von Duckemai (30.06.2011 um 09:21 Uhr)
Duckemai ist offline   Mit Zitat antworten
Alt 30.06.2011, 15:10   #9 (permalink)
Android Experte
 
Benutzerbild von DieGoldeneMitte

Registriert seit: 05.02.2010
Beiträge: 609
Abgegebene Danke: 75
Erhielt 136 Danke für 119 Beiträge
Standard AW: Rendering von Bitmaps

Zitat:
Zitat von Duckemai Beitrag anzeigen
Der Durchlaufen von Hauptthread(HT), postInvalidate(pI) und Buffer_onDraw(B_oD) sieht in etwa so aus:
1 x HT
1-3 x pI
1 x B_oD
...und wieder von vorne. ?!
Was soll das sein?
Ein Stacktrace oder die Threadliste im Debugger?
Was ist "Hauptthread"?
Kann es sein, dass du mehrere Updater am laufen hast?

Ich weiss auch nicht, wo du in den offscreen reinmalst. Das sollte
nicht aus dem Code aus meinem Beispiel sein, sondern
in einem Extrathread (das wäre dann im Prinzip die Gameloop. Achtung:
auch davon darf nur eine Laufen). Übrigens ein Thread.yield() in der Gameloop kann sinnvoll sein.

Man kann Updater und Gameloop auch zusammenlegen. Das macht man typischerweise so:

Code:
public void run() {
  while( running ) {
     long start = System.currentTimeMillis();
     .. neues bild aufbauen .. 
     long time = System.currentTimeMillis() - start;
     .. 1000 / FRAMERATE - time warten ..
    theView.postInvalidate();
  }
Vielleicht ruckelt es aber auch nur deshalb, weil Du schlicht zu viel darstellen willst.

ADD: Guck dir mal die Klasse SurfaceView an, die ist für asyncrones Malen von Google vorgesehen -
habe selbst aber auch noch nicht verstanden wie genau, und ob das OffScreen rendering überflüssig macht.
__________________
Kein Support via PN/eMail. Bitte das Forum benutzen - dort haben alle etwas davon.
Bei Entwicklerfragen zu abstürzenden Apps bitte immer die Ausgabe von LogCat posten.
Tipp: Zum "Danke" sagen gibt es einen Button.

Geändert von DieGoldeneMitte (30.06.2011 um 15:19 Uhr) Grund: add
DieGoldeneMitte ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei DieGoldeneMitte für diesen Beitrag:
Duckemai (01.07.2011)
Alt 30.06.2011, 16:02   #10 (permalink)
Erfahrener Benutzer

Modell: HTC Magic, Flytouch 2, Motorola Flipout, SE Xperia X10i, HTC Desire Z, SE Xperia Play, SE Mini Pro

Registriert seit: 12.01.2010
Beiträge: 255
Abgegebene Danke: 16
Erhielt 41 Danke für 39 Beiträge
Standard AW: Rendering von Bitmaps

Zitat:
Zitat von DieGoldeneMitte Beitrag anzeigen
ADD: Guck dir mal die Klasse SurfaceView an, die ist für asyncrones Malen von Google vorgesehen -
habe selbst aber auch noch nicht verstanden wie genau, und ob das OffScreen rendering überflüssig macht.
Es wird einfach intern zwischen zwei Surfaces gewechselt (Surfaceflinger?). Einer wird gerade offscreen 'bemalt' und einer wird angezeigt. Double Buffering heisst das sonst überall. Dadurch spart man das eine Anzeigen der Offscreen-Bitmap und es dürfte ähnlich schnell sein wie vorher.
__________________
Meine Apps ...
miha ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei miha für diesen Beitrag:
Duckemai (01.07.2011)
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Android Bitmaps zerschneiden Kosta.Kos Android App Entwicklung 3 27.06.2011 21:48
Website-Rendering-Geschwindigkeit s-i.m.o-n Android Allgemein 0 24.06.2011 22:27
Kollisionsberechnung Bitmaps Duckemai Android App Entwicklung 0 14.05.2011 11:37
Bitmaps skalieren und zusammenfügen (Problem) cypressious Android App Entwicklung 1 06.02.2011 22:52
<Bolt> (beta) Der neue Java Browser rendering wie Opera mini Chatt Kommunikation 0 08.10.2009 12:23




Du liest gerade: "Rendering von Bitmaps" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.