SlideShare uma empresa Scribd logo
1 de 56
Otimização em Unity 
Fazendo seu jogo rodar no PC da sua avó
Otimização em Unity 
Fazendo seu jogo rodar no PC da sua avó 
(e no celular da sua avó)
Como? 
E quais os problemas mais comuns?
Problemas de otimização 
• Abuso de iluminação dinâmica 
• Muitas draw calls 
• Muitos objetos na cena 
• Muitos vértices e polígonos por 
objeto 
• Texturas com resolução muito 
alta 
• Shaders pesados 
• Muitas texturas diferentes 
• Muitas malhas diferentes 
• Tamanho final do build muito 
grande 
• Abuso de features gráficas: 
sombras, pós-processamento 
• Scripts lentos
Nível 1 
Aproveitando o que a Unity tem a oferecer
Lightmaps & Light Probes 
• Lightmaps 
• Cálculo de luz em tempo de projeto 
• Prós 
• Número arbitrário de luzes 
• Permite efeitos complexos 
• Custo baixíssimo em runtime 
• Contras 
• Só funciona em objetos estáticos
Lightmaps & Light Probes 
• Light probes 
• Aproximação de luz global para 
objetos dinâmicos 
• Prós 
• Melhora iluminação em objetos dinâmicos 
• Funciona com shaders padrão e é fácil de 
adicionar nos seus shaders 
• Contras 
• Menos preciso 
• Informação de luz de baixa frequência
Static & Dynamic batching 
• Batching: combina objetos que utilizam mesmo material em uma 
única draw call 
• Static batching 
• Combinação em tempo de projeto para objetos estáticos 
• Dynamic batching 
• Funciona automagicamente em runtime com todos os objetos 
• Porém, tem um custo mais alto de CPU
Occlusion culling 
• Desliga o rendering de objetos que estão totalmente ocludidos por 
outros na cena 
• Requer pré-cálculo e ajuste em tempo de projeto 
• Oclusores precisam ser estáticos, mas ocludidos podem ser dinâmicos
Nível 2 
Otimização na criação de Assets
Cuidados constantes na criação 
• Contagem de polígonos e vértices 
• Personagens e cenário 
• Escolher onde gastar seu “orçamento” 
• Trade-offs entre complexidade na malha e no shader 
• Malha usada na física 
• Resolução de texturas 
• Memória de vídeo é limitada 
• Escolher, de novo, onde gastar o orçamento 
• Tamanho da textura exibida na tela 
• Detalhes de alta frequência são uma ideia perigosa
Complexidade de shaders 
• Considerar o shader certo para cada situação 
• Aquela peça de decoração não precisa de 5 mapas de detalhe + normal + 
specular + cubemap + AO 
• Colocar um target estrito e baixo nos shaders… 
• Por exemplo, Shader Model 2.0 
• Garante um custo baixo 
• Incentiva programação bem otimizada
Shader Model 2.0
Texture Atlas 
• Assets que utilizam o mesmo 
shader podem compartilhar o 
material… 
• Se suas texturas forem combinadas 
em uma só 
• Extremamente importante 
• Static & Dynamic Batching
Reutilização de assets 
• Model & texture once, use everywhere 
• Reduz o custo de criação e de runtime 
• Menos malhas e texturas únicas 
• Menos memória 
• Especialmente relevante em mobile… 
• Reutilização criativa evita a repetição
Nível 3 
Otimização de tamanho de arquivo
Utilizando assets com inteligência 
• Texturas 
• Resolução 
• Compressão 
• Som 
• Sample rate 
• Formato 
• Bitrate 
• Malhas 
• Compressão 
• Remoção de polígonos inúteis 
• Animações 
• Compressão 
• Reutilização 
• Layers 
• Mixing Transforms 
• Animações aditivas
Asset bundles!
Trick Question 
• Qual o tamanho desta textura 
no build? 
• 512x512 
• Diffuse + Normal
Trick Question 
• 2MB?
Trick Question 
• 2MB? 
• 1MB?
Trick Question 
• 2MB? 
• 1MB? 
• 512KB?
Trick Question 
• 2MB? 
• 1MB? 
• 512KB? 
• 256KB?
Trick Question 
• 2MB? 
• 1MB? 
• 512KB? 
• 256KB? 
• 128KB?
Trick Question 
• 2MB? 
• 1MB? 
• 512KB? 
• 256KB? 
• 128KB? 
• 64KB?
Trick Question 
• 2MB? 
• 1MB? 
• 512KB? 
• 256KB? 
• 128KB? 
• 64KB? 
• 32KB?
Trick Question 
• 2MB? 
• 1MB? 
• 512KB? 
• 256KB? 
• 128KB? 
• 64KB? 
• 32KB? 
• 16KB?
Trick Question 
• 2MB? 
• 1MB? 
• 512KB? 
• 256KB? 
• 128KB? 
• 64KB? 
• 32KB? 
• 16KB? 
• 8KB?
Trick Question 
• 2MB? 
• 1MB? 
• 512KB? 
• 256KB? 
• 128KB? 
• 64KB? 
• 32KB? 
• 16KB? 
• 8KB? 
• 4KB?
Trick Question 
• 2MB? 
• 1MB? 
• 512KB? 
• 256KB? 
• 128KB? 
• 64KB? 
• 32KB? 
• 16KB? 
• 8KB? 
• 4KB? 
3,72KB
~20MB
~20MB (quase tudo lightmap)
Nível 4 
Soluções criativas
Sombras dinâmicas?
Sombras dinâmicas? 
Nope, Chuck Testa
Nível 4 
Cuidados com programação
Armadilhas na API da Unity 
• FindObject[OfType] 
• GetComponent[s]InChildren 
• GetComponent 
• renderer.material
Cuidados gerais 
• Não refazer cálculos quando as entradas não mudam 
• Calcule a primeira vez, guarde para consulta 
• Não refazer o mesmo cálculo em vários lugares 
• Centralize o cálculo (por exemplo em um Manager) 
• Distribuir cálculo pesado por vários frames 
• Exemplo: determinar visibilidade entre todos os jogadores 
• Tradeoff: desempenho X precisão 
• Quase sempre a precisão não precisa ser de um frame…
Mais alternativas 
• Desligar objetos “inúteis” para evitar gastar CPU 
• Update, FixedUpdate 
• Física 
• Culling 
• Multithreading para computação pesada 
• !!CUIDADO!! – API da Unity *NÃO* é thread-safe 
• Mas um bom isolamento de código vai longe 
• Exemplo clássico: IA
Perguntas? 
Bruno “Tinnus” Ferreira 
tinnus@gmail.com 
bruno.ferreira@aquiris.com.br

Mais conteúdo relacionado

Mais procurados

Insurance - Classification
Insurance - ClassificationInsurance - Classification
Insurance - ClassificationNeenu Pappachan
 
Futures and Options report on Advance Options Strategies
Futures and Options report on Advance Options StrategiesFutures and Options report on Advance Options Strategies
Futures and Options report on Advance Options StrategiesChandan Pahelwani
 
Accounting and Income Tax Aspects - Demerger
Accounting and Income Tax Aspects - DemergerAccounting and Income Tax Aspects - Demerger
Accounting and Income Tax Aspects - DemergerHU Consultancy
 
Insurance Industry Overview
Insurance Industry OverviewInsurance Industry Overview
Insurance Industry OverviewFloyd Saunders
 
Fire and Marine Insurance Laws
Fire and Marine Insurance LawsFire and Marine Insurance Laws
Fire and Marine Insurance LawsNilendra Kumar
 
Types of insurance By SHAMSIKADALUR MBA
Types of insurance By SHAMSIKADALUR MBATypes of insurance By SHAMSIKADALUR MBA
Types of insurance By SHAMSIKADALUR MBAshamsikadalur
 
Why Life Insurance is Required ?
Why Life Insurance is Required ?Why Life Insurance is Required ?
Why Life Insurance is Required ?Sumit Kulshrestha
 
Equity shares
Equity sharesEquity shares
Equity sharesSharath g
 
Principles of insurance
Principles of insurancePrinciples of insurance
Principles of insuranceDEEPAK MOHAN
 
Insurance law ppt @ bec doms
Insurance law ppt @ bec doms Insurance law ppt @ bec doms
Insurance law ppt @ bec doms Babasab Patil
 
Public & Product Liability Insurance
Public & Product Liability InsurancePublic & Product Liability Insurance
Public & Product Liability InsuranceOptimuminsurance
 

Mais procurados (20)

Insurance - Classification
Insurance - ClassificationInsurance - Classification
Insurance - Classification
 
Duty DrawBack
Duty DrawBackDuty DrawBack
Duty DrawBack
 
Principles of insurance
Principles of insurancePrinciples of insurance
Principles of insurance
 
PPT_Garima Tyagi
PPT_Garima TyagiPPT_Garima Tyagi
PPT_Garima Tyagi
 
Futures and Options report on Advance Options Strategies
Futures and Options report on Advance Options StrategiesFutures and Options report on Advance Options Strategies
Futures and Options report on Advance Options Strategies
 
Insurance in cambodia
Insurance in cambodiaInsurance in cambodia
Insurance in cambodia
 
Insurance | Finance
Insurance | FinanceInsurance | Finance
Insurance | Finance
 
Accounting and Income Tax Aspects - Demerger
Accounting and Income Tax Aspects - DemergerAccounting and Income Tax Aspects - Demerger
Accounting and Income Tax Aspects - Demerger
 
Insurance Industry Overview
Insurance Industry OverviewInsurance Industry Overview
Insurance Industry Overview
 
Income from other sources
Income from other sources Income from other sources
Income from other sources
 
Insuranceact1938 121115213932-phpapp01
Insuranceact1938 121115213932-phpapp01Insuranceact1938 121115213932-phpapp01
Insuranceact1938 121115213932-phpapp01
 
Fire and Marine Insurance Laws
Fire and Marine Insurance LawsFire and Marine Insurance Laws
Fire and Marine Insurance Laws
 
Types of insurance By SHAMSIKADALUR MBA
Types of insurance By SHAMSIKADALUR MBATypes of insurance By SHAMSIKADALUR MBA
Types of insurance By SHAMSIKADALUR MBA
 
Uchôa proposta
Uchôa propostaUchôa proposta
Uchôa proposta
 
Why Life Insurance is Required ?
Why Life Insurance is Required ?Why Life Insurance is Required ?
Why Life Insurance is Required ?
 
Equity shares
Equity sharesEquity shares
Equity shares
 
Principles of insurance
Principles of insurancePrinciples of insurance
Principles of insurance
 
Insurance law ppt @ bec doms
Insurance law ppt @ bec doms Insurance law ppt @ bec doms
Insurance law ppt @ bec doms
 
Reinsurance-FC01.pptx
Reinsurance-FC01.pptxReinsurance-FC01.pptx
Reinsurance-FC01.pptx
 
Public & Product Liability Insurance
Public & Product Liability InsurancePublic & Product Liability Insurance
Public & Product Liability Insurance
 

Semelhante a Otimização em Unity: fazendo seu jogo rodar no PC da sua avó

Construção de jogos com o motor unity3 d
Construção de jogos com o motor unity3 dConstrução de jogos com o motor unity3 d
Construção de jogos com o motor unity3 dEduardo Bonfandini
 
Otimizando fragment shaders
Otimizando fragment shadersOtimizando fragment shaders
Otimizando fragment shadersVinicius Vecchi
 
Fotografia digital basico
Fotografia digital basicoFotografia digital basico
Fotografia digital basicoiturriet
 
Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...
Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...
Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...Thiago Curvelo
 
O que há de novo no Plasma Netbook?
O que há de novo no Plasma Netbook?O que há de novo no Plasma Netbook?
O que há de novo no Plasma Netbook?OpenBossa
 
Minicurso Ruby e Rails (RailsMG UNA)
Minicurso Ruby e Rails (RailsMG UNA)Minicurso Ruby e Rails (RailsMG UNA)
Minicurso Ruby e Rails (RailsMG UNA)Daniel Lopes
 
Aula 003 - Imagem, resolução e formatos
Aula 003 - Imagem, resolução e formatosAula 003 - Imagem, resolução e formatos
Aula 003 - Imagem, resolução e formatosOsmar Rios
 
Adobe After Effects CS6 Classroom in a Book
Adobe After Effects CS6 Classroom in a BookAdobe After Effects CS6 Classroom in a Book
Adobe After Effects CS6 Classroom in a BookSandra Abalde
 
TinyML - IoT e Machine Learning
TinyML -  IoT e Machine LearningTinyML -  IoT e Machine Learning
TinyML - IoT e Machine LearningAlvaro Viebrantz
 
Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?Mozart Diniz
 
Playstation Mobile - Campus Party 2013
Playstation Mobile - Campus Party 2013Playstation Mobile - Campus Party 2013
Playstation Mobile - Campus Party 2013José Farias
 
Criando Placas Eletrônicas com KiCAD (Marcelo Barros)
Criando Placas Eletrônicas com KiCAD (Marcelo Barros)Criando Placas Eletrônicas com KiCAD (Marcelo Barros)
Criando Placas Eletrônicas com KiCAD (Marcelo Barros)Marcelo Barros de Almeida
 
Mobile Game Case: Bboy in Heaven´s Mission
Mobile Game Case: Bboy in Heaven´s MissionMobile Game Case: Bboy in Heaven´s Mission
Mobile Game Case: Bboy in Heaven´s Missionelliando dias
 
Producao Grafica - Fundamentos
Producao Grafica - FundamentosProducao Grafica - Fundamentos
Producao Grafica - Fundamentosdualpixel
 
Portando Aplicações Para a Plataforma Maemo
Portando Aplicações Para a Plataforma MaemoPortando Aplicações Para a Plataforma Maemo
Portando Aplicações Para a Plataforma MaemoEduardo Lima
 
TDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go
TDC2018SP | Trilha Go - Entendendo alocacao de memoria no GoTDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go
TDC2018SP | Trilha Go - Entendendo alocacao de memoria no Gotdc-globalcode
 
[MinhaVida TechDay] NoSQL
[MinhaVida TechDay] NoSQL[MinhaVida TechDay] NoSQL
[MinhaVida TechDay] NoSQLCleber Dantas
 

Semelhante a Otimização em Unity: fazendo seu jogo rodar no PC da sua avó (20)

Construção de jogos com o motor unity3 d
Construção de jogos com o motor unity3 dConstrução de jogos com o motor unity3 d
Construção de jogos com o motor unity3 d
 
Otimizando fragment shaders
Otimizando fragment shadersOtimizando fragment shaders
Otimizando fragment shaders
 
Fotografia digital basico
Fotografia digital basicoFotografia digital basico
Fotografia digital basico
 
Fotografia digital basico
Fotografia digital basicoFotografia digital basico
Fotografia digital basico
 
Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...
Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...
Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...
 
O que há de novo no Plasma Netbook?
O que há de novo no Plasma Netbook?O que há de novo no Plasma Netbook?
O que há de novo no Plasma Netbook?
 
Minicurso Ruby e Rails (RailsMG UNA)
Minicurso Ruby e Rails (RailsMG UNA)Minicurso Ruby e Rails (RailsMG UNA)
Minicurso Ruby e Rails (RailsMG UNA)
 
Aula 003 - Imagem, resolução e formatos
Aula 003 - Imagem, resolução e formatosAula 003 - Imagem, resolução e formatos
Aula 003 - Imagem, resolução e formatos
 
Adobe After Effects CS6 Classroom in a Book
Adobe After Effects CS6 Classroom in a BookAdobe After Effects CS6 Classroom in a Book
Adobe After Effects CS6 Classroom in a Book
 
TinyML - IoT e Machine Learning
TinyML -  IoT e Machine LearningTinyML -  IoT e Machine Learning
TinyML - IoT e Machine Learning
 
Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?Como desenvolver com um sistema com um front-end colossal?
Como desenvolver com um sistema com um front-end colossal?
 
Dicas de otimização para aplicações Qt
Dicas de otimização para aplicações QtDicas de otimização para aplicações Qt
Dicas de otimização para aplicações Qt
 
Playstation Mobile - Campus Party 2013
Playstation Mobile - Campus Party 2013Playstation Mobile - Campus Party 2013
Playstation Mobile - Campus Party 2013
 
Criando Placas Eletrônicas com KiCAD (Marcelo Barros)
Criando Placas Eletrônicas com KiCAD (Marcelo Barros)Criando Placas Eletrônicas com KiCAD (Marcelo Barros)
Criando Placas Eletrônicas com KiCAD (Marcelo Barros)
 
Mobile Game Case: Bboy in Heaven´s Mission
Mobile Game Case: Bboy in Heaven´s MissionMobile Game Case: Bboy in Heaven´s Mission
Mobile Game Case: Bboy in Heaven´s Mission
 
Producao Grafica - Fundamentos
Producao Grafica - FundamentosProducao Grafica - Fundamentos
Producao Grafica - Fundamentos
 
Portando Aplicações Para a Plataforma Maemo
Portando Aplicações Para a Plataforma MaemoPortando Aplicações Para a Plataforma Maemo
Portando Aplicações Para a Plataforma Maemo
 
TDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go
TDC2018SP | Trilha Go - Entendendo alocacao de memoria no GoTDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go
TDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go
 
Gerenciamento de cor - parte 2 da aula
Gerenciamento de cor - parte 2 da aulaGerenciamento de cor - parte 2 da aula
Gerenciamento de cor - parte 2 da aula
 
[MinhaVida TechDay] NoSQL
[MinhaVida TechDay] NoSQL[MinhaVida TechDay] NoSQL
[MinhaVida TechDay] NoSQL
 

Otimização em Unity: fazendo seu jogo rodar no PC da sua avó

  • 1. Otimização em Unity Fazendo seu jogo rodar no PC da sua avó
  • 2. Otimização em Unity Fazendo seu jogo rodar no PC da sua avó (e no celular da sua avó)
  • 3.
  • 4.
  • 5. Como? E quais os problemas mais comuns?
  • 6. Problemas de otimização • Abuso de iluminação dinâmica • Muitas draw calls • Muitos objetos na cena • Muitos vértices e polígonos por objeto • Texturas com resolução muito alta • Shaders pesados • Muitas texturas diferentes • Muitas malhas diferentes • Tamanho final do build muito grande • Abuso de features gráficas: sombras, pós-processamento • Scripts lentos
  • 7. Nível 1 Aproveitando o que a Unity tem a oferecer
  • 8. Lightmaps & Light Probes • Lightmaps • Cálculo de luz em tempo de projeto • Prós • Número arbitrário de luzes • Permite efeitos complexos • Custo baixíssimo em runtime • Contras • Só funciona em objetos estáticos
  • 9. Lightmaps & Light Probes • Light probes • Aproximação de luz global para objetos dinâmicos • Prós • Melhora iluminação em objetos dinâmicos • Funciona com shaders padrão e é fácil de adicionar nos seus shaders • Contras • Menos preciso • Informação de luz de baixa frequência
  • 10.
  • 11. Static & Dynamic batching • Batching: combina objetos que utilizam mesmo material em uma única draw call • Static batching • Combinação em tempo de projeto para objetos estáticos • Dynamic batching • Funciona automagicamente em runtime com todos os objetos • Porém, tem um custo mais alto de CPU
  • 12.
  • 13. Occlusion culling • Desliga o rendering de objetos que estão totalmente ocludidos por outros na cena • Requer pré-cálculo e ajuste em tempo de projeto • Oclusores precisam ser estáticos, mas ocludidos podem ser dinâmicos
  • 14. Nível 2 Otimização na criação de Assets
  • 15. Cuidados constantes na criação • Contagem de polígonos e vértices • Personagens e cenário • Escolher onde gastar seu “orçamento” • Trade-offs entre complexidade na malha e no shader • Malha usada na física • Resolução de texturas • Memória de vídeo é limitada • Escolher, de novo, onde gastar o orçamento • Tamanho da textura exibida na tela • Detalhes de alta frequência são uma ideia perigosa
  • 16. Complexidade de shaders • Considerar o shader certo para cada situação • Aquela peça de decoração não precisa de 5 mapas de detalhe + normal + specular + cubemap + AO • Colocar um target estrito e baixo nos shaders… • Por exemplo, Shader Model 2.0 • Garante um custo baixo • Incentiva programação bem otimizada
  • 18. Texture Atlas • Assets que utilizam o mesmo shader podem compartilhar o material… • Se suas texturas forem combinadas em uma só • Extremamente importante • Static & Dynamic Batching
  • 19. Reutilização de assets • Model & texture once, use everywhere • Reduz o custo de criação e de runtime • Menos malhas e texturas únicas • Menos memória • Especialmente relevante em mobile… • Reutilização criativa evita a repetição
  • 20.
  • 21.
  • 22.
  • 23. Nível 3 Otimização de tamanho de arquivo
  • 24. Utilizando assets com inteligência • Texturas • Resolução • Compressão • Som • Sample rate • Formato • Bitrate • Malhas • Compressão • Remoção de polígonos inúteis • Animações • Compressão • Reutilização • Layers • Mixing Transforms • Animações aditivas
  • 26.
  • 27. Trick Question • Qual o tamanho desta textura no build? • 512x512 • Diffuse + Normal
  • 29. Trick Question • 2MB? • 1MB?
  • 30. Trick Question • 2MB? • 1MB? • 512KB?
  • 31. Trick Question • 2MB? • 1MB? • 512KB? • 256KB?
  • 32. Trick Question • 2MB? • 1MB? • 512KB? • 256KB? • 128KB?
  • 33. Trick Question • 2MB? • 1MB? • 512KB? • 256KB? • 128KB? • 64KB?
  • 34. Trick Question • 2MB? • 1MB? • 512KB? • 256KB? • 128KB? • 64KB? • 32KB?
  • 35. Trick Question • 2MB? • 1MB? • 512KB? • 256KB? • 128KB? • 64KB? • 32KB? • 16KB?
  • 36. Trick Question • 2MB? • 1MB? • 512KB? • 256KB? • 128KB? • 64KB? • 32KB? • 16KB? • 8KB?
  • 37. Trick Question • 2MB? • 1MB? • 512KB? • 256KB? • 128KB? • 64KB? • 32KB? • 16KB? • 8KB? • 4KB?
  • 38. Trick Question • 2MB? • 1MB? • 512KB? • 256KB? • 128KB? • 64KB? • 32KB? • 16KB? • 8KB? • 4KB? 3,72KB
  • 39.
  • 40. ~20MB
  • 41. ~20MB (quase tudo lightmap)
  • 42. Nível 4 Soluções criativas
  • 43.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52. Nível 4 Cuidados com programação
  • 53. Armadilhas na API da Unity • FindObject[OfType] • GetComponent[s]InChildren • GetComponent • renderer.material
  • 54. Cuidados gerais • Não refazer cálculos quando as entradas não mudam • Calcule a primeira vez, guarde para consulta • Não refazer o mesmo cálculo em vários lugares • Centralize o cálculo (por exemplo em um Manager) • Distribuir cálculo pesado por vários frames • Exemplo: determinar visibilidade entre todos os jogadores • Tradeoff: desempenho X precisão • Quase sempre a precisão não precisa ser de um frame…
  • 55. Mais alternativas • Desligar objetos “inúteis” para evitar gastar CPU • Update, FixedUpdate • Física • Culling • Multithreading para computação pesada • !!CUIDADO!! – API da Unity *NÃO* é thread-safe • Mas um bom isolamento de código vai longe • Exemplo clássico: IA
  • 56. Perguntas? Bruno “Tinnus” Ferreira tinnus@gmail.com bruno.ferreira@aquiris.com.br

Notas do Editor

  1. https://www.youtube.com/watch?v=UQ7KfSYvQIo&feature=youtu.be