KINGx - Das inoffizielle PlayStation Forum & News Portal
C++ Bild anzeigen - Druckversion

+- KINGx - Das inoffizielle PlayStation Forum & News Portal (http://www.kingx.de/forum)
+-- Forum:    PS Vita / PSP (/forumdisplay.php?fid=1)
+--- Forum: Homebrew (/forumdisplay.php?fid=8)
+---- Forum: Development (/forumdisplay.php?fid=34)
+---- Thema: C++ Bild anzeigen (/showthread.php?tid=18836)


C++ Bild anzeigen - ~ferra~ - 13.05.2010 10:33

Guten Tag,

heute habe ich mal folgendes Problem.
Ich habe versucht ein einfaches Bild auszugeben. Leider war mein Erfolg eher mäßig.

Das ist das Bild welches ich anzeigen wollte:


Das ist das Ergebnis auf dem Bildschirm:


Hier ist mein Code:

Code:
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspgu.h>
#include <stdio.h>
#include "graphics.h"

#define printf pspDebugScreenPrintf
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))

PSP_MODULE_INFO("Image Display Program", 0, 1, 1);

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
int cbid;

cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);

sceKernelSleepThreadCB();

return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
int thid = 0;

thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}

return thid;
}
int main() {
    char buffer[200];
    Image* ourImage;
    pspDebugScreenInit();
    SetupCallbacks();
    initGraphics();
    sprintf(buffer, "ourImage.png");
    ourImage = loadImage(buffer);
    if(!ourImage) {
                  printf("laden des Bildes fehlgeschlagen!\n");
    } else {
                  int x = 0;
                  int y = 0;
                  sceDisplayWaitVblankStart();
                  while(x<480) {
                               while(y<272) {
                                            blitAlphaImageToScreen(0 ,0 ,32 , 32, ourImage, x, y);
                                            y += 32;
                               }
                               x += 32;
                               y = 0;
                  }
    flipScreen();
    }
    sceKernelSleepThread();
    return 0;
}


Weiß jemand was hier schief gelaufen ist?

MfG[/php]


RE: C++ Bild anzeigen - Chaosduckman - 13.05.2010 10:50

Buffer zu klein?
Sry sonst wüsste ich nichts...


RE: C++ Bild anzeigen - ~ferra~ - 13.05.2010 11:34

Ich habe den Fehler gefunden, danke Wink


RE: C++ Bild anzeigen - flofrucht - 13.05.2010 12:08

Könntest du uns bitte den Fehler auch sagen ?
mfg.flo


RE: C++ Bild anzeigen - ~ferra~ - 13.05.2010 12:49

flofrucht :
Könntest du uns bitte den Fehler auch sagen ?
mfg.flo


Der richtige Code müsste so aussehen:

Code:
#include <pspdisplay.h>
#include <pspctrl.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspgu.h>
#include <stdio.h>
#include "graphics.h"

#define printf pspDebugScreenPrintf
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))

PSP_MODULE_INFO("Image Display Program", 0, 1, 1);

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
int cbid;

cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);

sceKernelSleepThreadCB();

return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
int thid = 0;

thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}

return thid;
}
int main() {
    char buffer[200];
    Image* ourImage;
    pspDebugScreenInit();
    SetupCallbacks();
    initGraphics();
    sprintf(buffer, "ourImage.png");
    ourImage = loadImage(buffer);
    if(!ourImage) {
                  printf("laden des Bildes fehlgeschlagen!\n");
    } else {
                  int x = 0;
                  int y = 0;
                  sceDisplayWaitVblankStart();
                                            blitAlphaImageToScreen(0, 0, 480, 272, ourImage, x, y);
                  
    flipScreen();
    }
    sceKernelSleepThread();
    return 0;
}


MfG ferra


RE: C++ Bild anzeigen - flofrucht - 13.05.2010 12:51

ahh Vielen Dank,bitte gewöhne dir immer gleich an die Lösung auch zu posten Wink
Kann der Thread geclosed werden ?
mfg.flo


RE: C++ Bild anzeigen - ~ferra~ - 13.05.2010 13:01

flofrucht :
ahh Vielen Dank,bitte gewöhne dir immer gleich an die Lösung auch zu posten Wink
Kann der Thread geclosed werden ?
mfg.flo


Ja, kann er. danke

MfG ferra


RE: C++ Bild anzeigen - ~ferra~ - 24.05.2010 08:38

Guten Morgen,

zum Glück ist hier noch offen.

Eine Frage habe ich noch bezgl der Bilder.
Wie lösche ich den einzelne Bilder aus dem Speicher. Ansonsten würde ja die PSP irgendwann freezen.

MfG ferra


RE: C++ Bild anzeigen - flofrucht - 24.05.2010 17:19

Hmm ich kenne mich zwar nicht so gut aus aber per MemoryClean warsch.
schau mal auf psp.jim.sh.
sry das ich nicht geclosed habe der Thread ist iwie.untergegangen..
mfg.flo


RE: C++ Bild anzeigen - dark-awesome - 18.04.2011 22:29

Falls noch Interesse besteht XD

Mit clearImage(Color color, Image* image); kann man ein einzelnes Bild löschen Wink

Beispiel:

Code:
#include ...
....

#define black 0xFF000000

...code...

Image* sample;

sample = loadImage("sample.png");

...code...

if(pad.Buttons & PSP_CTRL_CROSS)
{
   clearImage(black, sample);
}

...code...


Hoffe du hast es verstanden, wenn du das gemeint hast Big Grin

PS: Ich weis das der Thread 13.05.2010 ist, aber vielleicht hat ja einer das Problem Wink


RE: C++ Bild anzeigen - Ceikor - 20.04.2011 12:10

stehn :
Falls noch Interesse besteht XD

Mit clearImage(Color color, Image* image); kann man ein einzelnes Bild löschen Wink


LOL oh man du hast keine ahnung Big Grin

Du überschreibst nur den speicher und gibst ihn nicht frei, da kannst duch auch gleich dem pointer sampler ein neues bild zuweisen dann kannst dir das sparen ist nähmlich völlig sinnlos was du da geschrieben hast -.-

Aber naja pspking halt Big Grin


RE: C++ Bild anzeigen - HacKmaN - 20.04.2011 12:13

Ceikor :

stehn :
Falls noch Interesse besteht XD

Mit clearImage(Color color, Image* image); kann man ein einzelnes Bild löschen Wink


LOL oh man du hast keine ahnung Big Grin

Du überschreibst nur den speicher und gibst ihn nicht frei, da kannst duch auch gleich dem pointer sampler ein neues bild zuweisen dann kannst dir das sparen ist nähmlich völlig sinnlos was du da geschrieben hast -.-

Aber naja pspking halt Big Grin


Geb dir Recht... Speicherverschwendung pur Wink


RE: C++ Bild anzeigen - dark-awesome - 20.04.2011 12:22

Ich hab ihn in der Sache halt falsch verstanden. Sorry aber deswegen steht dort ja "wenn du das gemeint hast" Wink


RE: C++ Bild anzeigen - Ceikor - 20.04.2011 12:27

-ferra- :
Wie lösche ich den einzelne Bilder aus dem Speicher.

Antwort von stehn

stehn :
Mit clearImage(Color color, Image* image); kann man ein einzelnes Bild löschen Wink


Also entweder kannst du nicht lesen oder was eher hinkommt du hast keine ahnung. Den du schreibst ja es löscht Big Grin macht es aber definitif nicht^^


RE: C++ Bild anzeigen - ~Hook~ - 20.04.2011 13:14

ist doch egal, stehn ist ja kein profi, woher soll er wissen dass man so mehr speicher verbraucht?
Man muss ledeglich dem Zeiger ein neues Bild zuweißen und dass auch definieren...


RE: C++ Bild anzeigen - HacKmaN - 20.04.2011 13:42

Grip_Split :
Man muss ledeglich dem Zeiger ein neues Bild zuweißen und dass auch definieren...


Falsch... das Bild bleibt dann weiterhin im Arbeitsspeicher.
schau mal her:

Code:
Image *img = loadImage("BLAAAA.png");
if(img)
{
      /* Bild erfolgreich geladen */

      /* img wird zwar neu zugewiesen, das alte Bild bleibt aber trotzdem im RAM */
      img = loadImage("BLAAAA2.png");
}


Dass einzige was hier geändert wurde, ist der Wert des Zeigers (img). Das alte Bild ist zwar jetzt an einer unbekannten Position im RAM (da der Zeiger nicht zwischengespeichert wurde), bleibt aber weiterhin bestehen.

Richtig wäre es so:

Code:
Image *img = loadImage("BLAAAA.png");
if(img)
{
      /* Bild erfolgreich geladen */

      /* Den Speicher, in dem die eigentliche Textur gespeichert ist freigeben */
      free(img->data);

      /* Die Image-Struktur (immerhin 20byte!) freigeben */
      free(img);

      /* Neues Bild laden und Zeiger neu zuweißen */
      img = loadImage("BLAAAA2.png");
}


Jetzt ist der Speicher des alten Bildes freigegeben und kann von sysmem neu vergeben werden.

Alternativ kannst du auch freeImage benutzen, diese Funktion macht das Allerselbe Big Grin


RE: C++ Bild anzeigen - dx3m - 20.04.2011 16:36

Ceikor :

-ferra- :
Wie lösche ich den einzelne Bilder aus dem Speicher.

Antwort von stehn

stehn :
Mit clearImage(Color color, Image* image); kann man ein einzelnes Bild löschen Wink


Also entweder kannst du nicht lesen oder was eher hinkommt du hast keine ahnung. Den du schreibst ja es löscht Big Grin macht es aber definitif nicht^^


doch.. aber nur aus dem vram ;D


RE: C++ Bild anzeigen - ~Hook~ - 20.04.2011 19:24

@HacKmaN Stimmt, wenn man dem zeiger ein neues bild zu weißt, bleibt das bild im RAM, im virtuellen speicher GLAUBE NICHT MEHR xD


RE: C++ Bild anzeigen - HacKmaN - 20.04.2011 19:32

Grip_Split :
@HacKmaN Stimmt, wenn man dem zeiger ein neues bild zu weißt, bleibt das bild im RAM, im virtuellen speicher GLAUBE NICHT MEHR xD


Hä? Virtueller Speicher? Falls du vram meinst, das steht für Video RAM ^^
Und seine Frage war ganz bestimmt die, wie man ein Bild aus dem RAM löscht... denn schon ein paar Bilder im RAM können die PSP zum Absturz bringen, es steht schließlich nicht viel RAM zur Verfügung Wink


RE: C++ Bild anzeigen - ~Hook~ - 20.04.2011 19:37

@HacKmaN Ich meine da wo das Bild virtuell geladen wird.....


RE: C++ Bild anzeigen - HacKmaN - 20.04.2011 19:51

Grip_Split :
@HacKmaN Ich meine da wo das Bild virtuell geladen wird.....


Was meinst du bitteschön mit "virtuell Geladen"? Es gibt auf der PSP keine virtuellen Adresse (wie sie üblich sind), wenn du dass meinst... bei der PSP entscheiden nur die ersten 12 Bits der Adresse auf welches Speichersegment zugegriffen werden soll (z.B. 1000 1000 0000 [0x880] für Kernel Partition 1), der Rest der Adresse gibt die Position im Segment an...


RE: C++ Bild anzeigen - Ceikor - 21.04.2011 00:26

dx3m :
doch.. aber nur aus dem vram ;D

Toll es ist nicht mehr sichtbar -.- darum geht es aber nicht
Ihr wisst schon das ein Bild aus punkten besteht und diese werden mit der funktion die stehn geschriben hat nur alle mit einer Farbe gefüllt und somit belegen Sie weiter den Speicher -.-

So und wenn ich mir die grafics.h anschaue und lese

Zitat:
* Initialize all pixels of an image with a color.

sagt mir das eindeutig was da gemacht wird.


RE: C++ Bild anzeigen - dark-awesome - 21.04.2011 00:37

Ich glaube das HackmaN das nun sehr gut erklärt hat das es mit:

if(img)
{
free(img->data);

free(img);

...........

oder mit der graphics.h/c mit:

freeImage(Image* image);

geht.

Also wäre die frage (falls er es überhaupt noch wissen will) damit beantwortet.