Défi Fonction 2D d'éclairage super optimisé

Programmation d'applications complexes
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

finalement j'ai pu aller plus vite que prévu. Le code de lancer de rayon était sur le forum DB alors je l'ai vite retrouvé, j'ai fait une démo d'éclairage (vite fait) qui reprend les mêmes sprite que vu.zip (et j'ai refait la même map)

le champ de vision peut être déformé selon les obstacles (normal) mais c'est pas encore pris en compte par l'éclairage. Sinon ca ne rame pas d'un poil ^^

vu2.zip

Dri :D
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

?
Si ton code fonctionne, tu as de la chance! En plus tu dépasses les limites de ton sprites (boucle de 0 à 640 par exemple, ça fait 641! Fais gaffe!)

Un des trucs qu'on fait souvent pour optimiser est de déplier ses boucles ou de les unifier. Je m'explique. Le buffer de l'écran est linéaire en fait. Quand tu remplis l'écran entier, pourquoi faire des calculs pour arriver à se positionner sur un pixel, alors qu'en fait le pixel suivant est 4 octets plus loin? (en 32 bits RGB) Une addition est bien plus rapide que plusieurs multiplications! Et une seule boucle finit par suffir.

Le but est d'arriver à un code de ce genre:

Code : Tout sélectionner

Structure Pixel
  Pixel.l
EndStructure

If InitSprite() = 0 Or InitKeyboard()=0
  MessageRequester("Error","DirectX 7+ is needed.",0)
	End
EndIf

If OpenScreen(640,480,32,"Boom")

	Repeat
		If StartDrawing(ScreenOutput())
		
			*ScreenBufferEnd.Pixel=DrawingBuffer()+480*DrawingBufferPitch()
	
			t=ElapsedMilliseconds()
	
			For z=0 To 5
				*ScreenBuffer.Pixel=DrawingBuffer()
				Repeat
					*ScreenBuffer\Pixel=*ScreenBuffer
					*ScreenBuffer+4
				Until *ScreenBuffer>=*ScreenBufferEnd
			Next z
	
			temps=ElapsedMilliseconds()-t 
			DrawText(100,100,Str(temps))

			StopDrawing()

			ExamineKeyboard()
			FlipBuffers()
		
		EndIf
	Until KeyboardPushed(#PB_Key_Escape)
		
	CloseScreen()
	MessageRequester("Timing","Temps:"+Str(temps),#PB_MessageRequester_Ok)

EndIf

End
Tu me diras que tu perds tes variables X et Y! En as-tu *vraiment* besoin? Ne peux-tu pas là aussi déplier tes boucles?

Si tu dois les garder, évite simplement de faire des calculs là où ce n'est pas nécessaire (fais une addition de 4 au lieu d'une addition de 1 puis après un multiplication*4!)

J'espère que ces petits trucs te serviront. Je vais regarder pour le tracé d'un polygone sur le forum anglais, je sais qu'il y a des astuces.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Pour le code je ne parlais pas de celui de Dri ;)
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Dr. Dri a écrit :finalement j'ai pu aller plus vite que prévu. Le code de lancer de rayon était sur le forum DB alors je l'ai vite retrouvé, j'ai fait une démo d'éclairage (vite fait) qui reprend les mêmes sprite que vu.zip (et j'ai refait la même map)

le champ de vision peut être déformé selon les obstacles (normal) mais c'est pas encore pris en compte par l'éclairage. Sinon ca ne rame pas d'un poil ^^

vu2.zip

Dri :D
C'est vraiment exelent ton truc..ta pas les sources :P
tu crois qu'il y a moyen de faire en sorte pour qu'il n'y ai que ec qui est vu qui apparaisse ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

djes a écrit :?
Si ton code fonctionne, tu as de la chance! En plus tu dépasses les limites de ton sprites (boucle de 0 à 640 par exemple, ça fait 641! Fais gaffe!)

Code : Tout sélectionner

Oui exacte... tu as raison
[quote="djes"]
Un des trucs qu'on fait souvent pour optimiser est de déplier ses boucles ou de les unifier.
Tu me diras que tu perds tes variables X et Y! En as-tu *vraiment* besoin? Ne peux-tu pas là aussi déplier tes boucles? 

Si tu dois les garder, évite simplement de faire des calculs là où ce n'est pas nécessaire (fais une addition de 4 au lieu d'une addition de 1 puis après un multiplication*4!)

J'espère que ces petits trucs te serviront. Je vais regarder pour le tracé d'un polygone sur le forum anglais, je sais qu'il y a des astuces.[/quote][/quote]
C'est interessant ce que tu me dis là ...
Dans le dernier code que j'ai fait le but n'était pas d'optimisé le remplissage mais de verifier que Poke était plus rapide qu'un pointeur.

Et pour mon code actuel (tracé de cone) je vois mal comment je peux faire pour me passer de x ou y car le point suivant n'est pas obligatoirement a côté. ou alors il y a une solution mais je ne la connais pas  :P
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Thyphoon a écrit :C'est vraiment exelent ton truc..ta pas les sources :P
tu crois qu'il y a moyen de faire en sorte pour qu'il n'y ai que ec qui est vu qui apparaisse ?
Trop cochon les sources pour le moment, je te commenterai ca dans la semaine ^^
Faut aussi que j'ajoute la correction de la lumière selon les obstacles...

Par contre voila comment mon éclairage fonctionne:
Affichage de la map
Affichage d'un Sprite 3D tout noir pour l'ombrage
(en jouant sur l'opacité c'est +/- éclairé)
Affichage de x Sprite3D blancs dont la couleur est calculée

Donc si l'ombrage est au maximum, l'éclairage sera nul (0 * x = 0...)
Par contre on peut jouer sur l'ombrage pour le diminuer le plus possible sans que ca empêche d'éclairer ^^

[edit]

Toujours aussi cochon les sources, mais voici une version où l'éclairage ne bug plus
c'était ultra-simple et comme je suis pas sorti hier soir j'ai eu le temps de le faire
vu3.zip

Dri
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Superbe démo Dri :wink:
A qd ton MGS ??? :P
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

c'est excellent, merci pour cette démo, dri.
Image
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

j'ai peut être oublié de préciser qu'on peut modifier le champ de vision avec la souris (clics gauche et droite + molette)

Dri
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

c'est du tout bon ca :D merci pour les sources
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Jolie ! :)
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Heu...la molette ne fait rien chez moi ? :(
Les boutons oui :D
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

8O Tu m'as scotché Dri! J'ai eu du mal à comprendre à quoi servaient les régions mais ouahow, c'est d'la balle!
:10:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

djes a écrit :8O Tu m'as scotché Dri! J'ai eu du mal à comprendre à quoi servaient les régions mais ouahow, c'est d'la balle!
:10:
Chui désolé de pas tout avoir commenté (ni mi au propre) mais j'avais une flemme monstre

Dri :oops:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ben ça va franchement! On voit que tu maîtrises PB, c'est du joli code :)
C'est vrai qu'un petit commentaire par ci par là pourra TE servir dans quelques années ;)
Répondre