SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
SYSTÈME D’INSTANCING
TIMOTHÉE RAULIN
PLAN
PROBLÈME SOLUTION RÉSULTATS PLUS LOIN
PROBLÈME
Situation
 Nombre d’objets à l’écran
 Nombre d’objets dans le
monde
 Temps de « fabrication » du
contenu d’une zone
 Mémoire nécessaire pour
stocker le contenu d’une zone
Objectifs
 Performance CPU/GPU
 Mémoire CPU/GPU
 Temps réel
PROBLÈME
 En moyenne 10 000 draw call dès qu’on dezoom
 Batching dynamique …
 Mauvais frame rate (CPU bound) mais régulier
 Éditeur friendly
UNITY. DE BASE
 Lent
 Mémoire gigantesque
 Très lent en fait!
 Bon frame rate mais grosse saccade + out of memory
 Pas éditeur friendly
UNITY.COMBINEMESH
PLAN
PROBLÈME SOLUTION RÉSULTATS PLUS LOIN
 Encodage dans une texture
 Décodage au vertex-shader
 Implémentation
 Performance
 Mémoire
SOLUTION UTILISÉE
 1 pixel = 4 * 8 bits ou 2 * 16 bits
 2 * 8 bits = 16 bits => 65536
• 1 => 255 (8 bits) ou 65535 (16 bits)
 Encodage d’un objet avec 3 pixels:
• 3 * 16 bits => x, y, z ( 1 + ½ pixels)
• 2 * 16 bits => Orientation + scale 2d (xz ) (1 pixel)
• 1 * 16 bits => scale Y (½ pixel )
 D’autres encodages possibles (plus de pixels & bits)
ENCODAGE | DÉCODAGE
int valueIn0_1_8bit = System.Math.Max(0, System.Math.Min(255, (int)(valueIn01 * 255.0f)));
UnityEngine.Color32 color = new UnityEngine.Color32((byte)valueIn0_1_8bit, …, … ,… );
int valueIn0_1_16bit = (int)System.Math.Max(0, System.Math.Min(65535, (int)(valueIn01 * 65535.0f)));
int lowBits = 255;
int highBits = 255 << 8;
UnityEngine.Color32 color = new UnityEngine.Color32((byte)(valueIn0_1_16bit & lowBits), ((byte)((valueIn0_1_16bit &
highBits) >> 8), …, …)
float4 texContent = tex2Dlod(_EncodedContentTexture, texCoord);
float valueIn0_1 = texContent.x;
float valueIn0_255 = 255 * texContent.x; //on récupère exactement la valeur valueIn0_1_8bit
float4 texContent = tex2Dlod(_EncodedContentTexture, texCoord);
float valueIn0_65535 = texContent.x * 255 + texContent.y * 255 * 256; //on récupère exactement la valeur
valueIn0_1_16bit
float valueIn0_1 = valueIn0_65535 / 65535;
FORMULES
 Encoder en 8 bits - un float entre 0 et 1
 Encoder en 16 bits
 Décoder en 8 bits
 Décoder en 16 bits
 Strip de mesh : Pour chaque mesh de chaque type de décors, on
prépare un mesh qui est une répétition de copie de ce mesh. Dans
le strip de mesh, on ajoute la composante couleur où l’on encode
l’index de la copie dans la série
 On encode l’affichage d’un groupe d’objet de même type en une
bande de pixel
 On transmet au vertex-shader l’endroit où il faut commencer à lire
et le nombre d’objet qu’il faut décoder
tree tree4tree0 tree1 tree2 tree3 tree4 tree5 tree6
DÉCODAGE AU VERTEX-SHADER
 On utilise la version de UnityEngine.Graphics.DrawMesh avec 9
paramètres dont un MaterialPropertyBlock
 MaterialPropertyBlock : contiendra ce qui change par
DrawMesh : le _StartUV, le MeshCount, la bounding box, etc…
 UnityEngine.Shader.SetGlobalXXX : pour ce qui ne change pas
par draw, en particulier la texture de contrôle
IMPLÉMENTATION 1/2
X lo X hi Y lo Y hi Z lo Z hi Fx lo Fx hi Fz lo Fz hi Up lo Up hi X lo X hiUp lo Up hi
Instance 0 Instance 1 Instance 2 Instance 3 Instance 4
Shader parameters
_ControlTex
_StartUV
_ObjectCount
float instanceIndex = 255 * vertex.color.x;
int pixelCountPerInstance = 3;
float2 baseTexCoord = _StartUV.xy + float2(_ControlTex_TexelSize.x * (pixelCountPerInstance * instanceIndex), 0) +
_ControlTex_TexelSize.xy * 0.5f;
float4 controlValue0 = tex2Dlod (_ControlTex, float4(baseTexCoord, 0, 0));
float4 controlValue1 = tex2Dlod (_ControlTex, float4(baseTexCoord + float2(_ControlTex_TexelSize.x, 0), 0, 0));
float4 controlValue2 = tex2Dlod (_ControlTex, float4(baseTexCoord + float2(2 * _ControlTex_TexelSize.x, 0), 0, 0));
float valueX01 = (controlValue0.x * 255 + controlValue0.y * 255 * 256) / 65535;
(…)
float3 pos = lerp(_MinBBox.xyz, _MaxBBox.xyz, float3(valueX01, valueY01, valueZ01));
(…)
float visible = step(colorIndex, _ObjectCount – 0.5);
controlValue0 controlValue1 controlValue2
_ControlTex
…
…
…
Zoom +
 A partir d’un ensemble de groupe d’objets disparates, on
fabrique un ensemble de groupe d’objets de même type
 On les encode dans la texture de contrôle
 On envoie les commandes de rendu avec DrawMesh
IMPLÉMENTATION 2/2
 La consultation de la texture au vertex-shader est gratuite!
• Il faut être GPU bound pour le voir
• Il faut vraiment beaucoup de vertex alors que généralement le
coût principal vient des pixels
• Même dans ce cas là, on a seulement quelques % de différence
 Remplir une texture sans mip-map à partir d’un tableau de
color32, n’est pas très cher
PERFORMANCES
 Ca pique!! Chaque type d’objet est répliqué, parfois plusieurs
centaines de fois
 En cause certaines limitations de Unity
 Ajuster la taille des strips de mesh
 Optimiser le layout mémoire
• Encoder la normale dans la couleur
• Encoder la tangeante dans la normale
MÉMOIRE
 Pour le debug et la mise au point, pouvoir switcher entre
« Unity pur » et « instancing », le premier définissant la
référence
 Nécessite une autre manière de regrouper les meshs pour
certains éléments
 Animation : manipuler quelques pixels pour bouger un objet
DIVERS
TA TA TATATA * *AIR CONNU
PLAN
PROBLÈME SOLUTION RÉSULTATS PLUS LOIN
 Nombre de draw call réduit
 Temps de régénération et coût de stockage d’une zone réduit
 Zéro alloc ou presque en réutilisant les buffers de stockage
 Empreinte mémoire importante à t=0 mais quasi constante
par la suite
 Animation de certains éléments facilitée
 Nécessite une certaine infrastructure et un certain
investissement pour la mise au point
RÉSULTATS
PLAN
PROBLÈME SOLUTION RÉSULTATS PLUS LOIN
 Travailler avec des valeurs entières permet d’avoir des indices
et donc des tableaux d’objets consultables
 Il n’est pas prohibitif de faire au pixel shader ce genre
d’opération
 On peut produire le contenu de texture d’encodage à partir
d’un rendu et donc animer au GPU
PLUS LOIN
traulin@amplitude-studios.com
MERCI

Contenu connexe

Similaire à [Paris Unity3D meetup] - Système d’instancing dans endless legend reskin

OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...Pôle Systematic Paris-Region
 
Vbisigk
VbisigkVbisigk
VbisigkISIG
 
Technologies du Web - Architectures matérielles et logicielles
Technologies du Web - Architectures matérielles et logiciellesTechnologies du Web - Architectures matérielles et logicielles
Technologies du Web - Architectures matérielles et logiciellesFrédéric Simonet
 
mis
mismis
misISIG
 
Visual studio
Visual studioVisual studio
Visual studioISIG
 
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018Carles Sistare
 
gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !David Caramelo
 
Info smpc2 part1
Info smpc2 part1Info smpc2 part1
Info smpc2 part1mostafadess
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Faycel Chaoua
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tFrancois Ostyn
 
Présentation LMAX / Disruptor
Présentation LMAX / DisruptorPrésentation LMAX / Disruptor
Présentation LMAX / DisruptorSOAT
 
.NET Microframework: du code, de l&rsquo;électronique, de la robotique
.NET Microframework: du code, de l&rsquo;électronique, de la robotique.NET Microframework: du code, de l&rsquo;électronique, de la robotique
.NET Microframework: du code, de l&rsquo;électronique, de la robotiqueMicrosoft
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystMathieu Goeminne
 
C3 - Langage C - ISIMA 1 - Troisieme partie
C3 - Langage C - ISIMA 1 - Troisieme partieC3 - Langage C - ISIMA 1 - Troisieme partie
C3 - Langage C - ISIMA 1 - Troisieme partieLoic Yon
 

Similaire à [Paris Unity3D meetup] - Système d’instancing dans endless legend reskin (20)

OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
 
Vbisigk
VbisigkVbisigk
Vbisigk
 
Technologies du Web - Architectures matérielles et logicielles
Technologies du Web - Architectures matérielles et logiciellesTechnologies du Web - Architectures matérielles et logicielles
Technologies du Web - Architectures matérielles et logicielles
 
Formation python
Formation pythonFormation python
Formation python
 
Apple : iOS
Apple : iOSApple : iOS
Apple : iOS
 
mis
mismis
mis
 
Visual studio
Visual studioVisual studio
Visual studio
 
Bitmaps
BitmapsBitmaps
Bitmaps
 
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
 
gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !
 
Info smpc2 part1
Info smpc2 part1Info smpc2 part1
Info smpc2 part1
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Automat wd info notions-de-mathematiques-appliquees-a-linformatique
Automat wd info notions-de-mathematiques-appliquees-a-linformatiqueAutomat wd info notions-de-mathematiques-appliquees-a-linformatique
Automat wd info notions-de-mathematiques-appliquees-a-linformatique
 
Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2Manuel des TP : Atelier Web 2
Manuel des TP : Atelier Web 2
 
Présentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@tPrésentation LMAX Disruptor So@t
Présentation LMAX Disruptor So@t
 
Présentation LMAX / Disruptor
Présentation LMAX / DisruptorPrésentation LMAX / Disruptor
Présentation LMAX / Disruptor
 
.NET Microframework: du code, de l&rsquo;électronique, de la robotique
.NET Microframework: du code, de l&rsquo;électronique, de la robotique.NET Microframework: du code, de l&rsquo;électronique, de la robotique
.NET Microframework: du code, de l&rsquo;électronique, de la robotique
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
Spark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et CatalystSpark - au dela du dataframe avec Tungsten et Catalyst
Spark - au dela du dataframe avec Tungsten et Catalyst
 
C3 - Langage C - ISIMA 1 - Troisieme partie
C3 - Langage C - ISIMA 1 - Troisieme partieC3 - Langage C - ISIMA 1 - Troisieme partie
C3 - Langage C - ISIMA 1 - Troisieme partie
 

Plus de BeMyApp

Introduction to epid
Introduction to epidIntroduction to epid
Introduction to epidBeMyApp
 
Introduction ciot workshop premeetup
Introduction ciot workshop premeetupIntroduction ciot workshop premeetup
Introduction ciot workshop premeetupBeMyApp
 
Présentation des APIs cognitives IBM Watson
Présentation des APIs cognitives IBM WatsonPrésentation des APIs cognitives IBM Watson
Présentation des APIs cognitives IBM WatsonBeMyApp
 
Crédit Agricole S.A. Personae et Parcours
Crédit Agricole S.A. Personae et ParcoursCrédit Agricole S.A. Personae et Parcours
Crédit Agricole S.A. Personae et ParcoursBeMyApp
 
Cisco Paris DevNet Hackathon slideshow - Intro
Cisco Paris DevNet Hackathon slideshow - IntroCisco Paris DevNet Hackathon slideshow - Intro
Cisco Paris DevNet Hackathon slideshow - IntroBeMyApp
 
Tumeurs Neuroendocrines : une vue d'ensemble
Tumeurs Neuroendocrines : une vue d'ensembleTumeurs Neuroendocrines : une vue d'ensemble
Tumeurs Neuroendocrines : une vue d'ensembleBeMyApp
 
Building your first game in Unity 3d by Sarah Sexton
Building your first game in Unity 3d  by Sarah SextonBuilding your first game in Unity 3d  by Sarah Sexton
Building your first game in Unity 3d by Sarah SextonBeMyApp
 
Using intel's real sense to create games with natural user interfaces justi...
Using intel's real sense to create games with natural user interfaces   justi...Using intel's real sense to create games with natural user interfaces   justi...
Using intel's real sense to create games with natural user interfaces justi...BeMyApp
 
Introduction to using the R200 camera & Realsense SDK in Unity3d - Jon Collins
Introduction to using the R200 camera & Realsense SDK in Unity3d - Jon CollinsIntroduction to using the R200 camera & Realsense SDK in Unity3d - Jon Collins
Introduction to using the R200 camera & Realsense SDK in Unity3d - Jon CollinsBeMyApp
 
Audio Mixer in Unity5 - Andy Touch
Audio Mixer in Unity5 - Andy TouchAudio Mixer in Unity5 - Andy Touch
Audio Mixer in Unity5 - Andy TouchBeMyApp
 
Shaders - Claudia Doppioslash - Unity With the Best
Shaders - Claudia Doppioslash - Unity With the BestShaders - Claudia Doppioslash - Unity With the Best
Shaders - Claudia Doppioslash - Unity With the BestBeMyApp
 
[HACKATHON CISCO PARIS] Slideshow du workshop Smart City
[HACKATHON CISCO PARIS] Slideshow du workshop Smart City[HACKATHON CISCO PARIS] Slideshow du workshop Smart City
[HACKATHON CISCO PARIS] Slideshow du workshop Smart CityBeMyApp
 
Tools to Save Time
Tools to Save TimeTools to Save Time
Tools to Save TimeBeMyApp
 
[Workshop e résidents] présentation intent, craft ai, dalkia et incubateur
[Workshop e résidents] présentation intent, craft ai, dalkia et incubateur[Workshop e résidents] présentation intent, craft ai, dalkia et incubateur
[Workshop e résidents] présentation intent, craft ai, dalkia et incubateurBeMyApp
 
[Webinar E-résidents #1] Présentation des différents métiers du bâtiment conn...
[Webinar E-résidents #1] Présentation des différents métiers du bâtiment conn...[Webinar E-résidents #1] Présentation des différents métiers du bâtiment conn...
[Webinar E-résidents #1] Présentation des différents métiers du bâtiment conn...BeMyApp
 
[IoT World Forum Webinar] Review of CMX Cisco technology
[IoT World Forum Webinar] Review of CMX Cisco technology[IoT World Forum Webinar] Review of CMX Cisco technology
[IoT World Forum Webinar] Review of CMX Cisco technologyBeMyApp
 
HP Helion Episode 6: Cloud Foundry Summit Recap
HP Helion Episode 6: Cloud Foundry Summit RecapHP Helion Episode 6: Cloud Foundry Summit Recap
HP Helion Episode 6: Cloud Foundry Summit RecapBeMyApp
 
Webinar UI/UX by Francesco Marcellino
Webinar UI/UX by Francesco MarcellinoWebinar UI/UX by Francesco Marcellino
Webinar UI/UX by Francesco MarcellinoBeMyApp
 
HP Helion Webinar #5 - Security Beyond Firewalls
HP Helion Webinar #5 - Security Beyond FirewallsHP Helion Webinar #5 - Security Beyond Firewalls
HP Helion Webinar #5 - Security Beyond FirewallsBeMyApp
 
HP Helion Webinar #4 - Open stack the magic pill
HP Helion Webinar #4 - Open stack the magic pillHP Helion Webinar #4 - Open stack the magic pill
HP Helion Webinar #4 - Open stack the magic pillBeMyApp
 

Plus de BeMyApp (20)

Introduction to epid
Introduction to epidIntroduction to epid
Introduction to epid
 
Introduction ciot workshop premeetup
Introduction ciot workshop premeetupIntroduction ciot workshop premeetup
Introduction ciot workshop premeetup
 
Présentation des APIs cognitives IBM Watson
Présentation des APIs cognitives IBM WatsonPrésentation des APIs cognitives IBM Watson
Présentation des APIs cognitives IBM Watson
 
Crédit Agricole S.A. Personae et Parcours
Crédit Agricole S.A. Personae et ParcoursCrédit Agricole S.A. Personae et Parcours
Crédit Agricole S.A. Personae et Parcours
 
Cisco Paris DevNet Hackathon slideshow - Intro
Cisco Paris DevNet Hackathon slideshow - IntroCisco Paris DevNet Hackathon slideshow - Intro
Cisco Paris DevNet Hackathon slideshow - Intro
 
Tumeurs Neuroendocrines : une vue d'ensemble
Tumeurs Neuroendocrines : une vue d'ensembleTumeurs Neuroendocrines : une vue d'ensemble
Tumeurs Neuroendocrines : une vue d'ensemble
 
Building your first game in Unity 3d by Sarah Sexton
Building your first game in Unity 3d  by Sarah SextonBuilding your first game in Unity 3d  by Sarah Sexton
Building your first game in Unity 3d by Sarah Sexton
 
Using intel's real sense to create games with natural user interfaces justi...
Using intel's real sense to create games with natural user interfaces   justi...Using intel's real sense to create games with natural user interfaces   justi...
Using intel's real sense to create games with natural user interfaces justi...
 
Introduction to using the R200 camera & Realsense SDK in Unity3d - Jon Collins
Introduction to using the R200 camera & Realsense SDK in Unity3d - Jon CollinsIntroduction to using the R200 camera & Realsense SDK in Unity3d - Jon Collins
Introduction to using the R200 camera & Realsense SDK in Unity3d - Jon Collins
 
Audio Mixer in Unity5 - Andy Touch
Audio Mixer in Unity5 - Andy TouchAudio Mixer in Unity5 - Andy Touch
Audio Mixer in Unity5 - Andy Touch
 
Shaders - Claudia Doppioslash - Unity With the Best
Shaders - Claudia Doppioslash - Unity With the BestShaders - Claudia Doppioslash - Unity With the Best
Shaders - Claudia Doppioslash - Unity With the Best
 
[HACKATHON CISCO PARIS] Slideshow du workshop Smart City
[HACKATHON CISCO PARIS] Slideshow du workshop Smart City[HACKATHON CISCO PARIS] Slideshow du workshop Smart City
[HACKATHON CISCO PARIS] Slideshow du workshop Smart City
 
Tools to Save Time
Tools to Save TimeTools to Save Time
Tools to Save Time
 
[Workshop e résidents] présentation intent, craft ai, dalkia et incubateur
[Workshop e résidents] présentation intent, craft ai, dalkia et incubateur[Workshop e résidents] présentation intent, craft ai, dalkia et incubateur
[Workshop e résidents] présentation intent, craft ai, dalkia et incubateur
 
[Webinar E-résidents #1] Présentation des différents métiers du bâtiment conn...
[Webinar E-résidents #1] Présentation des différents métiers du bâtiment conn...[Webinar E-résidents #1] Présentation des différents métiers du bâtiment conn...
[Webinar E-résidents #1] Présentation des différents métiers du bâtiment conn...
 
[IoT World Forum Webinar] Review of CMX Cisco technology
[IoT World Forum Webinar] Review of CMX Cisco technology[IoT World Forum Webinar] Review of CMX Cisco technology
[IoT World Forum Webinar] Review of CMX Cisco technology
 
HP Helion Episode 6: Cloud Foundry Summit Recap
HP Helion Episode 6: Cloud Foundry Summit RecapHP Helion Episode 6: Cloud Foundry Summit Recap
HP Helion Episode 6: Cloud Foundry Summit Recap
 
Webinar UI/UX by Francesco Marcellino
Webinar UI/UX by Francesco MarcellinoWebinar UI/UX by Francesco Marcellino
Webinar UI/UX by Francesco Marcellino
 
HP Helion Webinar #5 - Security Beyond Firewalls
HP Helion Webinar #5 - Security Beyond FirewallsHP Helion Webinar #5 - Security Beyond Firewalls
HP Helion Webinar #5 - Security Beyond Firewalls
 
HP Helion Webinar #4 - Open stack the magic pill
HP Helion Webinar #4 - Open stack the magic pillHP Helion Webinar #4 - Open stack the magic pill
HP Helion Webinar #4 - Open stack the magic pill
 

[Paris Unity3D meetup] - Système d’instancing dans endless legend reskin

  • 5. Situation  Nombre d’objets à l’écran  Nombre d’objets dans le monde  Temps de « fabrication » du contenu d’une zone  Mémoire nécessaire pour stocker le contenu d’une zone Objectifs  Performance CPU/GPU  Mémoire CPU/GPU  Temps réel PROBLÈME
  • 6.  En moyenne 10 000 draw call dès qu’on dezoom  Batching dynamique …  Mauvais frame rate (CPU bound) mais régulier  Éditeur friendly UNITY. DE BASE
  • 7.  Lent  Mémoire gigantesque  Très lent en fait!  Bon frame rate mais grosse saccade + out of memory  Pas éditeur friendly UNITY.COMBINEMESH
  • 9.  Encodage dans une texture  Décodage au vertex-shader  Implémentation  Performance  Mémoire SOLUTION UTILISÉE
  • 10.  1 pixel = 4 * 8 bits ou 2 * 16 bits  2 * 8 bits = 16 bits => 65536 • 1 => 255 (8 bits) ou 65535 (16 bits)  Encodage d’un objet avec 3 pixels: • 3 * 16 bits => x, y, z ( 1 + ½ pixels) • 2 * 16 bits => Orientation + scale 2d (xz ) (1 pixel) • 1 * 16 bits => scale Y (½ pixel )  D’autres encodages possibles (plus de pixels & bits) ENCODAGE | DÉCODAGE
  • 11. int valueIn0_1_8bit = System.Math.Max(0, System.Math.Min(255, (int)(valueIn01 * 255.0f))); UnityEngine.Color32 color = new UnityEngine.Color32((byte)valueIn0_1_8bit, …, … ,… ); int valueIn0_1_16bit = (int)System.Math.Max(0, System.Math.Min(65535, (int)(valueIn01 * 65535.0f))); int lowBits = 255; int highBits = 255 << 8; UnityEngine.Color32 color = new UnityEngine.Color32((byte)(valueIn0_1_16bit & lowBits), ((byte)((valueIn0_1_16bit & highBits) >> 8), …, …) float4 texContent = tex2Dlod(_EncodedContentTexture, texCoord); float valueIn0_1 = texContent.x; float valueIn0_255 = 255 * texContent.x; //on récupère exactement la valeur valueIn0_1_8bit float4 texContent = tex2Dlod(_EncodedContentTexture, texCoord); float valueIn0_65535 = texContent.x * 255 + texContent.y * 255 * 256; //on récupère exactement la valeur valueIn0_1_16bit float valueIn0_1 = valueIn0_65535 / 65535; FORMULES  Encoder en 8 bits - un float entre 0 et 1  Encoder en 16 bits  Décoder en 8 bits  Décoder en 16 bits
  • 12.  Strip de mesh : Pour chaque mesh de chaque type de décors, on prépare un mesh qui est une répétition de copie de ce mesh. Dans le strip de mesh, on ajoute la composante couleur où l’on encode l’index de la copie dans la série  On encode l’affichage d’un groupe d’objet de même type en une bande de pixel  On transmet au vertex-shader l’endroit où il faut commencer à lire et le nombre d’objet qu’il faut décoder tree tree4tree0 tree1 tree2 tree3 tree4 tree5 tree6 DÉCODAGE AU VERTEX-SHADER
  • 13.  On utilise la version de UnityEngine.Graphics.DrawMesh avec 9 paramètres dont un MaterialPropertyBlock  MaterialPropertyBlock : contiendra ce qui change par DrawMesh : le _StartUV, le MeshCount, la bounding box, etc…  UnityEngine.Shader.SetGlobalXXX : pour ce qui ne change pas par draw, en particulier la texture de contrôle IMPLÉMENTATION 1/2
  • 14. X lo X hi Y lo Y hi Z lo Z hi Fx lo Fx hi Fz lo Fz hi Up lo Up hi X lo X hiUp lo Up hi Instance 0 Instance 1 Instance 2 Instance 3 Instance 4 Shader parameters _ControlTex _StartUV _ObjectCount float instanceIndex = 255 * vertex.color.x; int pixelCountPerInstance = 3; float2 baseTexCoord = _StartUV.xy + float2(_ControlTex_TexelSize.x * (pixelCountPerInstance * instanceIndex), 0) + _ControlTex_TexelSize.xy * 0.5f; float4 controlValue0 = tex2Dlod (_ControlTex, float4(baseTexCoord, 0, 0)); float4 controlValue1 = tex2Dlod (_ControlTex, float4(baseTexCoord + float2(_ControlTex_TexelSize.x, 0), 0, 0)); float4 controlValue2 = tex2Dlod (_ControlTex, float4(baseTexCoord + float2(2 * _ControlTex_TexelSize.x, 0), 0, 0)); float valueX01 = (controlValue0.x * 255 + controlValue0.y * 255 * 256) / 65535; (…) float3 pos = lerp(_MinBBox.xyz, _MaxBBox.xyz, float3(valueX01, valueY01, valueZ01)); (…) float visible = step(colorIndex, _ObjectCount – 0.5); controlValue0 controlValue1 controlValue2 _ControlTex … … … Zoom +
  • 15.  A partir d’un ensemble de groupe d’objets disparates, on fabrique un ensemble de groupe d’objets de même type  On les encode dans la texture de contrôle  On envoie les commandes de rendu avec DrawMesh IMPLÉMENTATION 2/2
  • 16.  La consultation de la texture au vertex-shader est gratuite! • Il faut être GPU bound pour le voir • Il faut vraiment beaucoup de vertex alors que généralement le coût principal vient des pixels • Même dans ce cas là, on a seulement quelques % de différence  Remplir une texture sans mip-map à partir d’un tableau de color32, n’est pas très cher PERFORMANCES
  • 17.  Ca pique!! Chaque type d’objet est répliqué, parfois plusieurs centaines de fois  En cause certaines limitations de Unity  Ajuster la taille des strips de mesh  Optimiser le layout mémoire • Encoder la normale dans la couleur • Encoder la tangeante dans la normale MÉMOIRE
  • 18.  Pour le debug et la mise au point, pouvoir switcher entre « Unity pur » et « instancing », le premier définissant la référence  Nécessite une autre manière de regrouper les meshs pour certains éléments  Animation : manipuler quelques pixels pour bouger un objet DIVERS
  • 19. TA TA TATATA * *AIR CONNU
  • 21.  Nombre de draw call réduit  Temps de régénération et coût de stockage d’une zone réduit  Zéro alloc ou presque en réutilisant les buffers de stockage  Empreinte mémoire importante à t=0 mais quasi constante par la suite  Animation de certains éléments facilitée  Nécessite une certaine infrastructure et un certain investissement pour la mise au point RÉSULTATS
  • 23.  Travailler avec des valeurs entières permet d’avoir des indices et donc des tableaux d’objets consultables  Il n’est pas prohibitif de faire au pixel shader ce genre d’opération  On peut produire le contenu de texture d’encodage à partir d’un rendu et donc animer au GPU PLUS LOIN