DFPSR
Uma moderna biblioteca de renderização de software para C ++ 14 usando o SSE/NEON criado por David Forsgren Piuva. Se você está procurando o mais recente modismo mainstream, procure em outro lugar. Esta é uma biblioteca para software de qualidade que deve ser desenvolvida ao longo de várias décadas e sobreviver aos seus netos com manutenção mínima. Assim como criar seu legado em pedra, é preciso mais esforço para dominar a habilidade, mas fornece um resultado mais robusto ao não confiar em uma biblioteca distante. Experiência máxima do usuário e dependência mínima do sistema.
Antecedentes do criador
DXOMARK Recorde mundial na estabilização de vídeo digital da indústria móvel. Trabalhou com a visão robótica crítica de segurança para o controle de tráfego civil do aeroporto. Realizou palestras em otimização em diferentes empresas nas indústrias móveis, médicas e de jogos. Trabalhou com otimizações na GPU, CPU, DSP, ISP, FPGA e ASIC.
A otimização precisa de boas ferramentas para economizar seu tempo
A parte mais importante sobre a otimização do código é compreender algoritmos altos e limitações de hardware baixo, porque você não pode permitir que um cientista projete o algoritmo e um programador otimize -o sem espaço para alterações no assembler manuscrito (o erro mais comum). O design do algoritmo não é feito até que você tenha uma boa troca entre qualidade e desempenho com todas as otimizações. A economia de tempo ao custo da qualidade em um só lugar pode ser compensada aumentando a qualidade a um custo menor em outro lugar para aumentar a velocidade e a qualidade. Quanto mais rápido você puder criar uma vetorização quase ideal de um algoritmo, mais rápido você pode iterar o processo de design. Pense no que você está realmente se aproximando. Seu objetivo é desenhar o maior número possível de polígonos perfeitamente heterossexuais, ou é o objetivo de aproximar uma forma complexa do mundo real usando alguma técnica?
O site oficial: Dawoodoz.com
Como pode parecer seus jogos usando a renderização isométrica da CPU

Luz dinâmica em tempo real com sombras fundidas à base de profundidade e mapeamento normal a 453 quadros por segundo em 800x600 pixels em execução na CPU. Resoluções mais altas quebrariam o estilo retrô e realmente pareciam piores, mas resta muito tempo para a lógica do jogo e efeitos adicionais. Ao pré-renderizar modelos 3D para imagens difusas, normais e de altura, a leitura dos dados é muito mais eficiente em cache nas CPUs modernas do que usar uma perspectiva livre. Isso também permite ter mais triângulos do que pixels na tela e fazer atualizações passivas de geometria estática. Modelos 3D de baixo detalhado são usados para lançar sombras dinâmicas.
A renderização 3D tradicional com polígonos também é suportada

A renderização em 3D não é tão rápida quanto a renderização 2D ou isométrica na CPU, mas geralmente atinge 60 Hz em pixels de 1920x1080 para gráficos com pouca linha. Para um nível de detalhe mais alto e mais recursos, é recomendável copiar e modificar o pipeline de renderização para torná -lo codificado apenas para os recursos que você deseja e, em seguida, simplifique a matemática para o seu mecanismo de renderização específico, conforme feito para o exemplo de sandbox, onde apenas as cores de vértices são necessárias para pequenos triângulos sem perspectiva, para que as cores possam ser calculadas por valores de cor em vez de integrantes.
Por que usar um renderizador de software de código aberto quando as GPUs são tão rápidas?
- A robustez usando um renderizador de software provavelmente não arruinará seu sistema ao cometer um erro, ao contrário das APIs gráficas para a GPU que são propensas a telas azuis.
- O determinismo , se funcionou em um computador, provavelmente funcionará o mesmo em outro computador com pequenas diferenças entre os sistemas operacionais. O OpenGL, no entanto, possui zero recursos restantes se você remover tudo o que tiver um bug em qualquer implementação do driver.
- Opeuta baixa quando você deseja uma baixa resolução para o estilo visual ou a visão robótica, é melhor mantê -la mínima com um renderizador de software estaticamente vinculado quando a GPU seria mais lenta.
- Fácil depuração Quando todos os dados são processados em um renderizador de software, é muito mais fácil ver o que deu errado durante a depuração.
- Fácil de modificar, não há limites de hardware além dos ciclos e memória da CPU, para que você possa modificar todo o pipeline de renderização copiando e colando código.
- Pixel exato 2D em vez de fazer soluções alternativas sobre polígonos, um renderizador de software permite que você trabalhe com pixels inteiros para começar.
Por que usar este renderizador de software?
- Dependências mínimas do sistema Tudo relacionado a uma API específico do sistema é colocado em um módulo de wrapper separado que integra o mínimo de recursos essenciais que devem ser fáceis de integrar em futuros sistemas operacionais. Ao contrário de outros renderizadores de software, este não requer drivers gráficos, porque você pode obter o mesmo desempenho usando o multi-threading fazendo o upload da tela em um thread em segundo plano quando a maioria dos núcleos estiver ociosa de qualquer maneira.
- Sem binários, toda a biblioteca é compilada automaticamente do código -fonte. Até o sistema de construção está se compilando antes de construir seu projeto. Isso garante que ninguém no futuro precise reverter os binários do engenheiro do século ao tentar construir seu programa, e também o torna muito mais seguro contra malware quando tudo pode ser inspecionado em código legível.
- A ligação estática de toda a biblioteca está vinculada estaticamente ao seu programa, como se você tivesse escrito o código sozinho. Somente as APIs do sistema principal que sobreviveram por décadas são consideradas dependências, sem drivers de GPU, sem camadas de mídia externa. Tudo, desde como codificar caracteres unicode e renderizar fontes até como um polígono é rasterizado contra um buffer de profundidade no seu programa C ++ compilado para obter a máxima confiabilidade e determinismo. O sistema de construção permite vincular estaticamente as bibliotecas padrão C ++, quando possível.
- Crie seu legado Faça software que as gerações futuras possam portar, compilar e executar de maneira nativamente sem a necessidade de emuladores ou engenharia reversa de drivers de gráficos proprietários.
Recursos nesta biblioteca
- Sistema de construção C ++ totalmente automático, não há mais listas longas de arquivos de origem em seu projeto. O sistema de construção incluído encontrará cabeçalhos incluídos e seu nome correspondente de arquivos de origem automaticamente. Apenas diga para rastejar do Main e deixar o REST automaticamente descobrir o resto. Os back -ends diferentes para as bibliotecas são tratados incluindo o cabeçalho do projeto da biblioteca, dizendo qual back -end para cada plataforma. As somas de verificação são usadas para construir apenas o que mudou; portanto, não há necessidade de criar uma biblioteca estática para partes do seu código.
- Desenho 2D Pixel Exacto Standard Draw chama para linhas, retângulos, cópia de imagem sólida, desenho de imagem filtrada alfa, desenho em buffer de profundidade e desenho de estêncil.
- Renderização em 3D aproximadamente equivalente a Direct3d 7 com amostragem de textura bilinear, mipMapping, Lightmaps e filtragem alfa quando usada fora da caixa, mas pode ser modificada para ser mais como 3D direta 9 se você aplicar sombreamento às texturas (pode usar o SIMD com leitura múltipla e ser agendada com base na distância de visualização).
- Sistema de oclusão A coleta de tarefas de renderização para t-threading também contém uma grade de oclusão, onde as formas de oclusão podem ser desenhadas para pular desenho de triângulos, objeto ou grupos inteiros se o seu mecanismo implementar uma fase ampla para testes de abate e oclusão. Essa oclusão totalmente dinâmica pode ser combinada com otimizações estáticas para jogos específicos usando informações sobre quais regiões podem ser vistas a partir de cada localização da câmera.
- O recorte distante opcional , porque essa API de gráficos usa apenas buffers de profundidade de ponto flutuante para perspectiva, não há necessidade de normalizar os valores de profundidade para qualquer representação baseada em número inteiro. Isso permite selecionar uma distância infinita de clipe distante ao criar sua câmera, se você puder pagar a cena inteira de uma só vez.
- Camada de mídia camada de mídia de plataforma cruzada projetada para robustez. ALSA e WINMM O som de apoio para controle total sobre a mistura de som, sem precisar chamar nada específico do sistema. O gerenciamento de janelas usa multi-threading para fazer upload da tela, para que você não precise de drivers gráficos da GPU e dependências pesadas apenas para fazer o upload do resultado. Usa uma janela sem fronteiras para tela cheia, para que você possa acessar facilmente outros programas se receber um e-mail importante ou uma mensagem instantânea em segundo plano. O upscaling é feito na CPU para trabalhar com qualquer resolução de tela sem depender de drivers de gráficos que podem dar a pixels a interpolação errada ou nem existe. As camadas de mídia mais antigas projetadas para exibições CTR podem causar erros de frequência fora do alcance quando nenhum drivers de gráficos é instalado e a tela não aceita a seleção arbitrária de resolução. Usa um ícone de cursor invisível para ocultar o mouse, para que um programa de travamento não tire o cursor ao tentar matar o processo.
- Framework de interface do usuário gráfico Carregar uma interface visual na sua janela usando uma única linha de código lendo um arquivo de layout ou string. Obtenha alças genéricas para componentes usando nomes ou uma combinação de nome e índice. Adicione eventos anexando funções Lambda aos retornos de chamada de componentes e janelas.
- Os temporizadores recebem os segundos de dupla precisão desde a primeira chamada para o temporizador, para que você não precise se preocupar com bugs da meia -noite quando a hora do dia for redefinida.
- Camada de abstração SIMD Use o Simd.h para gerar automaticamente o Intrinsics SSE, AVX e Neon altamente eficientes da sintaxe matemática totalmente legível. Your vectorized code will look like a reference implementation and compiling for an unknown target architecture will generate scalar operations that can still give a performance boost by writing your algorithm with basic operations that are most often supported directly in CPU hardware, accessing memory aligned with cache lines, keeping the instruction window packed with tasks, and making it very easy for a compiler's auto-vectorization if something similar with a different name exists in the future.
- Ponteiros seguros usam o SafePointer.h para capturar mais erros, dizendo ao seu ponteiro em que parte de uma alocação pode funcionar. Não deixa a sobrecarga na versão de liberação, para que você sempre possa substituir seu ponteiro cru pelo SafePointer e saber que você receberá uma mensagem de erro informativa com o nome do ponteiro e as informações detalhadas quando algo ruim acontecer.
- As strings usam UTF-32 para armazenar caracteres na memória para garantir que todos os algoritmos funcionem com caracteres não latinos (compatíveis com os literais de string u "". Economizando os arquivos padrão no UTF-8 (armazenamento compacto) com o BOM (dizendo explicitamente qual formato é usado) e terminações de linha CR LF (para que os arquivos de texto codificados em qualquer lugar possam ser lidos em todos os lugares). Usa buffers de memória compartilhados automaticamente para permitir a divisão em uma lista de strings sem inundar a pilha com pequenas alocações.
- Buffers Todos os arquivos são salvos e carregados através de objetos buffers. Isso garante que todos os formatos de arquivo que você projete precisem se preocupar apenas com como codificar os bytes, os testes de regressão serão fáceis, não envolvendo efeitos colaterais externos do sistema de arquivos e qualquer arquivo pode ser agrupado por conta própria usando o equivalente do buffer de uma função de salvamento.
- Gerenciamento de arquivos aproximadamente equivalente a STD :: FileSystem de C ++ 17, mas funciona com C ++ 14, usa a mesma string e os tipos de readablestring em todas as plataformas e pode corrigir automaticamente os separadores de pastas entre / (POSIX) e (MS-Windows).
- O gerenciamento de processos pode iniciar outros aplicativos e acompanhar seu status, para que você possa chamar um aplicativo como uma função escrevendo o resultado dos arquivos.
Resumo das licenças
Esta biblioteca usa principalmente a licença de código aberto do ZLIB, mas também inclui a biblioteca de imagens STB para salvar e carregar imagens, que possui uma licença dupla permissiva (MIT / Unlicense). Como a biblioteca de imagens do STB pode ser usada como domínio público, ela não tem nenhum efeito legal no uso da biblioteca como um todo sob a licença de código aberto do ZLIB. Todos incluíram o código-fonte com todas as suas licenças permitem o uso comercial e não comercial, incluindo modificação não revelada do código-fonte. Se você não estiver redistribuindo o código -fonte, não precisará dizer a ninguém que use esta biblioteca, porque um endosso insincero não tem valor.
Ainda é uma versão beta pública
O tema, a GUI, a fonte e as APIs sonoras ainda estão sob desenvolvimento ativo e podem ter mudanças significativas antes que uma versão estável 1.0 esteja pronta, porque algum código é apenas um espaço reservado primitivo até que a implementação avançada possa substituí -lo, e é preciso tentar realmente usar a biblioteca antes que os problemas de usabilidade se tornem óbvios. APIs de buffer, arquivo, imagem, desenho, filtro, string e tempo, no entanto, já estão estáveis. Você pode optar por manter uma versão específica para cada novo projeto, manter -se atualizado com as alterações mais recentes ou aguardar a versão 1.0 estável.
Como você pode ajudar
- Porta para Macintosh ou Wayland usando os mesmos princípios de dependência mínima.
- Teste esta versão beta e forneça feedback sobre o design antes que a versão 1.0 seja lançada.
- Crie diferentes tipos de mecanismos de jogo com ferramentas de código aberto.
Hardware da CPU suportado:
- Intel/AMD usando o SSE2 Intrinsics e Extensões Opcionais.
- Braço usando intrínsecos de neon .
- Arquiteturas desconhecidas da CPU, sem a vetorização SIMD como uma solução de fallback.
Plataformas:
- Linux , testado em hortelã, companheiro, manjaro, Ubuntu, Raspberrypi OS, Raspbian (Buster ou posterior). Linux Mint precisa dos cabeçalhos do compilador e X11, então execute "sudo apt install g ++" e "sudo apt install libx11-dev" antes de compilar. Atualmente, apoiando o X11 e Wayland está planejado para versões futuras.
- O Microsoft Windows , mas mais lento do que no Linux, porque o Windows possui muitos processos em segundo plano e um gerenciamento de rosqueamento e memória mais lentos.
Também pode funcionar em:
- O BSD e o Solaris possuem código direcionados às plataformas no Fileapi.cpp para obter a pasta de aplicativos, mas provavelmente existem alguns aplicativos ausentes para a execução do script de compilação. Os sistemas futuros compatíveis com POSIX devem ter apenas algumas peculiaridades para resolver se tiver um servidor X11.
- O Big-Endian é apoiado em teoria se permitir a macro dsr_big_endian globalmente, mas isso nunca foi testado devido a dificuldades em direcionar um sistema tão antigo com compiladores modernos.
Ainda não portado para:
- O Macintosh não usa mais o X11, por isso exigirá algum esforço de porção. O Macintosh não possui um link simbólico para o binário do processo em execução, para que recuasse no diretório atual ao solicitar a pasta de aplicativos.
Não vai segmentar:
- Telefones celulares. Porque as constantes mudanças quebrando a compatibilidade com versões anteriores nas plataformas móveis derrotariam o objetivo de usar uma estrutura de longo prazo. As plataformas móveis requerem compiladores C ++ personalizados, acesso a processadores de sinais, rotação da tela, economia de bateria, sabendo quando exibir o teclado virtual, as permissões de segurança, forçadas a tela cheia ... tentar fazer as duas coisas ao mesmo tempo acabariam com os compromissos de design em ambas as extremidades, como o Microsoft Windows 8 ou a tela de bloqueio de Ubuntu, para que seja melhor que seja melhor que seja melhor que seja melhor que seriam os melhores.
- Frontends da Web. Esse invólucro sobre essa biblioteca não seria capaz de obter o poder do Intrinsics SIMD para definir seus próprios filtros de imagem, para que você seja melhor visando uma linguagem de sombreamento da GPU do navegador, mais adequado para script dinâmico.