Saturday, July 05, 2014

:: Gravar sessão de game no PC com baixo impacto na performance ::

EDITADO em 08/07/2014 para inserção de novas infos

E não é que um sábado chuvoso pode ser proveitoso, intelectualmente falando?

Boa parte dos gamers curte gravar suas sessões de jogatina. Seja pra analisar como foi seu desempenho e tentar melhorar (usualmente quem joga competitivamente faz isso), pra mostrar alguma jogada legal para os amigos, ou mesmo pra se exibir (tem muito nego que faz isso no youtube).

Muito antigamente, a gente ligava o videogame num video cassete e gravava ahahahahahah Sim, fiz um bom tanto disso. Hoje em dia, com as novas tecnologias, temos as seguintes possibilidades (talvez eu não liste todas, mas...):
  1. Liga o videogame/PC num dispositivo de gravação (ex: Avermedia Live Gamer Portable ou Elgato Game Capture)
  2. Faz a gravação usando uma placa de captura de video
  3. Usa um software de captura de video no próprio PC onde se está jogando (nesse caso os videogames dançam)
  4. Faz streaming da jogatina para um servidor e a gravação fica por conta desse servidor.
  5. Usa uma câmera para filmar a tela da TV/Monitor.
As opções #1 e #2 são boas em termos de performance, mas são caras, ainda mais em se tratando de Brasil. A #5 é uma boa opção por não afetar a performance do jogo, porém a qualidade do audio e video pode ficar comprometida, bem como, dependendo do dispositivo usado (camera digital ou celular), pode ficar complicado no que diz respeito a espaço para armazenamento. A opção #3 é barata, porém afeta a performance do jogo, pois acaba havendo queda de FPS (frames por segundo). A opção #4 fica, em termos de impacto de performance, abaixo das #1 e #2, mas acima da #3.

Porém, não é qualquer um que consegue ter um link de internet decente para fazer streaming das suas sessões de game com uma qualidade decente e, AINDA POR CIMA, conseguir jogar sem que esse streaming gere lag na sua conexão.

Pois bem, há um bom tempo eu uso o OBS (Open Broadcast Software) para gravar minhas sessões de game (usualmente SF4). Como explicado acima, ficava na #3. Mas eu queria poder gravar minha sessões sem afetar tanto assim o jogo. A #4, pra mim, é totalmente inviável, visto que a Oi/Velox, na minha cidade, me fornece apenas 512kbps de upload. Um lixo!

O OBS pode fazer streaming para serviços como TwitchTV (entre outros), mas né... meu link... Então eu pensei "Será que consigo fazer o OBS mandar o stream do jogo para um servidor LOCAL, e esse servidor gravaria a jogatina?" Dei uma pesquisa HOJE e descobri que existe um módulo para o NGINX que faz essa magia. Então a coisa fica assim:

  1. OBS pega o audio e video do jogo, gera um stream e manda para o NGINX
  2. NGINX pega o stream e grava em um arquivo de video (FLV)
Notar que o impacto, na parte de I/O (Entrada/Saída), ou seja, a gravação do video em arquivo, fica no servidor.

Então para isso precisamos de dois equipamentos: o PC onde se vai jogar e um outro que vai fazer a gravação (PC, notebook, servidor, etc)

No meu teste utilizei o Media Server que tenho em casa, um SheevaPlug (processador ARM 1.2Ghz e apenas 512MB de memória, bem fraquinho) rodando Debian. Então rodei um replay da ultima partida de SSF4AE2012 que eu tinha e mandei o OBS fazer o streaming. Depois da partida terminada, parei o OBS e fui olhar no servidor. Tinha um arquivo FLV gravado. Rodei esse arquivo com o VLC e, para minha grande surpresa, lá estava a partida perfeitinha, em 1280x720@60fps, do jeito que eu tinha configurado no OBS.

Edit: fiz uns testes mais sérios pra ver o impacto de performance. Rodei o SSF4AE2014 (PC) sem estar gravando ou streaming.

  1. Entrei no Benchmark do jogo e o resultado ficou mais ou menos em 221fps. Fiz esse teste várias vezes seguidas
  2. Fiz o Benchmark de novo, só que agora mandando o stream pro meu servidorzinho. A perda foi de cerca de 10fps. Fiz esse teste várias vezes
  3. Fiz o Benchmark mais umas vezes, agora deixando o OBS gravar o video direto no meu PC. A perda foi de quase 20fps. Fiz esse teste várias vezes.
Ou seja, acho que é viável o uso dessa solução (OBS+Nginx).

Edit 2: Meu amigo Rain falou das tecnologias das placas de video atuais em que dá pra fazer a própria VGA fazer o encoding de video, liberando assim a CPU da máquina, o que deve diminuir ainda mais a perda de FPS do jogo. Porém como minha VGA é meio velha (AMD Radeon HD 5850), ela não suporta essa funcionalidade. Então, na minha atual conjuntura, o jeito é usar OBS+Nginx mesmo.

Edit 3: Como minha VGA é velha e não tem suporte ao que citei logo acima, insisti nas pesquisas. Tentei achar um jeito de conseguir diminuir ainda mais o impacto na performance dos games enquanto estiver fazendo streaming pro meu servidor. E o "pior" é que encontrei. Descobri a funcionalidade QUICK SYNC, presente em processadores Intel mais novos (não, não precisa ser da última geração). Meu processador é um Intel Core i7-4770. Dei uma lida rápida nos specs dele e sim, possui suporte a Quick Sync. O que isso faz? Utiliza a GPU (sim, processador gráfico) que esses processadores da Intel tem internamente para fazer processamento de video, encoding, etc. Além de ter um processador com suporte a Quick Sync, a Motherboard (Placa-mãe) precisa ter uma saída de vídeo. Então os passos para o habilitar são relativamente simples:


  1. Na BIOS do computador, habilitar a iGPU ou placa de video onboard
  2. Baixar e instalar o driver atualizado para a placa de video onboard (isso deve requerer um reboot do PC)
  3. Habilitar o uso dessa placa nas configurações de video do Windows. Não é preciso ter um monitor conectado à saída de video onboard do PC. Basta habilitar esse display.
  4. Agora abra o OBS, vá nos Settings (configurações) e na área de Encoding deve liberar a opção para marcar Quick Sync.
Feito, com isso o encoding será feito pela GPU do seu processador, liberando "mais gás" pra CPU. Ah sim, enquanto não habilitamos isso, essa iGPU fica inativa por toda a eternidade ;)

Complementando, ontem fiz novos testes, diferente. Instalei o FRAPS no meu PC apenas para que ele fizesse o benchmark dos FPS enquanto eu rodava um replay no SSF4AE (lembrando que o jogo roda a 60fps).

  1. Rodei o replay, mandei o Fraps fazer o benchmark por 60s, sem o OBS fazer streaming. Resultado: 60fps no jogo
  2. Rodei o mesmo replay, Fraps fazendo benchmark por 60s, com o OBS fazendo streaming para meu server e encoding via Quick Sync. Resultado: 60fps no jogo
Então agora, criançada... vou gravar MUITA SESSÃO DE GAMES hehehehehehe

Ah sim, a dica de como fazer a magia acontecer eu peguei aqui: https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.50/

"Esses negros maravilhosos!" (ROBERTO, Luis. 2014)

9 comments:

Badchrono said...

Não seria melhor usar o

Dxtory?

Yucatan Costa said...

Badchrono, o Dxtory é uma opção sim, mas não sei se ele é tão leve quanto o OBS. Faz tempo que testei o dxtory, então não sei como está hoje. Com o Dxtory posso mandar o stream para um server da minha rede local? Tem como dizer pra ele usar a GPU pra fazer o encoding?

Sem falar que quando testei, achei o dxtory meio chatinho pra configurar e deixar redondinho. O OBS é muito barbada.

Badchrono said...

No Dxtory tem uma opção de qualidade de vídeo, eu por exemplo consigo jogar o Street AE 2012 com tela cheia e gravar em 720p que é a resolução que uso no jogo, sendo que o meu processador é bem fraquinho para os padrões de hoje sem dar lag no pc.

Veja este tutorial, existem várias opções ótimas nele.

https://www.youtube.com/watch?v=4w9WmHy8M7U

Badchrono said...

Outra coisa, eu achei ele bem mais leve que o OBS, mas como te disse, meu processador é bem fraco para multitarefas.

Sobre usar a GPU para encoding eu não sei te falar.

Yucatan Costa said...

Beleza, em que resolução tu roda o game?

Eu jogo em Full HD (1920x1080) e mando o OBS gravar em 720p. Só não mando gravar em 1080p pq daí os arquivos ficam BEEEEM grandes e não precisa de tanta qualidade assim pra mandar pro youtube né.

Badchrono said...

Apesar de rodar bem em FullHD, prefiro deixar o jogo em 720p mesmo, quando gravo não tenho problemas, inclusive já gravei algumas jogatinas off assim

Yucatan Costa said...

Pois é, com meu hardware e essa mandinga toda do OBS+Nginx, posso gravar as partidas offline tranquilamente agora :D

Badchrono said...

Qual é a configuração do seu PC?

Yucatan Costa said...

CPU = Intel Core i7-4470 @3.4GHz
VGA = AMD Radeon HD 5850 (um dos pontos fracos)
Mem = 8GB DDR3 @1600Mhz
HDs = Sata2 de 1TB, 320GB e 250GB (tb um ponto fraco)
Monitor = 2 SyncMaster P2470HN (24")