Tuturial para usar Triple Buffering com Directx

yaesir

know-it-all Member
Registrado
Tuturial para usar Triple Buffering com Directx

Esse tutorial vai deixar você usar o triple buffering com o directx, coisa que normalmente só é possível em opengl.

explicação sobre tirada da wikipedia(traduzida rapidamente):

geralmente monitores são atualizados continuadamente e em antigos monitores crt, um pequeno atraso acontece entre atualizar a menor linha horizontal do monitor até a linha mais alta. Este atraso que continua a existir em equipamentos mais modernos, dá uma oportunidade para que a placa de video altere o conteudo de um framebuffer sem erros visiveis, como gráficos parcialmente desenhados , ou que uma parte superior do monitor mostre um frame a frente e a parte de baixo mostre outro frame (conhecido como tearing).

Agora triple buffering :

outro metodo de triple buffering involve sincronizar o frame rate do monitor, e simplesmente usar o terceiro buffer como um metodo de dar espaço para a demanda variavel no tanto de gráficos desenhados. Isto é, usar o buffer no sentido real onde um buffer age como um reservatorio.
Tal metodo dá um Fps menos variavel do que o normal.

Triple buffering inplica em três buffers, mas o metodo pode ser extendido para quaisquer numero de buffers forem necessarios para a aplicação. Geralmente, não há vantagem alguma em usar mais do que três buffers.

Vantagens do triple buffering:

Se o sistema tem três buffers A, B e c, ele não precisa esperar para trocar de buffers. Ele pode mostrar o buffer B enquanto está montando a imagem no buffer A. Quando ele acabar de renderizar a imagem em A, ele pode começar a renderizar em C imediatamente. Quando o monitor tiver um branco vertical, ele pode mostar o buffer A e fazer o buffer B disponivel para reuso.

Agora a explicação mais simples, do meu jeito:

Vsync impede que você tenha fps mais alto do que o seu monitor pode mostrar, assim você não ve certas falhas como tearing (explicado acima).
Triple buffering, permite que sua placa tenha digamos "frames reservas" e assim o seu fps não irá cair bruscamente.

Porém vsync+triple buffering só funciona em opengl, devido a uma limitação na api do directx.

AGORA UM PORÉM:

Triple buffering parece a solução perfeita para diminuir fps baixo, porém não é de graça. Ativando triple buffering também significa que você precisará de 50% a mais de espaço para buffers. Dentro de certas condições, ele também pode NEGATIVAMENTE impactar a sua experiencia no jogo. Um exemplo simples pode ilustrar este problema em potencial. Vamos dizer que você está rodando um jogo à 1600x1200(resolução alta). Cada pixel precisa de 32bits para guardar informação, 1600x1200x32=61.440.000bits, convertendo para megabytes, dá igual à 7.32mb, para usar double buffering, você precisará de 14.64mb de memória de video, para usar triple buffering, ele requer 21.96mb de memória de video. Ok, é só 21.96mb, não é muito, placas modernas tem geralmente 256mb. PARECE que memoria não seria um problema... porém se nos habilitarmos 4xFSAA, o numero aumenta muito rapido. Com 4xAA há quatro vezes mais pixels sendo desenhados, então você precisa multiplicar 21.96mbx4 o que resulta em 87.84mb. É mais que um terço da ram da sua vga. Se um jogo precisa de 200mb para texturas, light maps, bump maps, normal maps, etc então você vai ter um gameplay muito ruim, com várias pausas devido ao acesso constante com o hd. Isso é apenas algo para você lembrar, que se você ver que o jogo está tendo vários acessos ao hd, pode ser um indicio de que triple buffering está ocupando memoria demais, e é melho desabilita-lo



chega de texto vamo pra parte pratica:

PUXE O .NET (http://www.microsoft.com/downloads/...E3-F589-4842-8157-034D1E7CF3A3&displaylang=en)

puxe o dxtweaker: http://www.nonatainment.de/web/DirectXTweaker/Download/tabid/58/Default.aspx

não se esqueça de pegar a atualização do .net




Extraia o dxtweaker para uma pasta qualquer (Recomendo uma pasta onde você deixa os seus programas) e rode o DXTControl.exe, uma janela irá se abrir:



clique em NEW... depois na caixa name digite o nome do jogo, marque active ao lado e selecione o EXECUTAVEL do jogo em path como na figura a seguir:




clique em modules to load, marque preset changer e clique em module properties for preset changer na caixa COUNT digite 2 como a seguir:



pronto agora é só clicar em start e o jogo deve abrir.
toda vez que você quiser usar o triple buffering ou outra opção que existe no dxtweaker você deve iniciar o dxtweaker e clicar em start.

é isso, deve tá cheio de erros esse tutorial mas depois eu do uma revisada.
OBS: eu achei que aqui seria o melhor lugar para colocar isso, se tiver errado o forum, algum moderador troque-o de lugar, mas acho que como é para jogos aqui seria melhor.

tirado e traduzido e feito por:

http://www.ocworkbench.com/2006/articles/DXtweaker/ (onde eu encontrei originalmente)
http://en.wikipedia.org/ (explicações sobre vsync e triple buffering)


diferença de fps no FEAR, on e off triple buffering, ( o que tem fps menores é o off)
 

Attachments

  • fear_tb_off.jpg
    fear_tb_off.jpg
    115.8 KB · Visitas: 348
  • fear_tb_on.jpg
    fear_tb_on.jpg
    119.2 KB · Visitas: 342
aqui na minha VGA, nos drivers tem o triple buffering, esta como OFF.

Se eu ativar vai ser a mesma coisa? Vou ganhar mais performace ?

Edit:

Testes com Triple Buffering
CS Source: AA 4x AF 4x HDR ON TUDO NO MAXIMO.

com TB On:
1º teste: 104
2º teste: 102.95

Com TB Off:
1º Teste: 104.05
2º Teste: 102.88
 
DOOM 3
Rodando em 1280x1024 / AA2x / AF 4x
Programa ON:
Timedemo FPS: 55.0

Programa OFF:
Timedemo FPS: 57.1

Configurei como estava ali... lol ?
 
gargula, o triple buffering com vsync já funciona em opengl que é a engine dos jogos que você testou, testa em outro jogo (oblivion e titan quest, por ex) que seja directx vale lembrar que a GRANDE maioria dos jogos são directx, exceto o doom3, quake4, prey.

E triple buffering não é para aumentar drasticamente os fps, é mais para ficar estavel, como mostra no fear, o cara teve fps altos mais constantes do que antes.
 
O Ruim é que estou sem nada de jogo...
=/

vou testar com GTA SA dai eu posto aqui... vou editar esse post.

Sem diferença no GTA SA.
 
Tuturial para usar Triple Buffering com Directx

Triple buffering parece a solução perfeita para diminuir fps baixo, porém não é de graça. Ativando triple buffering também significa que você precisará de 50% a mais de espaço para buffers. Dentro de certas condições, ele também pode NEGATIVAMENTE impactar a sua experiencia no jogo. Um exemplo simples pode ilustrar este problema em potencial. Vamos dizer que você está rodando um jogo à 1600x1200(resolução alta). Cada pixel precisa de 32bits para guardar informação, 1600x1200x32=61.440.000bits, convertendo para megabytes, dá igual à 7.32mb, para usar double buffering, você precisará de 14.64mb de memória de video, para usar triple buffering, ele requer 21.96mb de memória de video. Ok, é só 21.96mb, não é muito, placas modernas tem geralmente 256mb. PARECE que memoria não seria um problema... porém se nos habilitarmos 4xFSAA, o numero aumenta muito rapido. Com 4xAA há quatro vezes mais pixels sendo desenhados, então você precisa multiplicar 21.96mbx4 o que resulta em 87.84mb. É mais que um terço da ram da sua vga. Se um jogo precisa de 200mb para texturas, light maps, bump maps, normal maps, etc então você vai ter um gameplay muito ruim, com várias pausas devido ao acesso constante com o hd. Isso é apenas algo para você lembrar, que se você ver que o jogo está tendo vários acessos ao hd, pode ser um indicio de que triple buffering está ocupando memoria demais, e é melho desabilita-lo

Como que é certinho esse calculo?? Digamos que jogo o CS:S no maximo, com tudo no max... como ficaria o calculo pra ve quantos MB é usado no jogo? Ou quais modificações tenho que multiplicar? Anti alising x resolução x AF x bits... hehehe, nao sei, explica ai...:thumbs_up
 
o calculo que foi feito é do display de pixels, se você der uma olhada foi suposto que o jogo use 200mb para o resto (nomal maps, paralax mapping, etc) exatamente, exatamente quanto que ocupa você teria que dar uma procurada a mais.

Se você perceber eu juntei uns tutoriais expliquei como é feito, algumas partes eu apenas traduzi, mas outras foi eu que escrevi tudo.
 
Bom, baixei o demo do FEAR MP somente pra ver se isso é verdade que muda o FPS.
Cheguei a conclusao que nao mudou em nada! Alias... mudou uns 4FPS a mais..

FEAR Rodou aqui em 1024x768, AA OFF, AF 4x, Sombras no Medium, Efeitos no Medium, Aquele esqueminha de sombras desligado.
O resto ta tudo no maximo.

Teste 1
Programa nao estava rodando.
Repetido os mesmos testes 2x.



Teste 2
Programa estava rodando, tudo configurado certo como estava na SS.
Repedito os mesmos testes 2x

 
84.21

ele é antigo, mas funciona muito bem :thumbs_up
 
O TB na verdade serve pra resolver aquele problema de games onde vc usa o vsync ... e vamos supor q o refresh do seu monitor seja 60hz ... e o game fica em 60 ... e quando cai de 55 ... vai pra 30 direto ( metade do refresh ) e fica cravado em 30 !

Isso incomoda bastante ....

Lembrando q o uso do TB eh aconselhavel somente em placas de video com muita memoria ... pq ele simplesmente DOBRA o uso de memoria da vga ...

[]'s
 
O TB na verdade serve pra resolver aquele problema de games onde vc usa o vsync ... e vamos supor q o refresh do seu monitor seja 60hz ... e o game fica em 60 ... e quando cai de 55 ... vai pra 30 direto ( metade do refresh ) e fica cravado em 30 !

Isso incomoda bastante ....

Lembrando q o uso do TB eh aconselhavel somente em placas de video com muita memoria ... pq ele simplesmente DOBRA o uso de memoria da vga ...

[]'s

exatamente, é isso que esse tweak tenta fazer, colocar o triple buffering junto com o vsync em directx.
 
Muito bom o tutorial :yes:
Ja baixei tudo, assim q minha plava de video voltar vou fazer os testes xD
 
só uma coisa, no steam usem o steam.exe e segundo o forum do dxtweaker, qualquer aplicação que ele rodar (hl2,counter, dod,etc) vai rodar com triple buffering, só não se esqueça de habilitar o vsync.

Eu não estou com o counter instalado aqui, depois vou instalar e rodar o teste
 
Só uns detalhezinhos a serem explicados melhor:

O vsync não somente impede que vc não tenha FPS maior que a taxa de atualização do monitor. Ele sincroniza a renderização com a exibição pelo monitor. Mas se vc tiver renderizando menos quadros por segundo do que a taxa de atualização do seu monitor ele faz uma aproximação do tipo: quadro renderizado, 2 atualizadas no monitor com o mesmo quadro, proximo quadro renderizado, ...

Mas oq q a GPU fica fazendo enquanto o monitor atualiza a tela ? Se vc não estiver usando o triple buffer, a resposta é: atoa, fazendo porra nenhuma. O triple buffer funciona, como o dito, como uma reserva. A placa de video vai renderizando feito louca, se o monitor não aproveitar ele guarda o quadro no buffer para ser proveitado pelo monitor futuramente. Isso causa um super pequeno lag se vc estiver mandando a VGA renderizar muitos quadros andiantados. Normalmente ela renderiza no maximo 3 quadros adiantados, ou seja, vc pode estar vendo no monitor oq aconteceu 3 quadros atrás no jogo. Mas como 3 quadros em 30 FPS não são porra nenhuma, vc praticamente não sente o lag.

PS: Me desculpe de eu fiquei repetindo oq estava no primeiro post. É que eu vejo melhor as coisas dessa maneira :p
 
Muito bom o tópico. Me esclareceu muita coisa.
 

Users who are viewing this thread

Voltar
Topo