Partilhar via


Solução de problemas (Direct3D 9)

Este tópico lista categorias comuns de problemas que você pode encontrar ao escrever aplicativos Direct3D e como evitá-los.

Criação de dispositivos

Se o seu aplicativo falhar durante a criação do dispositivo, verifique os seguintes erros comuns.

  • Certifique-se de verificar os recursos do dispositivo, particularmente as profundidades de renderização.
  • Examine o código de erro. D3DERR_OUTOFVIDEOMEMORY é uma possibilidade constante.
  • Utilize as bibliotecas de vínculo dinâmico (DLLs) DirectX de depuração e verifique as mensagens de saída no depurador.

Usando vértices iluminados

Os aplicativos que usam vértices acesos devem desativar o mecanismo de iluminação Direct3D definindo o estado de renderização D3DRS_LIGHTING como FALSE. Por padrão, quando a iluminação está ativada, o sistema define a cor para qualquer vértice que não contenha um vetor normal como 0 (preto), mesmo que o vértice de entrada contenha um valor de cor diferente de zero. Como os vértices iluminados não contêm, por natureza, um vértice normal, qualquer informação de cor passada para o Direct3D é perdida durante a renderização se o mecanismo de iluminação estiver ativado.

Obviamente, a cor do vértice é importante para qualquer aplicação que execute sua própria iluminação. Para evitar que o sistema imponha os valores padrão, certifique-se de definir D3DRS_LIGHTING como FALSE.

Se o aplicativo for executado, mas nada estiver visível, verifique os seguintes erros comuns.

  • Certifique-se de que os seus triângulos não estão degenerados.
  • Certifique-se de que os seus triângulos não estão a ser removidos.
  • Certifique-se de que suas transformações sejam internamente consistentes.
  • Verifique as configurações do visor para ter certeza de que elas permitem que seus triângulos sejam vistos.

Depuração

Depurar uma aplicação Direct3D pode ser desafiante. Experimente as seguintes técnicas, além de verificar todos os valores de retorno - um conselho particularmente importante na programação Direct3D, que depende de implementações de hardware muito diferentes.

  • Mude para depurar DLLs.
  • Força um dispositivo a operar apenas com software, desativando a aceleração de hardware mesmo quando esta estiver disponível.
  • Superfícies de força na memória do sistema.
  • Crie uma opção para executar em uma janela, para que você possa usar um depurador integrado.

A segunda e terceira opções nesta lista podem ajudá-lo a evitar o bloqueio Win16 que, de outra forma, pode causar o travamento do depurador.

Além disso, tente adicionar as seguintes entradas ao Win.ini.

[Direct3D] 
debug=3 
[DirectDraw] 
debug=3 

Inicialização do Floating-Point Borland

Os compiladores da Borland relatam exceções de ponto flutuante de uma maneira incompatível com o Direct3D. Para resolver esse problema, inclua um manipulador de exceção _matherr como o seguinte:

// Borland floating point initialization 
#include <math.h>
#include <float.h>

void initfp(void)
{
    // Disable floating point exceptions
    _control87(MCW_EM,MCW_EM);
}

int _matherr(struct _exception  *e)
{
    e;               // Dummy reference to catch the warning
    return 1;        // Error has been handled
}

Validação de parâmetros

Por motivos de desempenho, a versão de depuração do tempo de execução do Modo Imediato Direct3D executa mais validação de parâmetros do que a versão comercial, que às vezes não executa nenhuma validação. Isso permite que os aplicativos executem depuração robusta com o componente de tempo de execução de depuração mais lento antes de usar a versão comercial mais rápida para ajuste de desempenho e versão final.

Embora vários métodos do Modo Imediato do Direct3D imponham limites aos valores que podem aceitar, esses limites geralmente só são verificados e impostos pela versão de depuração do tempo de execução do Modo Imediato do Direct3D. Os aplicativos devem estar em conformidade com esses limites, ou resultados imprevisíveis e indesejáveis podem ocorrer quando executados na versão comercial do Direct3D. Por exemplo, o método IDirect3DDevice9::D rawPrimitive aceita um parâmetro (PrimitiveCount) que indica o número de primitivos que o método renderizará. O método só pode aceitar valores entre 0 e D3DMAXNUMPRIMITIVES. Na versão de depuração do Direct3D, se passares mais de D3DMAXNUMPRIMITIVES primitivos, o método falhará graciosamente, imprimindo uma mensagem de erro no registo de erros e retornando um valor de erro para a tua aplicação. Por outro lado, se seu aplicativo cometer o mesmo erro quando estiver sendo executado com a versão comercial do tempo de execução, o comportamento será indefinido. Por razões de desempenho, o método não valida os parâmetros, resultando em comportamento imprevisível e completamente situacional quando eles não são válidos. Em alguns casos, a chamada pode funcionar e, em outros casos, pode causar uma falha de memória no Direct3D. Se uma chamada inválida funcionar consistentemente com uma configuração de hardware específica e uma versão do DirectX, não há garantia de que ela continuará a funcionar em outro hardware ou com versões posteriores do DirectX.

Se o seu aplicativo encontrar falhas inexplicáveis ao executar com a versão de tempo de execução de retalho do Direct3D, teste contra a versão de depuração e verifique atentamente os casos em que o seu aplicativo utiliza parâmetros inválidos. Use a ferramenta de controlo do DirectX, mude para o runtime de depuração, se necessário, e marque a opção "Parar em D3DError". Essa opção forçará o tempo de execução a usar o método Windows DebugBreak para forçar o aplicativo a parar quando um bug do aplicativo for detetado.

Dicas de Programação