Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

301 wiersze
13KB

  1. <!DOCTYPE html>
  2. <head>
  3. <meta charset="utf-8" />
  4. <!-- Set the viewport width to device width for mobile -->
  5. <meta name="viewport" content="width=device-width" />
  6. <title>Август 2016 кратко</title>
  7. <link rel="stylesheet" href="http://opengamestudio.org/theme/css/normalize.css" />
  8. <link rel="stylesheet" href="http://opengamestudio.org/theme/css/foundation.min.css" />
  9. <link rel="stylesheet" href="http://opengamestudio.org/theme/css/style.css" />
  10. <link rel="stylesheet" href="http://opengamestudio.org/theme/css/pygments.css" />
  11. <script src="http://opengamestudio.org/theme/js/custom.modernizr.js"></script>
  12. <!-- So Firefox can bookmark->"abo this site" -->
  13. <link href="feeds/all.atom.xml" rel="alternate" title="Opensource Game Studio" type="application/atom+xml">
  14. </head>
  15. <body>
  16. <!-- Nav Bar -->
  17. <nav>
  18. <!-- Show menu items and pages -->
  19. <div class="row">
  20. <div class="large-12 columns top-bar">
  21. <h1><a href="http://opengamestudio.org">Opensource Game Studio</a></h1>
  22. </div>
  23. </div>
  24. <div class="row top-menu">
  25. <div class="large-12 columns">
  26. <a href="pages/projects.html" class="menu-button secondary">Projects</a>
  27. <a href="pages/about.html" class="menu-button secondary">About</a>
  28. </div>
  29. </div>
  30. </nav>
  31. <!-- End Nav -->
  32. <!-- Main Page Content and Sidebar -->
  33. <div class="row">
  34. <!-- Main Blog Content -->
  35. <div class="large-9 columns">
  36. <article>
  37. <header>
  38. <h3 class="article-title"><a href="http://opengamestudio.org/2016-august-recap-ru.html" rel="bookmark"
  39. title="Permalink to Август 2016 кратко">Август 2016 кратко</a></h3>
  40. </header>
  41. <h6 class="subheader" title="2016-09-03T00:00:00+03:00">Сб 03 Сентябрь 2016
  42. <a class="button secondary small translation-button" href="http://opengamestudio.org/2016-august-recap.html">en</a>
  43. </h6> <p><img alt="2016-august-recap" src="http://opengamestudio.org/2016-09-03_august-recap.png" /></p>
  44. <p>Эта статья описывает самые важные технические детали разработки за август: модуль UIQt, его переработку, новый подход к разработке на основе функционала и его преимущества.</p>
  45. <p><strong>Модуль UIQt</strong> - это коллекция компонент UI на основе Qt. Сейчас используем лишь для интерфейса редактора.</p>
  46. <p>Список компонент модуля UIQt с описанием и размером кода:<table>
  47. <tr>
  48. <th><strong>№</strong></th>
  49. <th><strong>Компонента</strong></th>
  50. <th><strong>Описание</strong></th>
  51. <th><strong>Размер (Б)</strong></th>
  52. <th><strong>Размер (%)</strong></th>
  53. </tr>
  54. <tr>
  55. <td>1</td>
  56. <td>UIQtAction</td>
  57. <td>Действия (события) для меню</td>
  58. <td>11224</td>
  59. <td>9</td>
  60. </tr>
  61. <tr>
  62. <td>2</td>
  63. <td>UIQtAux</td>
  64. <td>Инициализирует Qt и главное окно. Предоставляет поиск виджета по имени для других компонент</td>
  65. <td>15518</td>
  66. <td>12</td>
  67. </tr>
  68. <tr>
  69. <td>3</td>
  70. <td>UIQtDock</td>
  71. <td>Виджет стыковки</td>
  72. <td>5273</td>
  73. <td>4</td>
  74. </tr>
  75. <tr>
  76. <td>4</td>
  77. <td>UIQtFileDialog</td>
  78. <td>Диалог выбора файла</td>
  79. <td>8960</td>
  80. <td>7</td>
  81. </tr>
  82. <tr>
  83. <td>5</td>
  84. <td>UIQtMenu</td>
  85. <td>Меню для главного окна и на ПКМ (вроде меню по добавлению/копированию/вставке/удалению узла)</td>
  86. <td>4566</td>
  87. <td>3</td>
  88. </tr>
  89. <tr>
  90. <td>6</td>
  91. <td>UIQtMenuBar</td>
  92. <td>Панель меню для главного окна</td>
  93. <td>4222</td>
  94. <td>3</td>
  95. </tr>
  96. <tr>
  97. <td>7</td>
  98. <td>UIQtRunner</td>
  99. <td>Позволяет запустить QApplication</td>
  100. <td>2450</td>
  101. <td>2</td>
  102. </tr>
  103. <tr>
  104. <td>8</td>
  105. <td>UIQtThumbnailDialog</td>
  106. <td>Диалог с изображениями</td>
  107. <td>18615</td>
  108. <td>14</td>
  109. </tr>
  110. <tr>
  111. <td>9</td>
  112. <td>UIQtToolBar</td>
  113. <td>Панель инструментов для главого окна</td>
  114. <td>4276</td>
  115. <td>3</td>
  116. </tr>
  117. <tr>
  118. <td>10</td>
  119. <td>UIQtTree</td>
  120. <td>Предоставляет сложные виджеты вроде Дерева сцены и Редактора свойств</td>
  121. <td>51216</td>
  122. <td>39</td>
  123. </tr>
  124. <tr>
  125. <td>11</td>
  126. <td>UIQtWidget</td>
  127. <td>Общие свойства виджетов вроде фокуса и видимости</td>
  128. <td>5465</td>
  129. <td>4</td>
  130. </tr>
  131. </table></p>
  132. <p><strong>Мы переработали модуль UIQt</strong> для замены старого State API на новый Environment API, который позволяет делать то же самое лаконичнее, т.е. упрощает и ускоряет разработку.</p>
  133. <p>Переработку начали в июле и должны были закончить в том же месяце. Тем не менеe, работы завершили лишь в августе. Начальный план предполагал, что 28 часов должно хватить, но мы потратили 65. Мы оценивали необходимое время на основе количества вызовов публичного API каждой компоненты. Это хорошо сработало для небольших компонент, т.к. число вызовов их публичного API было примерно равно количеству их функционала, а сам функционал был очень маленький. Однако такой подход полностью провалился для компонеты UIQtTree, составляющей 39% кода модуля UIQt, потому что не было прямой связи между публичным API и функционалом.</p>
  134. <p><strong>Новый подход к разработке на основе функционала</strong> родился после решения проблем с переработкой UIQtTree. Т.к. Qt использует MVC, компонента UIQtTree состоит из нескольких классов. К тому моменту, когда UIQtTree могла отображать и управлять иерархией элементов, компонента уже имела размер в 27К. Мы заметили, что UIQtTree стала потреблять непомерное количество времени разработки даже для мелкого функционала. Это было явным проявлением <a href="http://rsdn.org/article/philosophy/Complexity.xml">количественной сложности</a>.</p>
  135. <p>Мы решили разбить UIQtTree на базовую часть и дополнительные. База содержит лишь необходимый минимум кода. Дополнение содержит код, специфичный для данного функционала, и может быть безболезненно изменено. В случае UIQtTree, отображение и управление иерархией элементов - это минимальный функционал, а переименование элементов - это дополнение.</p>
  136. <p>Текущий функционал UIQtTree состоит из следующих возможностей:</p>
  137. <table>
  138. <tr>
  139. <th>**№**</th>
  140. <th>**Функционал**</th>
  141. <th>**Описание**</th>
  142. <th>**Размер (Б)**</th>
  143. <th>**Размер (%)**</th>
  144. </tr>
  145. <tr>
  146. <td>1</td>
  147. <td>Base</td>
  148. <td>Создание, изменение, отображение иерархии элементов</td>
  149. <td>26966</td>
  150. <td>52</td>
  151. </tr>
  152. <tr>
  153. <td>2</td>
  154. <td>Item open state</td>
  155. <td>Хранит состояние свойства скрыто/отображено элемента</td>
  156. <td>3094</td>
  157. <td>6</td>
  158. </tr>
  159. <tr>
  160. <td>3</td>
  161. <td>Item renaming</td>
  162. <td>Переименование элемента</td>
  163. <td>3471</td>
  164. <td>7</td>
  165. </tr>
  166. <tr>
  167. <td>4</td>
  168. <td>Item selection</td>
  169. <td>Получение/установка выбранного элемента</td>
  170. <td>2338</td>
  171. <td>5</td>
  172. </tr>
  173. <tr>
  174. <td>5</td>
  175. <td>Item value</td>
  176. <td>Предоставляет второй и последующие столбцы для элементов, используется Редактором свойств</td>
  177. <td>1307</td>
  178. <td>3</td>
  179. </tr>
  180. <tr>
  181. <td>6</td>
  182. <td>Item value editing</td>
  183. <td>Редактирование значений элемента с помощью стандартного виджета</td>
  184. <td>1996</td>
  185. <td>4</td>
  186. </tr>
  187. <tr>
  188. <td>7</td>
  189. <td>Item value editing with combobox</td>
  190. <td>Редактирование значений элемента с помощью виджета combobox</td>
  191. <td>5819</td>
  192. <td>11</td>
  193. </tr>
  194. <tr>
  195. <td>8</td>
  196. <td>Item value editing with spinner</td>
  197. <td>Редактирование значений элемента с помощью виджета spinbox</td>
  198. <td>5290</td>
  199. <td>10</td>
  200. </tr>
  201. <tr>
  202. <td>9</td>
  203. <td>Menu</td>
  204. <td>Меню на ПКМ</td>
  205. <td>1248</td>
  206. <td>2</td>
  207. </tr>
  208. </table>
  209. <p>Пример файла функционала Menu для UIQtTree: <a href="https://bitbucket.org/ogstudio-history/mjin/src/0c4cc3c3213f4687c0f3bd6a5426a6054cadd79b/f/TREE_MENU.cpp?at=Studio+0.10&amp;fileviewer=file-view-default">TREE_MENU</a>.</p>
  210. <p><strong>Преимущества подхода:</strong></p>
  211. <ol>
  212. <li>Более быстрое чтение/понимание благодаря небольшому размеру</li>
  213. <li>Более простое и безболезненное изменение благодаря изолированному коду</li>
  214. </ol>
  215. <p>Есть и недостаток: новый подход требует изучения.</p>
  216. <p>На этом мы заканчиваем описание самых важных технических деталей разработки за август: модуль UIQt, его переработку, новый подход к разработке на основе функционала и его преимущества.</p>
  217. <p class="subheader">Category: <a href="http://opengamestudio.org/category/news.html">News</a>
  218. </p>
  219. </article>
  220. </div>
  221. <!-- End Main Content -->
  222. <!-- Sidebar -->
  223. <aside class="large-3 columns">
  224. <!--k
  225. <h5 class="sidebar-title">Site</h5>
  226. <ul class="side-nav">
  227. <li><a href="http://opengamestudio.org/archives.html">Archives</a>
  228. <li><a href="http://opengamestudio.org/tags.html">Tags</a>
  229. <li><a href="http://opengamestudio.org/feeds/all.atom.xml" rel="alternate">Atom feed</a></li>
  230. </ul>
  231. <h5 class="sidebar-title">Categories</h5>
  232. <ul class="side-nav">
  233. <li><a href="http://opengamestudio.org/category/news.html">News</a></li>
  234. </ul>
  235. -->
  236. <h5 class="sidebar-title">Ads</h5>
  237. <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
  238. <!-- ogs2 -->
  239. <ins class="adsbygoogle"
  240. style="display:block"
  241. data-ad-client="ca-pub-4473792248813084"
  242. data-ad-slot="9024247127"
  243. data-ad-format="auto"></ins>
  244. <script>
  245. (adsbygoogle = window.adsbygoogle || []).push({});
  246. </script>
  247. </aside> <!-- End Sidebar -->
  248. </div> <!-- End Main Content and Sidebar -->
  249. <!-- Footer -->
  250. <footer class="row">
  251. <div class="large-12 columns">
  252. <hr />
  253. <div class="row">
  254. <div class="large-7 columns">
  255. <p>Proudly powered by <a href="http://getpelican.com">Pelican</a>, which takes great advantage of <a href="http://python.org">Python</a>.</p>
  256. </div>
  257. </div>
  258. </div>
  259. <script type="text/javascript">
  260. var _gaq = _gaq || [];
  261. _gaq.push(['_setAccount', 'UA-3773114-1']);
  262. _gaq.push(['_trackPageview']);
  263. (function() {
  264. var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  265. ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  266. var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  267. })();
  268. </script>
  269. </footer>