| |||||||
Das Thema "Rendering von Bitmaps" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.
|
| | Themen-Optionen | Ansicht |
| | #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
| 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) |
| | |
| | #2 (permalink) |
| Android Experte 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
|
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. |
| | |
| Folgender Benutzer bedankt sich bei v Ralle v für diesen Beitrag: | Duckemai (28.06.2011) |
| | #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
|
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 |
| | |
| | #4 (permalink) |
| Android Experte Registriert seit: 05.02.2010
Beiträge: 609
Abgegebene Danke: 75
Erhielt 136 Danke für 119 Beiträge
|
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. ![]() |
| | |
| Folgender Benutzer bedankt sich bei DieGoldeneMitte für diesen Beitrag: | Duckemai (30.06.2011) |
| | #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
|
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 |
| | |
| | #6 (permalink) |
| Android Experte Registriert seit: 05.02.2010
Beiträge: 609
Abgegebene Danke: 75
Erhielt 136 Danke für 119 Beiträge
|
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);
}
} 2.) Im Lauyout definieren: Code: <my.package.OffScreenView
android:layout_width="..."
...
android:id="@+id/offscreen"
/> 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 ) {}
}
}
} 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) |
| | |
| Folgender Benutzer bedankt sich bei DieGoldeneMitte für diesen Beitrag: | Duckemai (30.06.2011) |
| | #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
|
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) |
| | |
| | #9 (permalink) | |
| Android Experte Registriert seit: 05.02.2010
Beiträge: 609
Abgegebene Danke: 75
Erhielt 136 Danke für 119 Beiträge
| Zitat:
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();
} ![]() 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 | |
| | |
| Folgender Benutzer bedankt sich bei DieGoldeneMitte für diesen Beitrag: | Duckemai (01.07.2011) |
| | #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
| 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 ... |
| | |
| Folgender Benutzer bedankt sich bei miha für diesen Beitrag: | Duckemai (01.07.2011) |
![]() |
|
| Themen-Optionen | |
| Ansicht | |
| |
| ||||
| 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 |