You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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