Page 1 of 1

Optimizing texture swaps

Posted: Sun Feb 13, 2022 6:19 pm
by Ats
Hi, I remember Kjell warned me about texture swaps a while back: http://www.emix8.org/forum/viewtopic.php?p=8719#p8719
So I was wondering if it is worth keeping track of the current material in order to avoid @UseMaterial if it hasn't changed. Maybe it will speed up the rendering of my explosions?

I made a strip down example of it:

Code: Select all

<?xml version="1.0" encoding="iso-8859-1" ?>
<ZApplication Name="App" Caption="ZGameEditor application" FileVersion="2">
  <OnLoaded>
    <ZLibrary>
      <Source>
<![CDATA[void setMaterial(int m)
{
  currentMaterial = m;
  switch(m)
  {
    case 1: @UseMaterial(Material: Material1); return;
    case 2: @UseMaterial(Material: Material2); return;
  }
}]]>
      </Source>
    </ZLibrary>
    <ZExpression>
      <Expression>
<![CDATA[for(int i=0; i<8; i++)
{
  Dummy.Position.X = random(0, 8);
  Dummy.Position.Y = random(0, 4);
  Dummy.n = 1;
  createModel(Dummy);
}
for(int j=0; j<8; j++)
{
  Dummy.Position.X = random(0, 8);
  Dummy.Position.Y = random(0, 4);
  Dummy.n = 2;
  createModel(Dummy);
}]]>
      </Expression>
    </ZExpression>
  </OnLoaded>
  <Content>
    <Model Name="Dummy" Position="6.2233 -0.5997 0">
      <Definitions>
        <Variable Name="n" Type="1"/>
      </Definitions>
      <OnRender>
        <ZExpression>
          <Expression>
<![CDATA[if (currentMaterial != CurrentModel.n) SetMaterial(CurrentModel.n);
@RenderMesh(Mesh: CubeMesh);]]>
          </Expression>
        </ZExpression>
      </OnRender>
    </Model>
    <Mesh Name="CubeMesh">
      <Producers>
        <MeshBox/>
      </Producers>
    </Mesh>
    <Material Name="Material1">
      <Textures>
        <MaterialTexture Texture="Bitmap1" TexCoords="1"/>
      </Textures>
    </Material>
    <Material Name="Material2" Color="1 0 0 1"/>
    <Bitmap Name="Bitmap1">
      <Producers>
        <BitmapNoise/>
      </Producers>
    </Bitmap>
    <Variable Name="CurrentMaterial" Type="1"/>
  </Content>
</ZApplication>

Re: Optimizing texture swaps

Posted: Sun Feb 13, 2022 7:09 pm
by Kjell
Hi Ats,
Ats wrote: Sun Feb 13, 2022 6:19 pmI was wondering if it is worth keeping track of the current material in order to avoid @UseMaterial if it hasn't changed.
No need for that. When you call UseMaterial it automatically checks whether the material is already active or not .. you can see the code for this here.

What helps in terms of performance is to make sure that models with the same material get rendered in succession of each other ( as much as possible ). So if you have 3 coins and 3 mushrooms you want to render them in the order of "coin coin coin mushroom mushroom mushroom" ( best case ) and not "coin mushroom coin mushroom coin mushroom" ( worst case ). One easy way to ensure this is to use a unique Model.Category for the coin and another for the mushroom model.

K

Re: Optimizing texture swaps

Posted: Mon Feb 14, 2022 8:07 am
by VilleK
Exactly what Kjell said. He is the true ZGE guru :)