Forum > Graphics

OOPpizzazione...

(1/4) > >>

nomorelogic:
sto "traducendo" in OOP il sorgente con cui facevamo le prove con zengl
così è molto più leggibile secondo me però...
il movimento, sia della nave che dei nemici, non mi sembra più fluido come prima: ora va un po' a scatti

magari ho toppato da qualche parte... se avete modo dategli un'occhiata che magari riuscite a vedere qualcosa che io non vedo :=)

Microges2000:
Riscrivi solo le procedure che modifichi. Mi spiego....

in usprite hai ridefinito  OnDraw, OnProc e OnFree (che non fanno nulla se non richiamare quella del parent); stessa cosa in uspriteenemy ed in uspritenave. Tieni presente che FPC manda una cascata di call (TSpriteNave.OnProc chiama TSprite.InProc che chiama zglCSprite2D.OnProc e cosi' via per le altre) e questo consuma codice.

Altra cosa... se ti serve velocità non usare una cosa tipo
 if X > 750 then  X := 750;
 if X < 0 then  X := 0;
 if Y > 550 then  Y := 550;
 if Y < 0 then  Y := 0;

ma metti gli else

 if X > 750
 then 
 X := 750
else
 if X < 0 then  X := 0;
 
if Y > 550
then 
  Y := 550
else
 if Y < 0 then  Y := 0;

ultima cerca sempre di lavorare con numeri interi e, se possibile con multipli di 2 (i calcoli float occupano una marea di risorse e le multiplicazioni e divisioni con multipli di 2 sono trasformati in shift con una velocità molto maggiore del calcoli standard)

Truccaccio (usato multo pero') se devi usare i numeri in virgola mobile e ci devi fare molte operazioni usa la trasformazione in intero:

Per esempio ho le coordinate X, Y, Z in virgola mobile e devo eseguire le operazioni di rotazione sugli assi X, Y, Z...

Var
  X1, Y1, Z1 : Integer;
Begin
  X1 := Round(X*1000);
  Y1 := Round(Y*1000);
  Z1 := Round(Z*1000);

  RotazioneInX(X1, Y1, Z1);
  RotazioneInY(X1, Y1, Z1);
  RotazioneInZ(X1, Y1, Z1);

  X := X1 / 1000;
  Y := Y1 / 1000;
  Z := Z1 / 1000;
End;

in questo caso gli unicio calcoli con virgola mobile sono la trasformazione in intero (ho usato la precisione all 3a cifra decimale con quel 1000), tutti gli altri alcoli sono effettuati tra interi.

bye

nomorelogic:
in effetti non è che mi sono regolato più di tanto con le ereditarietà :)
spero presto di poter fare le ottimizzazioni anche se il problema me lo da anche con 1 solo sprite e quindi la magagna probabilmente sarà anche da qualche altra parte.

cmq appena sistemo posto i risultati

Stilgar:
Forse non ho capito il problema, ma sul mio Windows7Ent il codice corre senza andare a scatti. :(

nomorelogic:
fai questa prova
1) porta l'astronave all'estrema sx dello schermo
2) schiaccia e tieni premuto il tasto freccia dx fino a raggiungere il lato opposto

dovresti vedere che, ad intervalli regolari, l'astronave fa una specie di scatto per poi riprendere fluidamente lo spostamento
sugli sprite "nemici" la cosa si nota molto meno

questo me lo fa su linux 64 bit

Edit:
stavo pensando se non fosse che, nella matrice di disegni (nel .png) non ci sia un qualche disallineamento...
magari ho toppato di qualche pixel... lavorando di notte può capitare :D
appena posso provo senza far girare i frame ma lasciandone uno sempre fisso

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa