Compartilhar 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 impedi-los.

Criação de dispositivo

Se o aplicativo falhar durante a criação do dispositivo, marcar para os erros comuns a seguir.

  • Verifique se você marcar os recursos do dispositivo, especialmente as profundidades de renderização.
  • Examine o código de erro. D3DERR_OUTOFVIDEOMEMORY é sempre possível.
  • Use as DLLs (bibliotecas de vínculo dinâmico) do DirectX depuração e examine as mensagens de saída no depurador.

Usando vértices iluminados

Os aplicativos que usam vértices iluminados devem desabilitar o mecanismo de iluminação Direct3D definindo o estado de renderização D3DRS_LIGHTING como FALSE. Por padrão, quando a iluminação está habilitada, o sistema define a cor de 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 Direct3D será perdida durante a renderização se o mecanismo de iluminação estiver habilitado.

Obviamente, a cor do vértice é importante para qualquer aplicativo que execute sua própria iluminação. Para impedir que o sistema imponha os valores padrão, defina D3DRS_LIGHTING como FALSE.

Se o aplicativo for executado, mas nada estiver visível, marcar para os erros comuns a seguir.

  • Verifique se os triângulos não são degenerados.
  • Verifique se os triângulos não estão sendo eliminados.
  • Verifique se as transformações são consistentes internamente.
  • Verifique as configurações do visor para ter certeza de que elas permitem que seus triângulos sejam vistos.

Depuração

A depuração de um aplicativo Direct3D pode ser desafiadora. Experimente as técnicas a seguir, além de verificar todos os valores retornados , um conselho particularmente importante na programação direct3D, que depende de implementações de hardware muito diferentes.

  • Alterne para depurar DLLs.
  • Forçar um dispositivo somente software, desativando a aceleração de hardware mesmo quando ele estiver disponível.
  • Forçar superfícies na memória do sistema.
  • Crie uma opção para ser executada em uma janela, para que você possa usar um depurador integrado.

A segunda e a terceira opções nessa lista podem ajudá-lo a evitar o bloqueio win16, o que pode causar a trava do depurador.

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

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

Inicialização de Floating-Point Borland

Os compiladores do Borland relatam exceções de ponto flutuante de 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âmetro

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âmetro do que a versão de varejo, que às vezes não executa nenhuma validação. Isso permite que os aplicativos executem uma depuração robusta com o componente de tempo de execução de depuração mais lento antes de usar a versão de varejo mais rápida para ajuste de desempenho e versão final.

Embora vários métodos de Modo Imediato Direct3D imponham limites aos valores que podem aceitar, esses limites geralmente são verificados e impostos apenas pela versão de depuração do tempo de execução do Modo Imediato direct3D. Os aplicativos devem estar em conformidade com esses limites ou resultados imprevisíveis e indesejáveis podem ocorrer durante a execução na versão de varejo 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 você passar mais de primitivos D3DMAXNUMPRIMITIVES, o método falhará normalmente, imprimindo uma mensagem de erro no log de erros e retornando um valor de erro para seu aplicativo. Por outro lado, se o aplicativo fizer o mesmo erro quando estiver em execução com a versão de varejo do tempo de execução, o comportamento será indefinido. Por motivos de desempenho, o método não valida os parâmetros, resultando em um 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 haverá garantia de que ela continuará funcionando em outro hardware ou com versões posteriores do DirectX.

Se o aplicativo encontrar falhas inexplicáveis ao executar com o arquivo de tempo de execução direct3D de varejo, teste a versão de depuração e procure atentamente os casos em que seu aplicativo passa parâmetros inválidos. Use o miniaplicativo do painel de controle DirectX, alterne para o runtime de depuração, se necessário, e marcar a opção "Interromper no D3DError". Essa opção forçará o runtime a usar o método DebugBreak do Windows para forçar o aplicativo a parar quando um bug de aplicativo for detectado.

Dicas de programação