25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ios-tutorial.html 9.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <!DOCTYPE html>
  2. <html>
  3. <meta charset="utf-8">
  4. <head>
  5. <link rel="stylesheet" href="../../style.css">
  6. </head>
  7. <body>
  8. <script data-goatcounter="https://services.opengamestudio.org:443/count" async src="//services.opengamestudio.org:443/count.js"></script>
  9. <div id="header">
  10. <div>
  11. <strong id="title">Open Game Studio</strong>
  12. <div id="lang">
  13. <a href="../../en/news/ios-tutorial.html">EN</a>
  14. <a href="../../ru/news/ios-tutorial.html">RU</a>
  15. </div>
  16. </div>
  17. <div class="header2">
  18. <div class="menu">
  19. <a href="../../ru/news/index.html">Новости</a>
  20. <a href="../../ru/game/index.html">Игры</a>
  21. <a href="../../ru/tool/index.html">Инструменты</a>
  22. <a href="../../ru/page/about.html">О нас</a>
  23. </div>
  24. <a class="discord" href="https://discord.gg/3A6THQabNf">
  25. <img src="../../images/discord.png"></img>
  26. </a>
  27. <div class="clear"></div>
  28. </div>
  29. </div>
  30. <h3 class="left_item_title">В новостях...</h3>
  31. <center>
  32. <div class="news_item">
  33. <h2 class="news_item_title">
  34. <a href="ios-tutorial.html">Самоучитель iOS</a>
  35. </h2>
  36. <p class="news_item_date">
  37. 2017-06-08 10:00
  38. </p>
  39. <div class="news_item_contents">
  40. <p><img src="../../images/2017-06-08-ios-refactoring.png" alt="Земля и ракета" /></p>
  41. <p>Эта статья описывает проблемы, с которыми мы столкнулись во время создания самоучителя для iOS в мае 2017.</p>
  42. <p><a href="https://twitter.com/OpenGameStudio/status/826816343433498627">В феврале</a> мы сумели отобразить простую модель под iOS за считанные дни. Это дало нам уверенность, что самоучитель для iOS мы сделаем столь же быстро. Тем не менее, реальность напомнила нам о простой вещи: быстро сделать можно лишь поделку на коленке, работающую только у самого разработчика; над логически связанным примером, работающим у всех, придётся попотеть.</p>
  43. <p><strong>Нативная библиотека</strong></p>
  44. <p>Прежде всего нам необходимо было ответить на следующий вопрос: "должен ли пример приложения быть частью проекта Xcode или отдельной библиотекой?"</p>
  45. <p>Для принятия решения мы использовали следующие факты:</p>
  46. <ol>
  47. <li>Проект Xcode может напрямую использовать C++ (благодаря Objective-C++) без прослоек вроде JNI<ul>
  48. <li>Отдельная библиотека не нужна (+ приложение)</li>
  49. <li>Создание отдельной библиотеки - это дополнительная работа (- библиотека)</li></ul></li>
  50. <li>OpenSceneGraph собирается в библиотеки<ul>
  51. <li>Легче использовать стандартный процесс сборки (+ библиотека)</li>
  52. <li>Создавать свой процесс сборки лишь для одной платформы сложно (- приложение)</li></ul></li>
  53. <li>OpenSceneGraph использует систему сборки CMake, которая не поддерживается Xcode<ul>
  54. <li>Проект Xcode не может включать файлы CMake (- приложение)</li>
  55. <li>Свой файл CMake может с лёгкостью включить файл OpenSceneGraph CMake для сборки единой библиотеки (+ библиотека)</li></ul></li>
  56. <li>CMake может генерировать проект Xcode<ul>
  57. <li>Можно создать файл CMake, который будет собирать как OpenSceneGraph, так и пример приложения (+ приложение)</li>
  58. <li>Xcode - это де-факто инструмент для создания проектов Xcode; легче использовать стандартный процесс сборки (+ библиотека)</li></ul></li>
  59. </ol>
  60. <p>Оценив плюсы и минусы обоих подходов, мы решили сделать библиотеку, которую можно включать в проект Xcode. Минусом данного подхода является то, что сборки приложения для симулятора и реального устройства используют разные сборки библиотеки.</p>
  61. <p><strong>Рефакторинг</strong></p>
  62. <p>Также нам пришлось ответить на ещё один вопрос: "использовать ли единую кодовую базу для всех платформ или несколько под каждую платформу?"</p>
  63. <p>При создании самоучителя для Android мы использовали единую кодовую базу, т.к. она отлично работала для десктопа и Android. Когда мы начали работу над самоучителем iOS, стало ясно, что часть функционала либо работает, либо не работает на некоторых платформах. Например, один функционал может работать на десктопе и iOS, но не работать на Android. Другой функционал может работать на iOS и Android, но не работать на десктопе. Т.к. мы не хотели загрязнять код кучей #ifdef, мы решили помещать функционал, специфичный для конкретной платформы или нескольких платформ, в разные файлы. Это привело к резкому увеличению количества файлов. Такой подход хорошо подходил для повторного использования, но совершенно не годился для понимания общей картины.</p>
  64. <p>В этот момент мы осознали необходимость ответа на второй вопрос. Мы напомнили себе, что главная цель примера приложения состоит в том, чтобы обучить базовым вещам OpenSceneGraph, а не создать повторно используемую библиотеку с API, который будет жить без изменений десятилетиями.</p>
  65. <p>Для ответа на этот вопрос нам помог наш внутренний инструмент feature tool. С его помощью мы разделили код на несколько частей, который в итоге собирается ровно в два файла для каждой платформы:</p>
  66. <ol>
  67. <li>functions.h - содержит повторно используемые бесклассовые функции</li>
  68. <li>main.h - содержит остальной код приложения</li>
  69. </ol>
  70. <p>Их содержимое несколько отличается для каждой из платформ, но наличие всего двух файлов позволяет увидеть общую картину.</p>
  71. <p>На этом мы заканчиваем описание проблем, с которыми мы столкнулись во время создания самоучителя для iOS в мае 2017.</p>
  72. </div>
  73. </div>
  74. <div id="disqus_thread"></div>
  75. <script>
  76. var disqus_config = function () {
  77. this.page.url = "https://opengamestudio.org/ru/news/ios-tutorial.html";
  78. this.page.identifier = "ios-tutorial.html";
  79. };
  80. (function() { // DON'T EDIT BELOW THIS LINE
  81. var d = document, s = d.createElement('script');
  82. s.src = 'https://opengamestudio.disqus.com/embed.js';
  83. s.setAttribute('data-timestamp', +new Date());
  84. (d.head || d.body).appendChild(s);
  85. })();
  86. </script>
  87. <noscript>Пожалуйста, включите JavaScript для просмотра <a href="https://disqus.com/?ref_noscript">комментариев на платформе Disqus.</a></noscript>
  88. <div id="footer">
  89. Сайт сгенерирован <a href="http://opengamestudio.org/pskov/ru">ПСКОВОМ</a>
  90. из <a href="http://github.com/ogstudio/site-opengamestudio">этого исходного кода</a>.
  91. </div>
  92. </center>
  93. </body>
  94. </html>