Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Como programar melhor jogando game boy

236 views

Published on

Sabe aquele projeto de final de semana que você sempre quis fazer e nunca deu tempo ou prioridade? Nessa palestra, será mostrado como um projeto de final de semana chamou a atenção da comunidade no Github, como ele ajudou a compreender melhor o funcionamento interno do PHP e as melhorias de código que podem ser feitas para performance. E tudo isso jogando Game Boy em um emulador feito em PHP.

Published in: Technology
  • Be the first to comment

Como programar melhor jogando game boy

  1. 1. 2016 PHPSP+IMA COMO PROGRAMAR MELHOR JOGANDO GAME BOY
  2. 2. IT’S ME, BOB!
  3. 3. BOB S2 PHP
  4. 4. Cara, o que dá para fazer com PHP?
  5. 5. ?
  6. 6. Level 1 - Motivação X 1
  7. 7. Praticamente tudo o que você queira fazer!
  8. 8. Rasmus Lerdorf TIME 1994
  9. 9. I NEED TO DO A GUEST BOOK FOR MY WEBSITE TIME 1994
  10. 10. PERSONAL HOME PAGE TOOLS! TIME 1994
  11. 11. PHP = Scripts TIME 1994
  12. 12. PHP = Linguagem TIME 1997
  13. 13. PHP: Hypertext Preprocessor TIME 1997
  14. 14. vvsvvhvvrvv WebAbrangente
  15. 15. Java - 1991 James Gosling Sun Microsystems Originally designed for interactive television, but it was too advanced for the digital cable television industry at the time.
  16. 16. ECMAscript - 1995 Brendan Eich Netscape Standardized specification of a scripting language for browsers.
  17. 17. CAMPINAS SÃO PAULO
  18. 18. Projetos que gostei + game engine + websocket server + 3D printer + wifi booster + .. + .. + .. + js gameboy emulator + .. + .. + .. + ..
  19. 19. JavaScript GameBoy Emulator by Grant Galitz de 2010 suportava até IE era possível salvar emulava colorido perfeito!
  20. 20. vvvvvivvvvv Se alguém me falasse que existia um emulador de Game Boy em PHP, eu iria duvidar!
  21. 21. Um projeto desses vai inspirar as pessoas a programar o que gostam, e a ver o PHP com outros olhos.
  22. 22. Level 2 - Desafios X 1
  23. 23. Como vou renderizar o jogo?
  24. 24. ASCII
  25. 25. DRAWILLE
  26. 26. 8 pontos por caractere .. .. .. ..
  27. 27. DRAWILLE
  28. 28. GameBoy Hardware CPU 8-bit Sharp LR35902 4.19 MHz RAM / VIDEO RAM 8 kB DISPLAY 160 × 144 pixels
  29. 29. Tudo está na PAN DOCS bgb.bircd.org/ pandocs.txt
  30. 30. 0100-014F cartridge header 0100-0103 entry point 0134-0143 game title 0149 RAM size 014E-014F checksums
  31. 31. 3e01 1801 af02 c9fa 46d0 e001 18f6 cd59 23f0 41e6 0320 fa46 f041 e603 20fa 7ea0 c97b 8627 227a 8e27 223e 008e 2722 3e00 8e27 773e 01e0 e07e cb37 e60f c83e 0932 3e99 3232 77c9 f5c5 d5e5 f0b1 a728 0bfa f1c4 a728 05f0 efa7 2009 f0e1 fe03 2803 cdb6 ffcd 2d2e f0b1
  32. 32. 3e01 1801 af02 c9fa 46d0 e001 18f6 cd59 23f0 41e6 0320 fa46 f041 e603 20fa 7ea0 c97b 8627 227a 8e27 223e 008e 2722 3e00 8e27 773e 01e0 e07e cb37 e60f c83e 0932 3e99 3232 77c9 f5c5 d5e5 f0b1 a728 0bfa f1c4 a728 05f0 efa7 2009 f0e1 fe03 2803 cdb6 ffcd 2d2e f0b1
  33. 33. EXECUTÁVEL Conjunto de instruções Bytecode Cada instrução Opcode + Parâmeros A CPU do GameBoy tem quase 512 Opcodes
  34. 34. 0x03 INC BC 1 8 INC - Incrementa BC - Registro da CPU 1 - Tamanho da instrução (em bytes) 8 - Ciclos de CPU
  35. 35. Opcode.php Função opcode3 $core->registerB = (($temp_var >> 8) & 0xFF); $core->registerC = ($temp_var & 0xFF);
  36. 36. <?php while (true) { executeIteration(); runInterrupt(); updateCore(); } EMULAR UMA CPU = LOOP INFINITO
  37. 37. INTERRUPÇÕES LCD SOUND TIME JOYPAD SERIAL
  38. 38. Keyboard.php exec('stty -icanon -echo'); $this->file = fopen( 'php://stdin', 'r'); stream_set_blocking( $this->file, false); // Quando é pressionado $this->core-> joyPadEvent($keyCode, true);
  39. 39. Core.php drawSpritesForLine($line) $spriteX = (0xFF & $this- >memory[0xFE00 + $oamIx--]) - 8; $spriteY = (0xFF & $this- >memory[0xFE00 + $oamIx--]) - 16; drawPartBgSprite(); drawPartFgSprite();
  40. 40. TIME 03:00
  41. 41. RODOU!
  42. 42. Level 3 - Aprendizado X 1
  43. 43. O PHP NÃO TEM INT8/ INT16/INT32 E ISSO FAZ FALTA
  44. 44. PHP 7 MEMORY OPTIMIZATION Reduce number of allocations Reduce memory usage Reduce indirection
  45. 45. PHP 5
  46. 46. PHP 7
  47. 47. UM EMULADOR FUNCIONA QUASE DA MESMA FORMA QUE UM INTERPRETADOR
  48. 48. GRANDE PARTE DO CÓDIGO É EXECUTADA MILHARES DE VEZES!
  49. 49. XDEBUG PROFILING
  50. 50. <?php $a = 1; ASSIGN $a 1 RETURN 1 LEXER/PARSER/COMPILER
  51. 51. ZEND VM zend_vm_execute.h ZEND_API void execute_ex while (1) { … … … }
  52. 52. OTIMIZANDO AO EXTREMO <?php $a = 0; $a++; ASSIGN !0, 0 POST_INC ~2 !0 FREE ~2 RETURN 1
  53. 53. OTIMIZANDO AO EXTREMO <?php $a = 0; ++$a; ASSIGN !0, 0 PRE_INC !0 RETURN 1
  54. 54. OTIMIZANDO AO EXTREMO Use o que o PHP te permite fazer! Opcode::run($this, 0x76); … $function = 'opcode'.$address; return Opcode:$function($core); … Opcode::{‘opcode'.$op}($this);
  55. 55. PARA VER OS OPCODES DE FORMA PRÁTICA https://3v4l.org
  56. 56. v0.0.1 2 FPS v0.1.0 14 FPS
  57. 57. Level 4 - Repercussão X 1
  58. 58. Hey Pokemao, agora você já pode jogar no servidor do trampo!
  59. 59. .gitignore vendor/
  60. 60. This is important because the install command checks if a lock file is present, and if it is, it downloads the versions specified there (regardless of what composer.json says).
  61. 61. LINT / PHP CS BUILD CORREÇÕES DE INGLÊS …
  62. 62. .travis.yml language: php php: - 5.6 - 7.0 script: - bin/phing
  63. 63. build.xml … <phingCall target="phplint" /> <phingCall target="phpunit" /> <phingCall target="phpcs" /> …
  64. 64. CONSEGUI! VAI BRASIL!
  65. 65. ZEREI A VIDA!
  66. 66. GC = Garbage Collection PHP 7 Strings/Arrays/Objetos zend.enable_gc = 0
  67. 67. "when you create a lot of objects that should stay in memory. So GC can't clean them up and just wasting CPU time." O Composer já teve problemas com isso.
  68. 68. ZEREI A VIDA 2X!
  69. 69. hasegawatomoki/reading-php- terminalgameboyemulator
  70. 70. 1107 php-terminal-gameboy- emulator 9773 php-src 8097 composer 3188 doctrine2
  71. 71. 47518 facebook/react 19678 rg3/youtube-dl 35013 torvalds/linux
  72. 72. Level 5 - Futuro X 1
  73. 73. Eu não sou DIFERENTE de vocês, apenas tive FOCO! Acredito que TODOS VOCÊS POSSUEM CAPACIDADE para FAZER projetos SUPER INCRÍVEIS.
  74. 74. MEU MUITO OBRIGADO DE CORAÇÃO! PHP
  75. 75. @GABRIELRCOUTO GITHUB.COM/ GABRIELRCOUTO joind.in/talk/32aa5 TRABALHE COMIGO! VAGAS@MEMED.COM.BR MEMED PHPSP AAAAAAAAAAP
  76. 76. Level Bônus X 9999999999 overflow
  77. 77. AS ESTRELAS DESSE PROJETO, SÃO VOCÊS OBRIGADO POR FAZER PARTE!

×