%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["a peça chegou,<br/>sem erro na carga"] --> B["declarar o que o arquivo não diz:<br/>o vertical que o autor usou<br/>e o maior lado real, em metros"]
B --> C["(1) girar até o vertical<br/>do autor virar o da cena<br/>morsa: −90 graus em X"]
C --> D["(2) medir a caixa envolvente, já em pé,<br/>e escalar: maior lado real ÷ maior lado<br/>morsa: 0,18 ÷ 18,00 = 0,0100"]
D --> E["(3) medir a caixa de novo e assentar:<br/>descer a base até o apoio<br/>e centrar no plano do chão<br/>morsa: desce 0,30 m"]
E --> F{"a peça ficou<br/>de cabeça<br/>para baixo?"}
F -->|"sim: o sinal do giro está<br/>trocado; girar com o outro"| C
F -->|"não"| G["escrever o laudo:<br/>arquivo, como chegou, como ficou,<br/>fator, giro, deslocamento<br/>e a lista de divergências"]
Ativos, formatos de troca e orçamento de cena — Atlas
O módulo inteiro em oito formas visuais. Cada uma mostra o mesmo conteúdo de outro jeito: o resumo desenhado; os procedimentos passo a passo; os cartões para treinar de memória; o módulo contado como uma história desenhada; o mapa dos tópicos; a página que junta conceito, exemplo, diagrama e fato; a rede de conceitos; e as regras, as contas e os erros previsíveis para consultar na hora.
Resumo ilustrado
Fluxogramas
Cinco procedimentos do módulo, na ordem em que ele os apresenta. Siga cada um com o lápis, sobre um ativo seu ou sobre a morsa, a ferramenta que aperta entre duas mandíbulas o que alguém vai trabalhar e cujo arquivo chega pronto, feito fora do projeto.
Importar uma peça feita fora
O que o arquivo não diz, e alguém declara, vem antes de qualquer conta: sem o maior lado real, não há fator para medir.
Montar a lista de divergências
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
B{"fator aplicado<br/>entre 0,5 e 2?"} -->|"não"| U["linha da unidade:<br/>unidades por metro<br/>(morsa: 100)"]
B -->|"sim"| C{"giro<br/>declarado<br/>zero?"}
U --> C
C -->|"não"| X["linha do eixo vertical:<br/>o giro aplicado<br/>(morsa: −90 graus em X)"]
C -->|"sim"| D{"deslocamento<br/>acima de 1 cm?"}
X --> D
D -->|"sim"| O["linha da origem:<br/>o deslocamento<br/>(morsa: 0,30 m)"]
D -->|"não"| N["fim: uma linha por divergência;<br/>sem nenhuma, a lista diz que não há<br/>divergência acima da tolerância"]
O --> N
Escolher a técnica pela coluna que cresceu
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["o quadro passou do teto:<br/>olhar as duas colunas,<br/>uma de cada vez"] --> B{"a coluna das<br/>chamadas está<br/>grande?"}
A --> T{"a coluna dos<br/>triângulos está<br/>grande?"}
B -->|"sim"| C{"cópias da<br/>mesma forma<br/>e material?"}
C -->|"não"| U["peça única ou<br/>outro material:<br/>não há lote"]
C -->|"sim"| D{"as cópias<br/>ficam<br/>paradas?"}
D -->|"sim"| I["instanciar:<br/>uma chamada,<br/>triângulos iguais"]
D -->|"não"| M["o ganho evapora:<br/>a tabela das posições<br/>volta à placa<br/>a cada quadro"]
T -->|"sim"| E{"longe: a<br/>diferença não<br/>chega ao olho?"}
E -->|"sim"| N["nível de<br/>detalhe, um<br/>lote por nível"]
E -->|"não"| P["perto do olho,<br/>simplificar é<br/>trabalho<br/>jogado fora"]
B -->|"não"| O["se nenhuma das duas está grande:<br/>a troca de material entre chamadas,<br/>a pintura de muitos pixels ou o trabalho<br/>do próprio programa; as ferramentas<br/>de perfilamento dizem onde<br/>o tempo foi gasto"]
T -->|"não"| O
Fazer o nível de detalhe de uma peça distante
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["numa cópia da malha da peça do fundo,<br/>tirar a normal e a coordenada de textura<br/>(qual ponto da imagem colada<br/>sobre a superfície cai no vértice)"] --> C["unir os vértices pela posição<br/>engrenagem: 338 viram 114"]
C --> D["simplificar com a ferramenta<br/>224 viram 110 triângulos,<br/>57 vértices"]
D --> E["recalcular as normais<br/>senão sai mancha"]
E --> F{"malha vazia, ou<br/>coordenada que<br/>não é número<br/>de verdade?"}
F -->|"sim"| G["fica a original,<br/>e a observação vai para a folha<br/>do programa, o texto que ele<br/>escreve na tela"]
F -->|"não"| H["o nível de longe: um lote inteiro,<br/>com as mesmas posições"]
H --> J["além de 2,2 m da câmera ao centro<br/>da prateleira, liga o lote de longe;<br/>mais perto, o de perto"]
Medir e escrever a folha do programa
%%{init: {"flowchart": {"useMaxWidth": false, "rankSpacing": 30, "nodeSpacing": 30}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TB
A["escrever a máquina no lugar em que<br/>o número sai, antes dos números"] --> B{"a plataforma<br/>deu o nome<br/>da placa?"}
B -->|"sim"| C["escrever o nome"]
B -->|"não"| D["escrever que a placa não foi<br/>identificada, com o motivo"]
C --> E["medir com a câmera em duas posições:<br/>junto à mesa e junto à prateleira,<br/>a leitura de cada uma ao lado do mesmo censo"]
D --> E
E --> F{"as duas leituras<br/>deram iguais?"}
F -->|"não"| G["leituras diferentes são o esperado:<br/>o que cada uma tem a menos que o censo<br/>ficou fora do enquadramento ou no nível<br/>de detalhe desligado, e não é erro"]
F -->|"sim"| H["numa cena espalhada, nada<br/>está sendo descartado: explicar<br/>isso antes de qualquer outra medida"]
G --> I["ler o pior intervalo dos 120 quadros<br/>mais recentes ao lado da média"]
H --> I
Cartões de memória
Leia a frente, diga a resposta em voz alta ou escreva no papel, e só então vire o cartão.
A especificação pode fixar convenções — a unidade em que os números são lidos e qual eixo é o vertical — e é isso que ela faz. O que ela não pode fazer é obrigar quem exporta a obedecê-las.
Daí decorre a única coisa que o formato não transporta: o tamanho da peça no mundo. Um arquivo escrito noutra unidade continua formalmente válido, e nenhum campo normativo registra a troca: o que o exportador quiser dizer vai em texto livre, que nenhum importador é obrigado a ler. O número de metros que a peça mede fora do computador é conhecido por uma pessoa, não pelo arquivo.
Ela se declara antes, em vez de se descobrir no que chega. Uma cena sem convenção escrita não tem contra o que acusar divergência: cada objeto importado passa a trazer a sua, cada ajuste é feito no olho, e não sobra ninguém capaz de dizer qual dos dois lados está errado.
O que a convenção converte é o trabalho de reconciliar. Com ela, a diferença entre o que chegou e o que a cena espera é uma conta; sem ela, é uma negociação, e ela se repete em cada objeto novo.
A metade medida sai da caixa envolvente do objeto que chegou, por divisão e por subtração: o fator de escala e o assentamento da base. Ela não tem como estar errada por distração, e trocar o ativo por outro a recalcula sozinha.
A metade declarada é o que o arquivo não carrega e não tem onde carregar: qual eixo o autor usou como vertical e quanto a peça mede no mundo. Ela é escrita por quem conhece a peça.
A fronteira entre as duas é o que separa importar de arrastar. Um fator de escala digitado é a metade medida transformada em declaração, e funciona até chegar um ativo em outra unidade — quando falha, falha em silêncio, e o conserto é feito num terceiro lugar.
O custo dessa conversa é fixo por objeto e independe do tamanho dele. Um objeto minúsculo custa a mesma preparação que um objeto grande, e é por isso que uma cena de mil peças pequenas pode engasgar sem que a contagem de triângulos assuste ninguém.
Chamada de desenho e triângulo são unidades de contas diferentes. As duas se pagam no mesmo envelope, e nenhuma das duas se lê na outra.
A tabela das posições vai para a placa uma vez, na montagem, e não volta a ser enviada porque nada a altera depois: a placa guarda o lote e desenha dele a cada quadro. A matriz de cada cópia é escrita uma vez, na montagem, e não a cada quadro.
O que a instanciação move é a coluna das chamadas. A contagem de triângulos não muda: eles continuam sendo os mesmos, um por um, e a placa os desenha igual. Instanciar não é sobre triângulo, e quem espera que o número de triângulos caia conclui, olhando a contagem, que a técnica não funcionou.
O critério é a distância, e não o objeto. A mesma peça pode receber nível de detalhe num lugar da cena e não receber em outro, e simplificar o que fica sempre perto do olho é trabalho jogado fora.
A simplificação tem um pré-requisito e uma conferência, e nenhum dos dois acontece sozinho. O pré-requisito é unir os vértices que ocupam a mesma posição. O algoritmo tira triângulos colapsando arestas, e uma aresta só liga duas faces quando as duas usam os mesmos dois vértices. Uma malha que duplica vértice em cada face, para ter aresta viva, chega ao algoritmo partida em pedaços que não se tocam, um por face plana; colapsar aresta num pedaço move pontos que o vizinho não acompanha, e a peça abre buracos. A união se paga com a aresta viva: cada ponto fica com uma normal só para todas as faces que o tocam, e o canto duro fica macio.
A conferência é do resultado: a ferramenta pode devolver malha vazia ou com coordenada inválida, e uma peça que some da cena é defeito pior do que um nível distante mais pesado que o ideal. Quando o resultado não passa, a malha original fica no lugar e a observação vai para o relatório.
Depois de simplificar, as normais são recalculadas: os triângulos que sobraram têm outra inclinação, e manter a normal antiga produz iluminação que não corresponde à forma — um defeito que aparece como mancha, e não como buraco.
A leitura é dinâmica: conta o que a placa desenhou no quadro que acabou de sair. Responde quanto custou o que estava no campo de visão.
A diferença entre os dois mede o que não foi desenhado naquele quadro — o que ficou fora do enquadramento e o nível de detalhe desligado —, e nunca um erro de contagem. Um censo alto com leitura baixa descreve uma cena grande vista por um buraco de fechadura, e vira problema no instante em que alguém gira a cabeça — o que, dentro de um visor, acontece o tempo todo.
O censo conta o lote instanciado como uma chamada e como o produto de triângulos por instância. Somar tudo num número só esconderia exatamente a decisão que se está tomando.
Um número de desempenho sem a máquina ao lado não permite a ninguém repetir a conta. "Roda bem" é uma frase sem sujeito; a mesma cena, no mesmo estado, produz números diferentes em aparelhos diferentes, e a decisão que se toma a partir de cada um é oposta.
Medir na máquina mais forte disponível produz um teto que as máquinas de uso não alcançam, e o resultado prático é o ambiente estourar justamente nos computadores em que ele vai ser apresentado.
Quando o aparelho não informa o que se pediu — o nome da placa, por exemplo, que a plataforma em que a cena roda pode se recusar a dizer, por privacidade —, o relatório declara que não sabe. Preencher o campo com um nome plausível é pior do que deixá-lo vazio: quem lê passa a acreditar que a medição é reproduzível.
História em quadros
O módulo contado do começo ao fim, um passo em cada desenho, na ordem em que ele avança.
Mapa mental
Os tópicos do módulo, do centro para fora, na ordem em que ele os apresenta.
Painel do conhecimento
Conceitos
- Ativo: o arquivo de uma peça pronta, feita fora do projeto, que a cena carrega.
- Formato de troca aberto: o tipo de arquivo, com especificação pública, que leva a geometria, os materiais e as animações de um programa de autoria até um ambiente em execução; o tamanho da peça no mundo ele não transporta.
- Convenção da cena: a unidade, o eixo vertical, a origem e a frente, escritos uma vez, num lugar só, antes de chegar o primeiro ativo, para haver contra o que acusar divergência.
- Ajuste de importação: o que traz o ativo à convenção; a metade medida sai da caixa envolvente, e a declarada é escrita por quem conhece a peça.
- Laudo: o registro do que chegou, do que ficou e do que foi corrigido, com a lista de divergências.
- Chamada de desenho: o pedido à placa de vídeo para desenhar um objeto, com custo fixo por objeto, que não cresce com o tamanho dele.
- Instanciação: desenhar as cópias de uma forma numa chamada só (o conjunto de cópias é um lote); a contagem de triângulos não muda.
- Nível de detalhe: a versão com menos triângulos, exibida no lugar da original quando o objeto está longe o bastante para a diferença não chegar ao olho; o critério é a distância; antes de simplificar, os vértices na mesma posição se unem, e depois o resultado se confere.
- Censo e leitura: o que a cena tem, à vista ou não, e o que a placa desenhou no quadro que acabou de sair; a diferença entre os dois é o que não foi desenhado, e nunca erro.
- Máquina de referência: o aparelho contra o qual a cena é orçada, o mais modesto do parque previsto; nenhum número de desempenho circula sem ela.
Exemplos
- O arquivo correto e a peça errada: escrito em centímetro, válido pelas regras do formato, sem um campo que o programa leia denunciando a troca.
- A colcha de escalas: sem convenção escrita, cada ativo traz a sua, e ninguém consegue reconciliar depois.
- O fator 0,01 digitado, que acerta a morsa e põe dez vezes maior o primeiro ativo em milímetro.
- O fator de 0,998, ruído de exportação, contra a troca de unidade, que erra por ordens de grandeza.
- A animação que tivesse relógio próprio, e não o intervalo que move o resto da cena, andaria mais rápido no computador que desenha mais rápido.
- Quatrocentos parafusos minúsculos, desenhados um a um: quatrocentas conversas com a placa para pouquíssimos triângulos cada, e a cena engasgando sem que a contagem de triângulos assuste ninguém.
- A cena grande vista por um buraco de fechadura: censo alto, leitura baixa, até alguém girar a cabeça.
- “Está rodando bem”: uma frase sem sujeito, porque não diz em que máquina.
Diagrama
%%{init: {"flowchart": {"useMaxWidth": false}, "sequence": {"useMaxWidth": false}, "class": {"useMaxWidth": false}, "state": {"useMaxWidth": false}, "er": {"useMaxWidth": false}}}%%
flowchart TD
C["censo da cena<br/>estático, percorre a árvore da cena"]
L["leitura do quadro<br/>dinâmica, conta o que a placa<br/>desenhou no quadro que saiu"]
C --> P1["quanto esta cena pesa"]
L --> P2["quanto custou o que estava<br/>no campo de visão"]
P1 --> DIF["a diferença entre os dois"]
P2 --> DIF
DIF --> S["o que ficou fora do enquadramento<br/>e o nível de detalhe desligado:<br/>nunca erro de contagem"]
S --> J["câmera parada na tela do computador:<br/>leitura fixa e confortável"]
S --> V["cabeça girando no visor:<br/>o que estava fora entra"]
Evidências
- Contado na importação: a morsa tem 4 malhas, 48 triângulos, 2 materiais e uma animação de 3,0 s; chega com 18,00 × 12,00 × 17,00 unidades do arquivo e fica com 18,0 × 17,0 × 12,0 cm, com fator 0,0100.
- No próprio arquivo da morsa, em campos de texto livre: centímetro e eixo vertical Z; os vértices põem a base 30 unidades acima da origem.
- Contado pelo programa: 206 cabeças de parafuso, 24 triângulos cada, 4.944 na borda; 206 chamadas sem instanciar, 1 instanciando.
- Contado pelo programa: a engrenagem vai de 224 a 110 triângulos, e os vértices de 338 a 114 na união pela posição e a 57 na simplificação; nas 24 peças da prateleira, 5.376 viram 2.640.
- Contado sem a união: 82 triângulos, e só 4 dos 112 triângulos das tampas; a função pronta que só junta vértices iguais em tudo não une nenhum dos 338.
- Nenhum número de desempenho desta cena foi medido, em máquina alguma.
Referências
- Este módulo não cita obra. Os fatos vêm de três procedências: a especificação pública do formato de troca, que fixa o metro e o eixo Y; o próprio arquivo da morsa, com o que ele traz em texto livre; e as contagens que o programa faz da cena.
Aplicações
- No projeto, as tarefas do módulo pedem o mesmo caminho: importar uma peça com convenção e laudo, tratar a repetição e a distância, e medir com a máquina ao lado.
- No diagnóstico de um quadro lento, a primeira pergunta é qual coluna está grande, a das chamadas ou a dos triângulos.
- No módulo seguinte, Realidade virtual não imersiva, a cena completa, parada e medida é a que vai ser exibida.
- Em todos os módulos seguintes, a folha do programa neste estado é a linha de base: a primeira queda de desempenho se compara com ela, e não com o último recurso acrescentado.
Mapa conceitual
Escreva num papel: formato de troca aberto, ajuste de importação, convenção da cena, caixa envolvente, fator de escala, laudo, folha do programa, instanciação, lote, censo, máquina de referência, chamada de desenho, nível de detalhe, leitura do quadro, medidor, triângulos, união pela posição, distância, teto, envelope do quadro. Ligue os conceitos com setas, e escreva em cada seta um verbo que diga qual é a relação. Depois compare com o mapa.
Folha de consulta
Convenção e ajuste
- convenção da cena: unidade metro; vertical eixo Y; origem no ponto em que a peça toca o apoio; frente no sentido positivo de Z
- metade medida, da caixa envolvente: o fator de escala e o assentamento
- metade declarada, por quem conhece a peça: o vertical do autor e o maior lado real, em metros
- fator = maior lado real ÷ maior lado da caixa: 0,18 ÷ 18,00 = 0,0100
- a mesma peça gravada em milímetro mede 180: 0,18 ÷ 180 = 0,001, sem mexer no programa
- ordem: girar, escalar, assentar; nesta peça, só girar e escalar trocam de lugar
O laudo
- sete campos: arquivo, como chegou, como ficou, fator, giro, deslocamento, lista de divergências
- morsa: chega com 18,00 × 12,00 × 17,00 unidades do arquivo; fica com 18,0 × 17,0 × 12,0 cm
- as três linhas da morsa: unidade, 100 unidades por metro; eixo vertical, −90 graus em X; origem, deslocada 0,30 m da própria base
- fator entre 0,5 e 2 não gera linha; deslocamento acima de 1 cm gera
- a linha do eixo vertical entra sempre que o giro declarado não é zero
- sem divergência acima da tolerância, a lista diz isso, e não sai vazia
Chamadas e triângulos
| Na cena | Chamadas | Triângulos |
|---|---|---|
| borda, sem instanciar | 206 | 4.944 |
| borda, instanciando | 1 | 4.944 |
| prateleira, de perto | 1 | 5.376 |
| prateleira, de longe | 1 | 2.640 |
- 206 cabeças: 2 × 67 + 2 × 36; 24 triângulos cada
- uma peça da prateleira: 224 triângulos de perto, 110 de longe, 51% a menos
- a troca de nível: a 2,2 m da câmera ao centro da prateleira, um lote inteiro por vez
Simplificar com conferência
- antes: tirar a normal e a coordenada de textura de uma cópia da malha, e unir os vértices pela posição: 338 viram 114
- simplificada: 110 triângulos, 57 vértices
- depois: recalcular as normais, senão sai mancha
- malha vazia ou coordenada inválida: fica a original, e a observação vai para a folha do programa, que a definição chama de relatório
- a conferência não acusa buraco: a malha furada não está vazia
Censo e leitura
- censo: percorre a árvore da cena e soma o que existe, à vista ou não
- leitura: o que a placa desenhou no quadro que acabou de sair
- a diferença: o que ficou fora do enquadramento e o nível de detalhe desligado
- o lote conta uma chamada, e triângulos por cópia × cópias
- câmera longe da prateleira: os 5.376 do lote de perto ficam fora da leitura
- câmera perto: ficam fora os 2.640 do lote de longe, os 4.944 da borda e os 524 das malhas soltas, fora de lote (a mesa e as peças sobre ela)
Teto, medidor e máquina
- visor, supondo 90 quadros por segundo: 1.000 ÷ 90 ≈ 11,1 ms; computador de mesa, supondo 60: 1.000 ÷ 60 ≈ 16,7 ms; esta cena adota o do visor
- o teto se declara antes da despesa
- o medidor guarda, numa janela de 120 quadros, a média, o pior intervalo e quantos quadros passaram do teto; a folha do programa não imprime essa contagem
- a máquina se escreve antes dos números, no mesmo lugar em que eles saem
- placa que a plataforma não informa: “não identificada”, com o motivo
Erros previsíveis
- “o arquivo veio quebrado”: ele é válido; o desencontro é de convenção
- “o formato de troca carrega a escala”: ele fixa metro e não obriga quem exporta a segui-la; o tamanho da peça, quem sabe é uma pessoa
- “a importação avisa quando algo está errado”: o carregamento dá certo nos três desvios; quem avisa é a comparação contra a convenção escrita
- “basta digitar 0,01”: o primeiro ativo em milímetro entra dez vezes maior, em silêncio
- “a ordem dos ajustes é indiferente”: assentar antes de girar assenta a peça pelo lado que vira lateral, sem erro nem aviso
- “instanciar reduz os triângulos”: os 4.944 continuam 4.944; cai a coluna das chamadas
- “nível de detalhe reduz chamadas”: ele ataca o triângulo; e o nível de detalhe pronto das bibliotecas, que troca peça por peça, desmancha o lote e devolve uma chamada por peça
- “simplificar sempre compensa”: perto do olho, é trabalho jogado fora
- “o algoritmo funciona direto sobre qualquer malha”: sem unir, as tampas da engrenagem ficam com 4 dos 112 triângulos
- “censo e leitura deveriam bater”: a diferença é o que não foi desenhado naquele quadro
- “a média basta”: ela dilui o engasgo; o pior intervalo o mostra
- “medir no computador mais rápido serve”: a decisão sai oposta à que a máquina modesta pediria (acrescentar em vez de cortar), e o ambiente estoura nos aparelhos de uso
- “o teto pode ser declarado depois”: declarado depois, vira balanço do que já foi gasto