Optimiser un rendu graphique de Tilsets

Signaler
-
Bonjour,

mon logiciel permet de créer une carte où des Joueurs peuvent se connecter et jouer ensemble.

Tout fonctionne bien hormis que certains joueurs se plaignent de lags.

Après avoir revu un peu mes scripts je m’aperçoit effectivement que la charge de calcul est énorme pour le rendu des Tiles.

Voici comment fonctionne le rendu de mes Cartes à l'heure actuelle (en mode simplifié):
' On Nettoie
DXD3.Clear(xxx)

' Debut de Scene
DXD3.BeginScene

'Ma Carte
for x=1 to Max_MapX
   for y=1 to MaxMapY
       'Les tiles sont envoyé 1 par 1 dans le backbuffer (1 tile fait 32x32)
        DX8.RenderTexture ect....
   next
next

' le reste.....

' Fin de scene
DXD3.EndScene
' On affiche le back buffer
DXD3.Present(xxx)


En gros on appel le rendu toutes les 25ms.
L'affichage des cartes est 32x24. Y a un sacré paquet de calculs à la seconde, c'est trop.

32x24 768 Tiles qu'on va piocher dans plusieurs fichiers. Parfois ce Tiles sont ce qu'on appel des Autotiles et sont geré en 16x16 au lieu de 32x32, donc avec une Carte en 32x24 avec que des Autotiles ça fait 768*4 tiles 3072 à poser toutes les 25ms, donc 1843200 minimum par second. C'est chaud oO

J'ai essayé une autre méthode donc.

En entrée de Carte on sauvegarde son rendu sous forme d'image, puis ensuite on l'affiche basiquement comme fond. Celle-ci est statique donc ça ne dérange pas.

L'idée c'est donc de créer une fonction qui met la Carte en cache sous forme d'images
On envoi donc la scene dans le backbuffer sans l'afficher à l'écran. Ensuite on sauvegarde une image et c'est elle qui sera affiché.

' On Nettoie
DXD3.Clear(xxx)

' Debut de Scene
DXD3.BeginScene

'Ma Carte
'si première lecture on sauvegarde le cache
if Not PasCache then
    for x=1 to Max_MapX
       for y=1 to MaxMapY
          'Les tiles sont envoyé 1 par 1 dans le backbuffer (1 tile fait 32x32)
           DX8.RenderTexture ect....
       next
    next
    Surface = GetBackBuffer
    DX3D8.SaveSurfacetoFiles
    PasCache = true
    
    'on relance une scene
    DXD3.EndScene
    DXD3.Clean(xxx)
    DXD3.BeginScene
end if

'On affiche les images bmp sauvegardée
DX8.RenderTexture...

' le reste.....

' Fin de scene
DX EndScene
' On affiche le back buffer
DXD3.Present(xxx)


Le résultat c'est qu'il va lire la carte une seule fois, puis juste charger des fichiers images qu'il va afficher comme fond.

Je voudrai donc savoir si vous pensez cette méthode viable ? J'ai le sentiment de gagner en CPU, mais au détriment de quoi ?

Je prend les astuces, conseils... j'ai vraiment besoin d'améliorer le FPS. Pour l'instant les résultat sont très bon, mais je ne suis pas sur de vraiment résoudre le soucis =)