VGA – Tutorial 6 – Denthor

                       --==[ PARTE 6 ]==--
Autor: DENTHOR do ASPHYXIA
Atualizado por Snowman
Traduzido por Krull >>> tradução revisada e atualizada em 2019

Para obter os programas mencionados neste tutorial, por favor baixe o zip com a versão antiga do tutorial, neste link.

[Nota: essas coisas entre colchetes foram adicionadas pelo Snownan. O texto original ficou quase todo inalterado, exceto pela inclusão do material em C++]

Introdução

Olá! Estou de volta, com a parte mais recente da série: Arrays Pré-Gerados. Este é um conceito bastante simples, que pode triplicar a velocidade do seu código, então dê uma olhada.

Eu ainda sugiro que se você não tem uma cópia do TEXTER, que pegue uma. É um shareware, escrito por mim, que lhe permite fazer fontes e usar em seus programas.

Eu baixei o Demo Friendly City BBS, uma introdução para um PE BBS, escrito por um grupo novo, chamado DamnRite, do programador Brett Step. A música era excelente, escrita por Kon Wilms (se eu não estiver enganado, ele é um nerd de Amiga ;-)). Uma produção muito legal, e mal posso esperar para ver mais trabalhos deles. Vou tentar enganar uma BBS local para me deixar mandar um fido-mail para o Brett.

Se você gostaria de me contactar, ou ao time, há muitos modos que você pode fazê-lo:
1) Escrever uma mensagem para Grant Smith em email privado aqui ou na Mailbox BBS
2) Escrever uma mensagem aqui na conferência de Programação, aqui na Mailbox (de preferência se você tem uma pergunta geral de programação ou problemas de que poderia interessar a outros)
3) Escrever para ASPHYXIA na ASPHYXIA BBS
4) Escrever para Denthor, Eze ou Livewire na Connectix.
5) Escrever para
Grant Smith
P.O.Box 270 Kloof
3640
6) ligar para mim (Grant Smith) no número 73 2129 (deixe uma mensagem se você ligar quando eu estiver na faculdade)

OBS1 : Se você é um representante de uma companhia ou BBS e quer que a ASPHYXIA faça um demo para você, mande um email pra mim; podemos discutir.
OBS2 : Se você fez/tentou fazer um demo, MANDE PARA MIM! Estamos nos sentindo muito solitários e queremos encontrar/ajudar/trocar código com outros grupos de demos. O que você tem a perder? Mande uma mensagem aqui e podemos ver como transferir. Nós realmente queremos ouvir de você.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Por que eu preciso de uma tabela de lookup? O que é isso?

Uma tabela de lookup (pesquisa) é uma tabela imaginária onde você busca as respostas para certas equações matemáticas ao invés de recalcular toda hora. Isso pode acelerar as coisas consideravelmente. Por favor, note que uma tabela de lookup é, às vezes, chamada de array pré-gerado.

Um modo de olhar para a tabela é o seguinte: digamos que por alguma razão obscura você precise de calcular um monte de multiplicações (por exemplo, 5*5, 7*4, 9*2, etc). Ao invés de realmente fazer uma multiplicação lenta de cada vez, você pode gerar um tipo de tabela de ligação, como visto abaixo:

ÉÍÑÍËÍÍÍÍÍÑÍÍÍÍÍÑÍÍÍÍÍÑÍÍÍÍÍÑÍÍÍÍÍÑÍÍÍÍÍÑÍÍÍÍÍÍÑÍÍÍÍÍÑÍÍÍÍÍ»
 ÇÄÅĶ  1  ³  2  ³  3  ³  4  ³  5  ³  6  ³  7   ³  8  ³  9  º
 ÇÄÁÄ×ÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍÍÍØÍÍÍÍÍØÍÍÍÍ͵
 º 1 º  1  ³  2  ³  3  ³  4  ³  5  ³  6  ³  7   ³  8  ³  9  ³
 ÇÄÄÄ×ÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄ´
 º 2 º  2  ³  4  ³  6  ³  8  ³  10 ³  12 ³  14  ³  16 ³  18 ³
 ÇÄÄÄ×ÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄ´
 º 3 º  3  ³  6  ³  9  ³  12 ³  15 ³  18 ³  21  ³  24 ³  27 ³
 ÇÄÄÄ×ÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄ´
 º 4 º  4  ³  8  ³  12 ³  16 ³  20 ³  24 ³  28  ³  32 ³  36 ³
 ÇÄÄÄ×ÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄ´
 º 5 º  5  ³  10 ³  15 ³  20 ³  25 ³  30 ³  35  ³  40 ³  45 ³
 ÇÄÄÄ×ÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄ´
 º 6 º  6  ³  12 ³  18 ³  24 ³  30 ³  36 ³  42  ³  48 ³  54 ³
 ÇÄÄÄ×ÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄ´
 º 7 º  7  ³  14 ³  21 ³  28 ³  35 ³  42 ³  49  ³  56 ³  63 ³
 ÇÄÄÄ×ÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄ´
 º 8 º  8  ³  16 ³  24 ³  32 ³  40 ³  48 ³  56  ³  64 ³  72 ³
 ÇÄÄÄ×ÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄ´
 º 9 º  9  ³  18 ³  27 ³  36 ³  45 ³  54 ³  63  ³  72 ³  81 ³
 ÈÍÍÍÊÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÙ

Isso significa que ao invés de calcular 9*4, você apenas acha o 9 no topo e o 4 no lado, e o número que resultar no cruzamento é a resposta. Esse tipo de tabela é muito útil quando as equações são muito demoradas de se fazer.

O exemplo que eu vou usar para essa parte é o de círculos. Joguem suas mentes de volta à Parte 3, em linhas e círculos. A seção de Círculos levou um bom tempo para terminar de desenhar, principalmente porque eu tinha que calcular o SENO e COSSENO para CADA PONTO. Calcular seno e cosseno é obviamente muito lento, e isso refletiu na velocidade da seção.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Como eu gero uma tabela de lookup?

[Nota: o parágrafo seguinte contém um erro significante. No meio do
parágrafo, Denthor diz que 360 / 0.4 = 8000. Da última vez que chequei, 360 / 0.4 = 900. Como resultado, eu mudei o código em C++ pra refletir isso. Porém, deixei o documento inalterado. Então, se você encontrar uma referência do Denthor ao 8000, você sabe porque eu estou usando 900.]

Isso é muito simples. No meu exemplo, estou desenhando um círculo. Um círculo tem 360 graus, e para maior precisão, vou começar em zero e aumentar os graus de 0.4. Isso significa que para cada círculo, haverá 8000 senos e cossenos (360/0.4=8000). Colocar isso na base de 64k que o Pascal aloca para variáveis normais, obviamente não é uma coisa que vai acontecer, então definimos como ponteiros, da seguinte maneira:

[Pascal]
    TYPE   table = Array [1..8000] of real;
     VAR    sintbl : ^table;            
            costbl : ^table;

 [C++]
     const  TABLESIZE = 900;     
     float  *costbl=NULL;     
     float  *sintbl=NULL;

Então, no programa, pegamos a memória para esses dois ponteiros. Asphyxia esteve pensando inicialmente em se chamar de Creative Reboot Inc., principalmente porque sempre nos esquecíamos de pegar a memória necessária para nossos ponteiros. (Se bem que um pouco de código criativo em assembly também contribuiu para isso. Nós começamos a classificar nossos reboots numa escala de 1 a 10 ;-)). O próximo passo óbvio é colocar nossas respostas que precisamos dentro das tabelas de lookup. Isso pode levar um tempinho, então, num demo, você faria isso logo no início (as pessoas vão achar que é o acesso lento ao disco, ou algo desse tipo), ou depois de você mostrar uma figura (enquanto o espectador está admirando, você está calculando PI elevado a 37, por trás, em background ;-)) Um outro modo de fazer isso é, depois de calcular uma vez, você salvar num arquivo que você então carrega pra dentro de uma variável no início do programa. De qualquer modo, é assim que vamos calcular a tabela para nosso círculo:

[Pascal]
Procedure Setup;
 VAR deg:real;
 BEGIN
   deg:=0;
   for loop1:=1 to 8000 do BEGIN
     deg:=deg+0.4;
     costbl^[loop1]:=cos (rad(deg));
     sintbl^[loop1]:=sin (rad(deg));
   END;
 END;

 [C++]  
[Nota: Eu incluí o "Setup" dentro da função LookupCirc()] 
deg = 0.0;
   for (loop1=0;loop1<TABLESIZE;loop1++) {
     costbl[loop1] = cos(rad(deg));
     sintbl[loop1] = sin(rad(deg));
     deg += 0.4;
   }

Isso vai calcular os 16000 números reais e colocá-los em nossas duas variáveis. A quantidade de tempo que leva, depende do seu computador.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Como eu uso uma tabela de lookup?

Isso é muito fácil. Em seu programa, onde você colocava

[Pascal]      cos (rad(deg))
[C++]         cos (rad(deg))

coloque agora isso:

[Pascal]      costbl^[deg]
[C++]         costbl[deg]

Fácil, não? Note que a nova variável “deg” é um inteiro agora,
sempre entre 1 e 8000.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Onde mais eu uso tabelas de lookup?

As tabelas de lookup podem ser usadas de muitas maneiras. Por exemplo, quando for calcular objetos 3D, seno e cosseno são usados com muita frequência, e são melhores usadas com uma tabela de lookup. Num jogo, você pode pre-gerar o trajeto que um inimigo pode fazer quando ataca. Até salvar uma figura (por exemplo, uma tela de plasma) após gerá-la, e então carregá-la mais tarde, é uma forma de pré-geração.

Quando você sentir que seu programa está muito lento, seus problemas podem ser totalmente resolvidos usando uma tabelas. Ou talvez não. 😉

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Fechando

Como você viu acima, tabelas de lookup não assim são tão excitantes, mas elas são úteis e você precisa saber como usá-las. O programa de amostra em anexo demonstra a grande diferença que elas podem fazer.

Continue programando, e se você terminar alguma coisa, deixe-me saber disso! Eu nunca recebo correspondência, então qualquer mensagem será grandemente apreciada. 😉

Desculpe, sem quotes hoje, está quente e estou cansado. Talvez na próxima vez 😉

  • Denthor
  • Krull

A Nova Krull's HomePage