Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Game Development and Automation @ Agile Sapporo 2018 #1

Game Development and Automation @ Agile Sapporo 2018 #1

A thirty minute presentation I gave at Agile Sapporo 2018 #1 describing in detail how Cold Fusion uses buildbot for Continuous Integration for development, and fastlane to easily deploy updated binaries and metadata to iTunes Connect and Google Play for our flagship game, Crystal Clash. I also cover a few interesting issues related to GPU differences, and OS/tool bugs that I've run into while developing our mobile game engine on both iOS and Android.

(Note: This presentation is only in Japanese, sorry.)

3a488be96753f7e2232f3a3d79b83083?s=128

Michael Tedder

February 28, 2018
Tweet

Transcript

  1. :06ͱήʔϜͱࣗಈԽͱ גࣜձࣾίʔϧυɾϑϡʔδϣϯ ςομʔɹϚΠέϧ
 5FDIOJDBM%JSFDUPS$&0 ΞδϟΠϧࡳຈ೥ճ໨ ೥݄೔ ਫ

  2. ग़਎ɿΞϝϦΧʢϑϩϦμभΦʔϥϯυࢢʣ
 ࢓ࣄɿήʔϜ։ൃɺ%Τϯδϯ։ൃɺΦʔσΟΦ%41։ൃɺωοτϫʔΫ։ൃɺ$&0
 ݴޠɿ$ ɺ1)1ɺ5ZQF4DSJQUɺΞηϯϒϥʢYY"3..*14 
 झຯɿσϞγʔϯʢ5PLZP%FNP'FTUͷओ࠵ऀʣɺνοϓνϡʔϯɺ73ɺ"84ɺӉ஦
 
 ࡀͰߴߍଔۀɺ6OJWFSTJUZPG$FOUSBM'MPSJEBେֶʹೖֶ
 
 ೥ɹେֶΠϯλʔϯͰ73։ൃΛ࢝Ίͯɺʮ7JSUPQJBʯΛ4*((3"1)Ͱެ։


    ೥ɹ/JOUFOEPͷΤϛϡϨʔλΛ࡞੒ɺήʔϜۀքʹೖΔ
 ೥ɹ೔ຊʢ౦ژʣ΁Ҡಈ
 ೥ɹԭೄ΁Ҡಈ
 ೥ɹגࣜձࣾίʔϧυɾϑϡʔδϣϯΛઃཱ
 ೥ɹࡳຈ΁Ҡಈ
 ೥ɹ౦ژήʔϜγϣ΢ʹग़లɺࣗࣾΦϦδφϧͷεϚϗ޲͚ήʔϜ
 ɹɹɹɹɹɹɹɹʮΫϦελϧɾΫϥογϡʯ J04"OESPJE,JOEMF'JSF Λ഑৴ ςομʔɹϚΠέϧ ࡀ michael.tedder42 @_Falken Falken42 ࣗݾ঺հ
  3. ςομʔɹϚΠέϧ
 5FDIOJDBM%JSFDUPS$&0
 ๺ւಓࡳຈࢢ ෱ຊɹষ
 (BNF%FTJHO"SU%JSFDUPS
 ౦ژ౎ &JLFl3PNFP,OJHIUz4UF⒎FO
 .VTJD4PVOE%JSFDUPS
 υΠπɹσϡοηϧυϧϑࢢ

  4. $PME'VTJPOΤϯδϯ ➤ ΫϩεϓϥοτϑΥʔϜ8JOEPXT-JOVYNBD04J04"OESPJE શͭͷ$16ΞʔΩςΫνϟ  ➤ ׬શϚϧνεϨουԽύϑΥʔϚϯεΛ࠷༏ઌͷͨΊɺෳ਺$16εϨουͱ(16ॲཧΛฒྻԽ ➤ ϨϯμϦϯά7VMLBOͷ"1*σβΠϯΛར༻͠ɺݱࡏ͸0QFO(-ͱ(-&4ରԠ ➤

    ฒྻԽͱ࠷దԽͷύϑΥʔϚϯεͰ$16ॲཧ͸௿͍ˠεϚϗͰόοςϦʔফඅͱൃੜ͢Δ೤͕গͳ͍ ➤ ݴޠ$  ϥϜμࣜ࠷ߴʂ ɺ࢒Γ͸0CKFDUJWF$  NBD04J04 ͱ+BWB "OESPJE
  5. ΫϦελϧɾΫϥογϡʲ௒߈ܸతύζϧ߹ઓʂʳ ➤ ॠؒతͳߟ࡯ྗͱ൑அྗΛඞཁͱ͢ΔɺύζϧͱΞΫγϣϯ͕߹ମͨ͠ϦΞϧλΠϜΦϯϥΠϯରઓήʔϜ ➤ $PME'VTJPOΤϯδϯΛར༻ɺ5PLZP(BNF4IPXͷϲ݄લͰήʔϜ։ൃΛ࢝Ίͨ ➤ "84&$ͰϢʔβʔ؅ཧͱϥϯΩϯά"1* 1)1 ήʔϜͷϩʔϏʔαʔόʔͱϦΞϧλΠϜରઓ௨৴ $

  6. ΊΜͲ͍͘͜͞ͱᶃ ➤ ̑ͭͷϓϥοτϑΥʔϜͷϏϧυʹରͯ͠ͷίϯύΠϧͱςετ ➤ $'Τϯδϯ͸ιʔεϑΝΠϧݸ͘Β͍ʢϥΠϒϥϦؚΊʣ ➤ ίϯύΠϥ΋04ʹΑͬͯҧ͏ʢ8JOEPXT͸7JTVBM4UVEJPɺNBD04J04͸9DPEF౳ʣ

  7. ΊΜͲ͍͘͜͞ͱᶃ ➤ 1$ΛͦΕͧΕ্ཱͪ͛ͯɺखಈͰϏϧυ͠ɺFYFϑΝΠϧΛ࣮ߦ͢Δͱେมͳ࡞ۀྔ ➤ ̑ͭͷϓϥοτϑΥʔϜͷϏϧυʹରͯ͠ͷίϯύΠϧͱςετ ➤ $'Τϯδϯ͸ιʔεϑΝΠϧݸ͘Β͍ʢϥΠϒϥϦؚΊʣ ➤ ίϯύΠϥ΋04ʹΑͬͯҧ͏ʢ8JOEPXT͸7JTVBM4UVEJPɺNBD04J04͸9DPEF౳ʣ

  8. ΊΜͲ͍͘͜͞ͱᶄ ➤ ΞϓϦ഑৴ʹͯඞཁͳେྔͷ৘ใʢϝλσʔλʣ ➤ ΞϓϦઆ໌ɺΞΠίϯɺΩʔϫʔυɺαϙʔτ৘ใɺεΫϦʔϯγϣοτɺϓϨϏϡʔಈըʢ୺຤ൺ཰͝ͱʹʣ ➤ ݴޠ͝ͱʹɺͦͯ͠ετΞ͝ͱʹɾɾɾ ➤ 8FC6*͸Ͳ͏ͯ͠΋खಈͳͷͰɺؒҧ͍͠΍͍͢

  9. ΊΜͲ͍͘͜͞ͱ શ෦ࣗಈԽʹ͢Δʂ

  10. CVJMECPUͷ঺հ ➤ +FOLJOT΍(JU-BCͱಉ͡Α͏ͳܧଓతΠϯςάϨʔγϣϯ $* πʔϧ ➤ ԿΒ͔ͷΠϕϯτͰԿ͔ͷλεΫʢϓϩηεʣΛ࣮ߦ ➤ ྫɿιʔείʔυͷϦϙ΁ͷίϛοτϓογϡʹରͯ͠͸ίϯύΠϧ͢Δ

  11. CVJMECPUͷ঺հ ➤ ίϯύΠϧ͚ͩͰ͸ͳ͘ɺεΫϦϓτ΋࣮ߦՄೳ ➤ +FOLJOT΍(JU-BCͱಉ͡Α͏ͳܧଓతΠϯςάϨʔγϣϯ $* πʔϧ ➤ ԿΒ͔ͷΠϕϯτͰԿ͔ͷλεΫʢϓϩηεʣΛ࣮ߦ ➤

    ྫɿιʔείʔυͷϦϙ΁ͷίϛοτϓογϡʹରͯ͠͸ίϯύΠϧ͢Δ
  12. CVJMECPUͷ঺հ ➤ CVJMECPU͸QZUIPO࢖ͬͯΔͷͰɺQZUIPO͕ಈ͘ϓϥοτϑΥʔϜͰར༻Մೳ ➤ +FOLJOT΍(JU-BCͱಉ͡Α͏ͳܧଓతΠϯςάϨʔγϣϯ $* πʔϧ ➤ ԿΒ͔ͷΠϕϯτͰԿ͔ͷλεΫʢϓϩηεʣΛ࣮ߦ ➤

    ྫɿιʔείʔυͷϦϙ΁ͷίϛοτϓογϡʹରͯ͠͸ίϯύΠϧ͢Δ ➤ ίϯύΠϧ͚ͩͰ͸ͳ͘ɺεΫϦϓτ΋࣮ߦՄೳ
  13. CVJMECPUͷ঺հ ➤ ϚελʔͱϫʔΧʔΛઃஔͯ͠ɺϚελʔ͕ϫʔΧʔʹλεΫΛৼΔ ➤ ϫʔΧʔͷλεΫͷϩάग़ྗɺλεΫਐߦͳͲ͸શͯϚελʔʹసૹɺϝʔϧ8FC4MBDLͰݟΕΔ
 ˞CVJMECPUͷ)1ΑΓ

  14. $'ͰCVJMECPUͷࣄྫ ➤ CVJMECPUϚελʔ͸&$ͷUNJDSPʹઃஔ ➤ ࣾ಺ͷJ.BD ୆ ʹ7JSUVBM#PY7.Λͭ ➤ 8JOEPXT CVJMECPUϫʔΧʔ

     ➤ 6CVOUV CVJMECPUϫʔΧʔ  ➤ J.BDʹ΋CVJMECPUϫʔΧʔ ➤ 9DPEFͰNBD04J04Ϗϧυ͕ඞཁͷͨΊɺ J.BD͸͔ܽͤͳ͍ ➤ ࠓޙ͸7.Λ&$ΠϯελϯεʹҠಈ༧ఆ
  15. $'ͰCVJMECPUͷࣄྫ ➤ HJUϦϙδτϦ΁ͷίϛοτϓογϡ ➤ CVJMECPUϚελʔ͸HJUϦϙͷߋ৽Λ൑அ ➤ ͭͷϓϥοτϑΥʔϜͷϫʔΧʔ͕ಉ࣌ʹϏϧυ ➤ ԫ৭͸࣮ߦதɺ੨৭͸ਖ਼ৗɺ੺͸Τϥʔൃੜςετ ࣦഊ

  16. $'ͰCVJMECPUͷࣄྫ ➤ 8JOEPXTϓϥοτϑΥʔϜͷϏϧυεςοϓ ➤ HJUߋ৽HJUϋογϡΛιʔεʹ͚ͭΔ ➤ σόοά൛ΛίϯύΠϧ CJU  ➤

    σόοά൛ͷςετΛίϯύΠϧ CJU  ➤ σόοά൛ͷςετΛ࣮ߦ CJU  ➤ ϦϦʔε൛ΛίϯύΠϧ CJU  ➤ ϦϦʔε൛ͷςετΛίϯύΠϧ CJU  ➤ ϦϦʔε൛ͷςετΛ࣮ߦ CJU
  17. $'ͰCVJMECPUͷࣄྫ ➤ શϓϥοτϑΥʔϜ͸ಉ͡Α͏ʹσόοά൛ ͱϦϦʔε൛ͷίϯύΠϧͱςετ ➤ J04ͱ"OESPJEͷςετ͸࣮ػΛ࢖༻ ➤ 64#ͰJ.BDʹܨ͍ͯΔJ1PEͱ,JOEMF ➤ J04͸ʮJPTEFQMPZʯπʔϧͰ࣮ߦ

    ➤ "OESPJE͸ී௨ʹʮBECʯͰ࣮ߦ
  18. $'ͰCVJMECPUͷࣄྫ ➤ $'Τϯδϯͷςετ͕શͯ0,ͷ৔߹͸ήʔϜ ίϯύΠϧ͕ࣗಈతʹߦ͏ ➤ ήʔϜͷϦϦʔε൛Λ഑৴༻ʹ४උ͞ΕΔ ➤ J04͸ΞʔΧΠϒ͔ΒJQBΛ࡞੒ ➤ "OESPJE͸BQLΛిࢠॺ໊Λ͚ͭΔ

    ➤ ϫʔΧʔ͸ͦΕͧΕͷϓϥοτϑΥʔϜͷ࣮ߦ ϑΝΠϧΛ%SPQCPY΁ίϐʔ
  19. GBTUMBOFͷ঺հ ˞GBTUMBOFͷ)1ΑΓ ➤ ΞϓϦͷεΫϦʔϯγϣοτΛࣗಈࡱӨ ➤ ෳ਺ݴޠରԠ ➤ ֤ΞϓϦετΞͷެ։"1*ར༻ͯ͠σϓϩΠ ➤ ϕʔλ൛Λςελʔ΁

    ➤ ϦϦʔε൛Λެ։ετΞϖʔδ΁ ➤ ΞϓϦূ໌ॻͷࣗಈిࢠॺ໊෇͚
  20. GBTUMBOFͷ঺հ ˞GBTUMBOFͷ)1ΑΓ ➤ ͭ·ΓɺΞϓϦެ։͢Δલʹςελʔʹ഑৴ ➤ J5VOFT$POOFDU͸5FTU'MJHIU ➤ (PPHMF1MBZ͸ΞϧϑΝϕʔλτϥοΫ͋Δ ➤ ΞϓϦͷεΫϦʔϯγϣοτΛࣗಈࡱӨ

    ➤ ෳ਺ݴޠରԠ ➤ ֤ΞϓϦετΞͷެ։"1*ར༻ͯ͠σϓϩΠ ➤ ϕʔλ൛Λςελʔ΁ ➤ ϦϦʔε൛Λެ։ετΞϖʔδ΁ ➤ ΞϓϦূ໌ॻͷࣗಈిࢠॺ໊෇͚
  21. $'ͰGBTUMBOFͷࣄྫ ➤ CVJMECPUʹGBTUMBOFΛ౷߹ ➤ GBTUMBOFઃఆͱϝλσʔλ͸ήʔϜͷHJUϦϙʹ ➤ %SPQCPYʹίϐʔ͞Ε࣮ͨߦϑΝΠϧΛσϓϩΠ ➤ J04JQB͸J5VOFT$POOFDU΁ ➤

    "OESPJEBQL͸(PPHMF1MBZ΁
  22. $'ͰGBTUMBOFͷࣄྫ ➤ d෼ఔ౓ͰϏϧυ͸഑৴͞Εɺςελʔ ͕ࣗ෼ͷ୺຤ʹμ΢ϯϩʔυͰ͖Δ ➤ CVJMECPUʹGBTUMBOFΛ౷߹ ➤ GBTUMBOFઃఆͱϝλσʔλ͸ήʔϜͷHJUϦϙʹ ➤ %SPQCPYʹίϐʔ͞Ε࣮ͨߦϑΝΠϧΛσϓϩΠ

    ➤ J04JQB͸J5VOFT$POOFDU΁ ➤ "OESPJEBQL͸(PPHMF1MBZ΁
  23. $'ͰGBTUMBOFͷࣄྫ ➤ ࣮ࡍήʔϜͷνΣοΫΛߦ͍ɺௐ੔͠ɺ࠶Ϗϧυ ➤ σβΠφʔ͞ΜͱϑΟʔυόοΫ͕ૣͯ͘ࡉ͔͍ ௐ੔͕Ͱ͖Δ

  24. $'ͰGBTUMBOFͷࣄྫ ➤ ࣮ࡍήʔϜͷνΣοΫΛߦ͍ɺௐ੔͠ɺ࠶Ϗϧυ ➤ σβΠφʔ͞ΜͱϑΟʔυόοΫ͕ૣͯ͘ࡉ͔͍ ௐ੔͕Ͱ͖Δ ➤ 1$൛͸͋Δఔ౓ςετՄೳ͚Ͳɺλονը໘ ৮Δײ֮͸࣮ػ͕ඞཁ

  25. $'ͰGBTUMBOFͷࣄྫ ➤ ׬੒ͨ͠Ϗϧυ͸֤ετΞͷ8FC6*Ͱެ։ ➤ (PPHMF1MBZ%FWFMPQFS$POTPMF͸ʮ1SPNPUFUP 1SPEVDUJPOʯϘλϯͭͰ໿࣌ؒͰੈքதʹެ։ ➤ J5VOFT$POOFDU͸Ξοϓϧͷ৹ࠪ͋ΔͨΊɺαϒϛοτ ͔ͯ͠Β̍ʙ̎೔͕ؒඞཁ ➤

    8FC6*࢖ΘͣʹGBTUMBOFͰͰ͖Δ͚Ͳɺେͨ͠࡞ۀͰ͸ͳ͍
  26. $'ͰGBTUMBOFͷࣄྫ ➤ ࢒೦ͳ͕Β"NB[PO%FWFMPQFS$POTPMFͷ"1*͕·ͩެ ։͞Εͯͳ͍ͷͰɺ,JOEMF΁ͷσϓϩΠ͸͢΂ͯखಈɾɾɾ ➤ ׬੒ͨ͠Ϗϧυ͸֤ετΞͷ8FC6*Ͱެ։ ➤ (PPHMF1MBZ%FWFMPQFS$POTPMF͸ʮ1SPNPUFUP 1SPEVDUJPOʯϘλϯͭͰ໿࣌ؒͰੈքதʹެ։ ➤

    J5VOFT$POOFDU͸Ξοϓϧͷ৹ࠪ͋ΔͨΊɺαϒϛοτ ͔ͯ͠Β̍ʙ̎೔͕ؒඞཁ ➤ 8FC6*࢖ΘͣʹGBTUMBOFͰͰ͖Δ͚Ͳɺେͨ͠࡞ۀͰ͸ͳ͍
  27. ήʔϜεϚϗ։ൃͰͷۤ࿑

  28. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶃ֎෦ͷϥΠϒϥϦ͸Ͱ͖Δ͚ͩར༻͠ͳ͍

  29. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶃ֎෦ͷϥΠϒϥϦ͸Ͱ͖Δ͚ͩར༻͠ͳ͍ ➤ ͭͷϓϥοτϑΥʔϜͰͭͷ$16ΞʔΩςΫνϟͰ͸શͯਖ਼ৗʹಈ͘ͷอূ ͸ͳ͔ͳ͔ͳ͍

  30. ήʔϜεϚϗ։ൃͰͷۤ࿑ ➤ ͋ΔϓϥοτϑΥʔϜͰಈ͔ͳ͍࣌ͷσόοάͱαϙʔτͷ࣌ؒʢίετʣ͸ ͔͔Δ ᶃ֎෦ͷϥΠϒϥϦ͸Ͱ͖Δ͚ͩར༻͠ͳ͍ ➤ ͭͷϓϥοτϑΥʔϜͰͭͷ$16ΞʔΩςΫνϟͰ͸શͯਖ਼ৗʹಈ͘ͷอূ ͸ͳ͔ͳ͔ͳ͍

  31. ήʔϜεϚϗ։ൃͰͷۤ࿑ ➤ ࣗ࡞ͷ෺͸ϓϥοτϑΥʔϜϕʔε͕౷Ұ͢ΔͷͰ৴པ͕͋Δ ᶃ֎෦ͷϥΠϒϥϦ͸Ͱ͖Δ͚ͩར༻͠ͳ͍ ➤ ͭͷϓϥοτϑΥʔϜͰͭͷ$16ΞʔΩςΫνϟͰ͸શͯਖ਼ৗʹಈ͘ͷอূ ͸ͳ͔ͳ͔ͳ͍ ➤ ͋ΔϓϥοτϑΥʔϜͰಈ͔ͳ͍࣌ͷσόοάͱαϙʔτͷ࣌ؒʢίετʣ͸ ͔͔Δ

  32. ήʔϜεϚϗ։ൃͰͷۤ࿑ ➤ ͱ͸͍͑ɺϓϥοτϑΥʔϜʹؔ܎ͷͳ͍ϥΠϒϥϦʢ[MJC TRMJUF PQFOTTM  GSFFUZQFͳͲʣ͸࢖͏͚ͲɺͲ͏ͯ͠΋मਖ਼͸ඞཁͳ͕࣌͋Δ ᶃ֎෦ͷϥΠϒϥϦ͸Ͱ͖Δ͚ͩར༻͠ͳ͍ ➤ ͭͷϓϥοτϑΥʔϜͰͭͷ$16ΞʔΩςΫνϟͰ͸શͯਖ਼ৗʹಈ͘ͷอূ

    ͸ͳ͔ͳ͔ͳ͍ ➤ ͋ΔϓϥοτϑΥʔϜͰಈ͔ͳ͍࣌ͷσόοάͱαϙʔτͷ࣌ؒʢίετʣ͸ ͔͔Δ ➤ ࣗ࡞ͷ෺͸ϓϥοτϑΥʔϜϕʔε͕౷Ұ͢ΔͷͰ৴པ͕͋Δ
  33. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶄ"OESPJEͰNFNTFU ͷελοΫΦʔόʔϑϩʔ

  34. ήʔϜεϚϗ։ൃͰͷۤ࿑ ➤ "OESPJEͷ৽͍͠04όʔδϣϯͰ͸OBUJWFίʔυͷෛ୲ΛݮΒͨ͢Ί04ଆͰ ৭ʑͱαϙʔτͯ͘͠ΕͯΔʢ͍͍͜ͱʣ ᶄ"OESPJEͰNFNTFU ͷελοΫΦʔόʔϑϩʔ

  35. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶄ"OESPJEͰNFNTFU ͷελοΫΦʔόʔϑϩʔ ➤ "OESPJEͷ৽͍͠04όʔδϣϯͰ͸OBUJWFίʔυͷෛ୲ΛݮΒͨ͢Ί04ଆͰ ৭ʑͱαϙʔτͯ͘͠ΕͯΔʢ͍͍͜ͱʣ ➤ @@BFBCJ@NFNTFU ͱ͍͏৽͍ؔ͠਺͸"1*͔ΒରԠ ➤

    ී௨ͷMJCDͷNFNTFU ؔ਺͸௚઀@@BFBCJ@NFNTFU ΛݺͿ ➤ "1*ΑΓલͷ୺຤Ͱ͸౰વଘࡏ͠ͳ͍ʢ࣮ߦ࣌EZOBNJDϦϯΫΤϥʔൃੜʣ
  36. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶄ"OESPJEͰNFNTFU ͷελοΫΦʔόʔϑϩʔ ➤ "OESPJEͷ৽͍͠04όʔδϣϯͰ͸OBUJWFίʔυͷෛ୲ΛݮΒͨ͢Ί04ଆͰ ৭ʑͱαϙʔτͯ͘͠ΕͯΔʢ͍͍͜ͱʣ ➤ @@BFBCJ@NFNTFU ͱ͍͏৽͍ؔ͠਺͸"1*͔ΒରԠ ➤

    ී௨ͷMJCDͷNFNTFU ؔ਺͸௚઀@@BFBCJ@NFNTFU ΛݺͿ ➤ "1*ΑΓલͷ୺຤Ͱ͸౰વଘࡏ͠ͳ͍ʢ࣮ߦ࣌EZOBNJDϦϯΫΤϥʔൃੜʣ ➤ "1*ΑΓલͷ୺຤ΛରԠ͢Δʹ͸ɾɾɾ
  37. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶄ"OESPJEͰNFNTFU ͷελοΫΦʔόʔϑϩʔ void __aeabi_memset(void *dest, size_t n, int c)

    __attribute__ ((weak)) { u8 *pdst = static_cast<u8 *>(dest); while (n--) *pdst++ = c; } ➤ "1*ΑΓલͷ୺຤ΛରԠ͢Δʹ͸XFBLؔ਺Λ༻ҙ͠ɺॳظςετͷͨΊʹγϯϓϧͳϧʔϓͰରԠ
  38. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶄ"OESPJEͰNFNTFU ͷελοΫΦʔόʔϑϩʔ ➤ "1*ΑΓલͷ୺຤ΛରԠ͢Δʹ͸XFBLؔ਺Λ༻ҙ͠ɺॳظςετͷͨΊʹγϯϓϧͳϧʔϓͰରԠ void __aeabi_memset(void *dest, size_t n,

    int c) __attribute__ ((weak)) { u8 *pdst = static_cast<u8 *>(dest); while (n--) *pdst++ = c; } ➤ σόοά൛Ͱਖ਼ৗʹಈ͍͚ͨͲɺϦϦʔε൛ͰଈΫϥογϡɾɾɾ
  39. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶄ"OESPJEͰNFNTFU ͷελοΫΦʔόʔϑϩʔ ➤ DMBOHͷ࠷దԽ͕ϧʔϓ͸NFNTFU ͱಉ͡ίʔυͱ൑அ͠ɺ࣮ࡍNFNTFU ʹஔ͖׵͑ΒΕͨ void __aeabi_memset(void *dest,

    size_t n, int c) __attribute__ ((weak)) { u8 *pdst = static_cast<u8 *>(dest); while (n--) *pdst++ = c; memset(dest, n, c); // clang࠷దԽɹ }
  40. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶄ"OESPJEͰNFNTFU ͷελοΫΦʔόʔϑϩʔ ➤ DMBOHͷ࠷దԽ͕ϧʔϓ͸NFNTFU ͱಉ͡ίʔυͱ൑அ͠ɺ࣮ࡍNFNTFU ʹஔ͖׵͑ΒΕͨ void __aeabi_memset(void *dest,

    size_t n, int c) __attribute__ ((weak)) { u8 *pdst = static_cast<u8 *>(dest); while (n--) *pdst++ = c; memset(dest, n, c); // clang࠷దԽɹ } ➤ NFNTFU ˠ@@BFBCJ@NFNTFU ˠNFNTFU ˠɾɾɾˠελοΫΦʔόʔϑϩʔʂ
  41. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶅ"OESPJEͰΞϓϦ͕ϑΥʔΧεΛࣦ͏ͱ(-&4ίϯςΫετ͕ഇغ͞ΕΔ

  42. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶅ"OESPJEͰΞϓϦ͕ϑΥʔΧεΛࣦ͏ͱ(-&4ίϯςΫετ͕ഇغ͞ΕΔ ➤ ϑΥʔΧεࣦ͏ͷ͸ϗʔϜϘλϯԡ͞Εͨ࣌ɺి࿩ண৴ͳͲ ➤ (-&4ίϯςΫετ͸(16༻ͷγΣʔμʔɺςΫενϟͷσʔλͱઃఆͳͲΛ؅ཧ͢Δ

  43. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶅ"OESPJEͰΞϓϦ͕ϑΥʔΧεΛࣦ͏ͱ(-&4ίϯςΫετ͕ഇغ͞ΕΔ ➤ ϑΥʔΧεࣦ͏ͷ͸ϗʔϜϘλϯԡ͞Εͨ࣌ɺి࿩ண৴ͳͲ ➤ ϑΥʔΧε໭ͬͨΒશͯͷΞηοτΛ(16ʹ࠶Ξοϓϩʔυ͢Δඞཁ͕͋Δ ʢ࠶ελʔτʹগ͠σΟϨʔ͔͔Δʣ ➤ (-&4ίϯςΫετ͸(16༻ͷγΣʔμʔɺςΫενϟͷσʔλͱઃఆͳͲΛ؅ཧ͢Δ

  44. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶅ"OESPJEͰΞϓϦ͕ϑΥʔΧεΛࣦ͏ͱ(-&4ίϯςΫετ͕ഇغ͞ΕΔ ➤ ϑΥʔΧεࣦ͏ͷ͸ϗʔϜϘλϯԡ͞Εͨ࣌ɺి࿩ண৴ͳͲ ➤ ϑΥʔΧε໭ͬͨΒશͯͷΞηοτΛ(16ʹ࠶Ξοϓϩʔυ͢Δඞཁ͕͋Δ ʢ࠶ελʔτʹগ͠σΟϨʔ͔͔Δʣ ➤ J04Ͱ͸ίϯςΫετ࢒ͯ͘͠ΕΔʢϝϞϦ͕͋ΔݶΓɺ͙͢ΞϓϦ͕࠶ར༻Մೳʣ ➤

    (-&4ίϯςΫετ͸(16༻ͷγΣʔμʔɺςΫενϟͷσʔλͱઃఆͳͲΛ؅ཧ͢Δ
  45. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶆ"OESPJEͰ͸୺຤͝ͱͷ(16͕ҧ͏ͷͰࡉ͔͍ରࡦ͢Δ͜ͱ͕͋Δ

  46. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶆ"OESPJEͰ͸୺຤͝ͱͷ(16͕ҧ͏ͷͰࡉ͔͍ରࡦ͢Δ͜ͱ͕͋Δ ➤ (16͸୺຤ͷϞσϧʹΑͬͯมΘΔɺ04όʔδϣϯʹ΋(-&4ରԠ͕όϥόϥ

  47. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶆ"OESPJEͰ͸୺຤͝ͱͷ(16͕ҧ͏ͷͰࡉ͔͍ରࡦ͢Δ͜ͱ͕͋Δ ➤ (16͸୺຤ͷϞσϧʹΑͬͯมΘΔɺ04όʔδϣϯʹ΋(-&4ରԠ͕όϥόϥ ➤ γΣμʔίϯύΠϥʹόά΋౰ͨΔ͜ͱ͸͋Δ

  48. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶆ"OESPJEͰ͸୺຤͝ͱͷ(16͕ҧ͏ͷͰࡉ͔͍ରࡦ͢Δ͜ͱ͕͋Δ ➤ (16͸୺຤ͷϞσϧʹΑͬͯมΘΔɺ04όʔδϣϯʹ΋(-&4ରԠ͕όϥόϥ ➤ Ϣʔβʔͷ୺຤ͷόά͸౰વ௚ͤͳ͍ɾɾɾ ➤ 04ΞοϓσʔτͰظ଴ͯ͠΋ɺϢʔβʔ͸ΞϓϦ͕མͪΔ͔͠ݟͳ͍ ʢѱ͍ϨϏϡʔ࢒͢Մೳੑେʣ ➤

    γΣμʔίϯύΠϥʹόά΋౰ͨΔ͜ͱ͸͋Δ
  49. ήʔϜεϚϗ։ൃͰͷۤ࿑ out vec4 outputColor; in vec2 uv; uniform sampler2D tex0;

    uniform sampler2D tex1; uniform vec3 lightboxData; void main() { if (uv.x < lightboxData.x) { if (lightboxData.y > 0.0) { vec2 tuv = vec2(uv.x + (1.0 - lightboxData.x), uv.y); outputColor = texture(tex0, tuv); } else { outputColor = vec4(0.0, 0.0, 0.0, 0.0); } } else { if (lightboxData.z > 0.0) { vec2 tuv = vec2(uv.x - lightboxData.x, uv.y); outputColor = texture(tex1, tuv); } else { outputColor = vec4(0.0, 0.0, 0.0, 0.0); } } }
  50. ήʔϜεϚϗ։ൃͰͷۤ࿑ out vec4 outputColor; in vec2 uv; uniform sampler2D tex0;

    uniform sampler2D tex1; uniform vec3 lightboxData; void main() { if (uv.x < lightboxData.x) { if (lightboxData.y > 0.0) { vec2 tuv = vec2(uv.x + (1.0 - lightboxData.x), uv.y); outputColor = texture(tex0, tuv); } else { outputColor = vec4(0.0, 0.0, 0.0, 0.0); } } else { if (lightboxData.z > 0.0) { vec2 tuv = vec2(uv.x - lightboxData.x, uv.y); // tuv is already defined outputColor = texture(tex1, tuv); } else { outputColor = vec4(0.0, 0.0, 0.0, 0.0); } } }
  51. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶇ"OESPJEͰ͸ΦʔσΟΦυϥΠόͷରԠ͸୺຤͝ͱʹόϥόϥ

  52. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶇ"OESPJEͰ͸ΦʔσΟΦυϥΠόͷରԠ͸୺຤͝ͱʹόϥόϥ ➤ νϟϯωϧΛಉ࣌ʹ࠶ੜͰ͖Δ୺຤͸͋Δ

  53. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶇ"OESPJEͰ͸ΦʔσΟΦυϥΠόͷରԠ͸୺຤͝ͱʹόϥόϥ ➤ νϟϯωϧΛಉ࣌ʹ࠶ੜͰ͖Δ୺຤͸͋Δ ➤ ͨͩɺνϟϯωϧ͔͠ಉ࣌ʹ࠶ੜͰ͖Δ୺຤΋͋Δʢ࠷৽୺຤Ͱ΋ʂʣ

  54. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶇ"OESPJEͰ͸ΦʔσΟΦυϥΠόͷରԠ͸୺຤͝ͱʹόϥόϥ ➤ νϟϯωϧΛಉ࣌ʹ࠶ੜͰ͖Δ୺຤͸͋Δ ➤ ࣗ࡞ͰΦʔσΟΦϛΫγϯάΛߦ͏͜ͱͰͲͷ୺຤Ͱ΋ཉ͍݁͠Ռ͸ग़Δ ➤ ͨͩɺνϟϯωϧ͔͠ಉ࣌ʹ࠶ੜͰ͖Δ୺຤΋͋Δʢ࠷৽୺຤Ͱ΋ʂʣ

  55. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶈ9DPEF͔ΒʹΞοϓσʔτͨ͠ΒJ04JQB͕ଈΫϥογϡ໰୊

  56. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶈ9DPEF͔ΒʹΞοϓσʔτͨ͠ΒJ04JQB͕ଈΫϥογϡ໰୊ ➤ ϩʔΧϧͰσόοά൛ɺϦϦʔε൛͸ਖ਼ৗʹಈ͘

  57. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶈ9DPEF͔ΒʹΞοϓσʔτͨ͠ΒJ04JQB͕ଈΫϥογϡ໰୊ ➤ ϩʔΧϧͰσόοά൛ɺϦϦʔε൛͸ਖ਼ৗʹಈ͘ ➤ 5FTU'MJHIUͰμ΢ϯϩʔυ͢ΔJQB͸ىಈ͢ΔͱଈΫϥογϡ

  58. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶈ9DPEF͔ΒʹΞοϓσʔτͨ͠ΒJ04JQB͕ଈΫϥογϡ໰୊ ➤ ϩʔΧϧͰσόοά൛ɺϦϦʔε൛͸ਖ਼ৗʹಈ͘ ➤ 5FTU'MJHIUͰμ΢ϯϩʔυ͢ΔJQB͸ىಈ͢ΔͱଈΫϥογϡ ➤ िؒ΄Ͳͷσόοάͱ"QQMFͱͷ࿈བྷ΍ΓͱΓͰ͍ͭ͘ͷ৚͕݅ॏͶͨ͜ͱͰπʔ ϧͷόάൃੜ͕൑໌ɿ ➤

    $'Τϯδϯ಺ͰͷάϩʔόϧPQFSBUPSOFXEFMFUFͷஔ͖׵͑ ➤ ʮ+40/GPS.PEFSO$ ʯͷ֎෦ϥΠϒϥϦͷTUEBMMPDBUPS࢖͍ํ ➤ JQBΞʔΧΠϒͷ࣌ʹ͔͠ߦΘͳ͍"QQMFͷTUSJQπʔϧͷෆ۩߹
  59. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶈ9DPEF͔ΒʹΞοϓσʔτͨ͠ΒJ04JQB͕ଈΫϥογϡ໰୊ ➤ TUSJQπʔϧ͸σϑΝϧτύϥϝʔλͰάϩʔόϧPQFSBUPSOFXEFMFUF͸EZOBNJDMJOL༻ͷFYQPSU ςʔϒϧʹग़͍ͯͳ͔ͬͨ

  60. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶈ9DPEF͔ΒʹΞοϓσʔτͨ͠ΒJ04JQB͕ଈΫϥογϡ໰୊ ➤ TUSJQπʔϧ͸σϑΝϧτύϥϝʔλͰάϩʔόϧPQFSBUPSOFXEFMFUF͸EZOBNJDMJOL༻ͷFYQPSU ςʔϒϧʹग़͍ͯͳ͔ͬͨ ➤ TUSJQͷΦϓγϣϯΛσϑΝϧτ͔Βม͑ΔʢTUSJQVSʣͱάϩʔόϧPQFSBUPSOFXEFMFUF͸ FYQPSUςʔϒϧʹग़ΔΑ͏ʹͳͬͨ

  61. ήʔϜεϚϗ։ൃͰͷۤ࿑ ᶈ9DPEF͔ΒʹΞοϓσʔτͨ͠ΒJ04JQB͕ଈΫϥογϡ໰୊ ➤ TUSJQπʔϧ͸σϑΝϧτύϥϝʔλͰάϩʔόϧPQFSBUPSOFXEFMFUF͸EZOBNJDMJOL༻ͷFYQPSU ςʔϒϧʹग़͍ͯͳ͔ͬͨ ➤ TUSJQͷΦϓγϣϯΛσϑΝϧτ͔Βม͑ΔʢTUSJQVSʣͱάϩʔόϧPQFSBUPSOFXEFMFUF͸ FYQPSUςʔϒϧʹग़ΔΑ͏ʹͳͬͨ ➤ ήʔϜ͸ਖ਼ৗʹಈ͘Α͏ʹͳͬͨʂ

  62. ·ͱΊ

  63. ·ͱΊ ➤ ܁Γฦͯ͠Δ͜ͱΛ͙͢ʹࣗಈԽʹ͢Δͱ͋ͱͰಘ͢Δ

  64. ·ͱΊ ➤ ܁Γฦͯ͠Δ͜ͱΛ͙͢ʹࣗಈԽʹ͢Δͱ͋ͱͰಘ͢Δ ➤ CVJMECPUͱGBTUMBOFͷ͓ӄͰʮΫϦελϧɾΫϥογϡʯ։ൃ தͷνʔϜϑΟʔυόοΫ͕ૣ͘औΕͯɺ໿ϲ݄Ͱ࡞Γ্͛ͨ

  65. ·ͱΊ ➤ ܁Γฦͯ͠Δ͜ͱΛ͙͢ʹࣗಈԽʹ͢Δͱ͋ͱͰಘ͢Δ ➤ CVJMECPUͱGBTUMBOFͷ͓ӄͰʮΫϦελϧɾΫϥογϡʯ։ൃ தͷνʔϜϑΟʔυόοΫ͕ૣ͘औΕͯɺ໿ϲ݄Ͱ࡞Γ্͛ͨ ➤ Τϯδϯ։ൃ͸ຊ౰ʹָ͍͚͠Ͳɺ୺຤ͷஅยԽ໰୊Ͱ࣌ؒ͸ ͔͔ͬͯ৭ʑͱۤ࿑͸͢Δ

  66. ·ͱΊ ➤ ܁Γฦͯ͠Δ͜ͱΛ͙͢ʹࣗಈԽʹ͢Δͱ͋ͱͰಘ͢Δ ➤ CVJMECPUͱGBTUMBOFͷ͓ӄͰʮΫϦελϧɾΫϥογϡʯ։ൃ தͷνʔϜϑΟʔυόοΫ͕ૣ͘औΕͯɺ໿ϲ݄Ͱ࡞Γ্͛ͨ ➤ Τϯδϯ։ൃ͸ຊ౰ʹָ͍͚͠Ͳɺ୺຤ͷஅยԽ໰୊Ͱ࣌ؒ͸ ͔͔ͬͯ৭ʑͱۤ࿑͸͢Δ ➤

    ֮ޛͯ͠ͳ͍ํ͸࡞ͬͯ͋ΔΤϯδϯΛར༻ͨ͠ํ͕ۙಓʂ
  67. ΫϦελϧɾΫϥογϡʲ௒߈ܸతύζϧ߹ઓʂʳ J04"OESPJE,JOEMF

  68. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·͢ʂ