Projeto Virtual Worlds

Computação Gráfica 3D em C

Arquivos Mensais: fevereiro 2015

Uma diferença impressionante numa rotina básica.

A rotina de normalização de um vetor, aquela que transforma um vetor qualquer num vetor unitário, constitui-se em dividir os componentes x, y e z do vetor original pelo seu tamanho… Mas, essa é uma das rotinas fundamentais de todo o projeto e, por isso, tem que ser feita de forma rápida, bem rápida! Vejamos duas implementações possíveis:

void vec3_normalize_mul(float *v)
{
  float len = vec3_length(v);

  if (len != 0.0f)
  {
    len = 1.0f / len;

    v[0] *= len;
    v[1] *= len;
    v[2] *= len;
  }
}

void vec3_normalize_div(float *v)
{
  float len = vec3_length(v);

  if (len != 0.0f)
  {
    v[0] /= len;
    v[1] /= len;
    v[2] /= len;
  }
}

Essencialmente as duas rotinas fazem a mesma coisa. Mas, se você medir a quantidade de ciclos de clock gastos por ambas terá uma surpresa…  A primeira rotina gasta cerca de 350 ciclos, mas a segunda gasta cerca de 2500 ciclos! Ou seja, fazer uma divisão e 3 multiplicações é quase 615% mais rápido do que fazer três divisões!

Evite divisões!