Das Deutsche Casio-Taschenrechner Forum wurde zum 31.12.2013 geschlossen und kann weiterhin als Nachschlagewerk verwendet werden.
Wer mehr erfahren möchte: Ein sehr guter Beitrag von Elias

C-Spiel optimieren

Hilfe beim Programmieren mit dem fx-9860G SDK.

C-Spiel optimieren

Beitragvon Casimo » Mi 6. Mär 2013, 17:47

Ich suche eigentlich nach einer Möglichkeit, mein Spiel auf Hochgeschwindigkeit zu bringen. Gibt es da irgendwelche anderen Tricks, womit ich Daten schneller lesen / schreiben / verarbeiten kann?

Simon Lothar hat geschrieben:Da müsste man die kritischen Codeteile sehen, die Geschwindigkeitsprobleme haben. Oder anders gefragt, was genau gefällt dir geschwindigkeitsmäßig an deinem Programm nicht? Größere Datenbewegungen im Speicher kann man z. B. um Faktor 4 beschleunigen, wenn man die Daten auf integer-Basis bewegt. Das Standard memcpy arbeitet nur byteweise. Zugriffe auf das Storage Memory kann man ggf. optimieren, indem man einmal eine größerer Menge in den RAM läd und erst nachläd, wenn es erforderlich ist (cache). Das macht z. B. noteview. Wenn es eben geht, sollte man Berechnungen auf integer-Basis ausführen. In Fargoal muss ich z. B. neben vielen anderen Dingen ständig die Abstände zwischen jedem Paar sich bewegender Objekte berechnen und entscheiden, ob die sich "sehen" oder ein Hindernis im Weg ist usw.. Da kommt man nicht weiter, wenn man einfach den Pythagoras mit float-Variablen nimmt. Es gibt z. B. schön schnelle integer-basierte Algorithmen, die die Wurzel ziehen. Aber das sind nur einige Beispiele.


Ich bin am Programmieren einer Raycasting-Engine. Am längsten dauert das Zeichnen, obwohl ich schon die MonochromeLib-Funktionen verwende. Wie sieht dieser schöne Wurzel-Algorithmus aus?
Bild
Benutzeravatar
Casimo
 
Beiträge: 111
Registriert: Fr 3. Aug 2012, 14:48
Taschenrechner: fx9860 GII USB Power Graphic 2
fxCG20

Re: C-Spiel optimieren

Beitragvon SimonLothar » Do 7. Mär 2013, 07:12

Casimo hat geschrieben:...Wie sieht dieser schöne Wurzel-Algorithmus aus?
Hier gibt es ne Menge zur Auswahl: http://stackoverflow.com/questions/1100 ... arm-thumb2
Aber das ist erst der zweite hit, den ich beim goggeln gefunden habe. Da gibt es sicher noch mehr.
Ich selbst benutze:
Code: Alles auswählen
//
unsigned short i_sqrt(unsigned long a){
unsigned long rem = 0;
unsigned long root = 0;
unsigned long oa = a;
int i;
  for ( i=0; i<16; i++){
    root <<= 1;
    rem = ((rem << 2) + (a >> 30));
    a <<= 2;
    root ++;
    if(root <= rem){
      rem -= root;
      root++;
    }
    else root--;
  }
  root >>=1;
  if ((oa-root*root)>((root+1)*(root+1)-oa)) root+=1;
  return (unsigned short)(root);
}

Ich war damals damit zufrieden. Es gibt bestimmt noch schnellere.
SimonLothar
 
Beiträge: 228
Registriert: Mi 27. Mai 2009, 10:51
Taschenrechner: fx-9860G, fx-9860G slim, fx-9860G SD, fx-9860GII SD, fx-9750GII, fx-7400GII, fx-CG20, fx-9860GII-2 SD, fx-9750GII-2, fx-7400GII-2, fx-CP330+, fx-CP400

Re: C-Spiel optimieren

Beitragvon Casimo » Do 7. Mär 2013, 15:20

Mir ist gerade aufgefallen, dass ich floats brauche - wegen der Genauigkeit.
Kann man die irgendwie optimieren? Z. B. den Wertebereich verkleinern?
Bild
Benutzeravatar
Casimo
 
Beiträge: 111
Registriert: Fr 3. Aug 2012, 14:48
Taschenrechner: fx9860 GII USB Power Graphic 2
fxCG20

Re: C-Spiel optimieren

Beitragvon SimonLothar » Do 7. Mär 2013, 15:55

Casimo hat geschrieben:Mir ist gerade aufgefallen, dass ich floats brauche - wegen der Genauigkeit.
Kann man die irgendwie optimieren? Z. B. den Wertebereich verkleinern?
Das genau macht doch der Übergang zu integers. Du musst dir nur ein 32-bit-integer so denken, dass z. B. das obere WORD vor dem Komma und das untere WORD nach dem Komma steht. Dann hast du immer noch einen Bereich von etwa +- 32000. Das reicht für Objektkoordinaten auf GTRs in den nächsten Jahren aus. Die erforderliche Genauigkeit liefert das WORD nach dem Komma. Intern speichert man die Koordinaten als int. Mit diesen Koordinaten wird gerechnet (schnell auf integer-Basis). Man muss dann nur kurz vor der Darstellung ein SHR 16 machen, was auch sehr schnell ist. Genauer können die GTR-Displays eh nicht.
SimonLothar
 
Beiträge: 228
Registriert: Mi 27. Mai 2009, 10:51
Taschenrechner: fx-9860G, fx-9860G slim, fx-9860G SD, fx-9860GII SD, fx-9750GII, fx-7400GII, fx-CG20, fx-9860GII-2 SD, fx-9750GII-2, fx-7400GII-2, fx-CP330+, fx-CP400

Re: C-Spiel optimieren

Beitragvon Casimo » Do 7. Mär 2013, 16:16

Oh, dann habe ich das missverstanden.
Bild
Benutzeravatar
Casimo
 
Beiträge: 111
Registriert: Fr 3. Aug 2012, 14:48
Taschenrechner: fx9860 GII USB Power Graphic 2
fxCG20

Re: C-Spiel optimieren

Beitragvon Casimo » So 10. Mär 2013, 15:31

Wie kann ich am Besten eine Spalte eines Sprites zeichnen?
Im Moment habe ich ein int-array, das sieht in etwa so aus (0 = weiß, 1 = schwarz, 2 = durchsichtig):
Code: Alles auswählen
int wall[][]=
{
{ 1 , 1 , 1 },
{ 1 , 0 , 1 },
{ 1 , 1 , 1 }
};


Dann wird das ganze verzerrt ins VRAM übertragen:
Code: Alles auswählen
float step = {Höhe von wall} / {benötigte Höhe};
float pos = 0;
int y = {unterstes Ende des Sprites};
for(; y < {oberes Ende des Sprites}; pos += step, y++)
{
 SetzePixel( {X-Position}, y, wall[pos][ {benötigte Spalte});
}


(Wie) Lässt sich das optimieren?
Bild
Benutzeravatar
Casimo
 
Beiträge: 111
Registriert: Fr 3. Aug 2012, 14:48
Taschenrechner: fx9860 GII USB Power Graphic 2
fxCG20

Re: C-Spiel optimieren

Beitragvon SimonLothar » Mo 11. Mär 2013, 08:56

Casimo hat geschrieben:(Wie) Lässt sich das optimieren?

Ich würde versuchen, die floats zu ersetzen
Code: Alles auswählen
int step = ( {Höhe von wall} << 8 ) / {benötigte Höhe};
int pos = 1 << 7;  // dieser Offset dient der Rundung
int y = {unterstes Ende des Sprites};
for(; y < {oberes Ende des Sprites}; pos += step, y++)
{
 SetzePixel( {X-Position}, y, wall[pos >> 8][ {benötigte Spalte});
}
Ich habe den Code jetzt einfach mal so hingeschrieben und noch nicht selbst ausprobiert (mach ich heute nachmittag).
Ich würde SetPixel auch nur aufrufen, wenn sich (pos >> 8) vom vorherigen (pos >> 8) unterscheidet.
Das würde aber nur greifen, wenn {Höhe von wall} < {benötigte Höhe} ist.
SimonLothar
 
Beiträge: 228
Registriert: Mi 27. Mai 2009, 10:51
Taschenrechner: fx-9860G, fx-9860G slim, fx-9860G SD, fx-9860GII SD, fx-9750GII, fx-7400GII, fx-CG20, fx-9860GII-2 SD, fx-9750GII-2, fx-7400GII-2, fx-CP330+, fx-CP400

Re: C-Spiel optimieren

Beitragvon Casimo » Di 12. Mär 2013, 19:15

Cool, jetzt läuft das Spiel doppelt dreimal so schnell :o
Danke für den Tipp!!!
Bild
Benutzeravatar
Casimo
 
Beiträge: 111
Registriert: Fr 3. Aug 2012, 14:48
Taschenrechner: fx9860 GII USB Power Graphic 2
fxCG20

Re: C-Spiel optimieren

Beitragvon Casimo » Mo 1. Apr 2013, 17:02

Das ist eine Routine zum Pixelsetzen beim PRIZM.
Code: Alles auswählen
void plot(int x0, int y0, int color)
{
   char* VRAM = (char*)0xA8000000;
   VRAM += 2*(y0*LCD_WIDTH_PX + x0);
   *(VRAM++) = (color&0x0000FF00)>>8;
   *(VRAM++) = (color&0x000000FF);
   return;
}


Wäre

Code: Alles auswählen
void plot(int x0, int y0, int color)
{
   short* VRAM = (short*)0xA8000000;
   VRAM += y0*LCD_WIDTH_PX + x0;
   *VRAM = color;
   return;
}

nicht genauso funktionsfähig und schneller?
Bild
Benutzeravatar
Casimo
 
Beiträge: 111
Registriert: Fr 3. Aug 2012, 14:48
Taschenrechner: fx9860 GII USB Power Graphic 2
fxCG20


Zurück zu fx-9860G SDK (Alle fx-9860G Modelle)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

cron