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);
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