Как реализовать прокрутку страницы для чтения электронных книг с переменным размером страницы?

Я студент CS, и для того, чтобы попрактиковаться в своих навыках кодирования, я пытаюсь внедрить устройство для чтения электронных книг, и мне нужны советы от более опытных программистов. Я использую C ++ \ QML, но я постараюсь, чтобы моя проблема не была специфичной для любой технологии.

Маленькое предисловие

Как только книга открылась, я сохраняю ее в памяти. Я также создаю массив страниц. Первоначально я сохраняю в памяти:

  • текущая страница;
  • 3 страницы слева;
  • 3 страницы справа.

Последние две опции необходимы для быстрой прокрутки. Когда пользователь прокручивает одну страницу назад \ вперед, моя программа вычисляет несколько дополнительных страниц в этом направлении.

Я также разрешаю пользователю изменять размер окна, который влияет на размер страницы. И вот проблемы.

Проблема

Каждый раз, когда пользователь меняет размер окна, он меняет размер страницы => программе необходимо пересчитать состояние отображаемой на данный момент страницы (ее размер и содержание), а также соседние страницы. Это занимает некоторое время.

Таким образом, каждый раз, когда пользователь просто играет с окном приложения, моя программа с трудом проводит расчеты. Эти вычисления занимают некоторое время и замедляют работу всего приложения.

Что я сделал для его решения

  1. Я подумал о том, чтобы запретить пользователю вручную изменять размер окна (и дать ему несколько разрешенных размеров страниц), но я не уверен, насколько он удобен для пользователя :) В этом случае я мог бы рассчитать страницы предопределенных размеров на так что он не замедлит приложение так сильно, как сейчас.
  2. Я думал, что многопоточность спасет меня. Как настоящий новичок сначала я делал все в одном потоке. Пока мое приложение начало работать (медленно, конечно, потому что мой графический интерфейс иногда зависал из-за вычислений), я ввел многопоточность, и теперь мой графический интерфейс и рабочий поток являются отдельными. Сейчас это немного быстрее, но иногда я вижу, как медленно это происходит на маленьком ноутбуке, когда вы прокручиваете страницы быстрее, чем черепаха.

Итак, мой вопрос: насколько уместен мой подход? Является ли это разумным вообще и каковы способы улучшить производительность?

3 голоса | спросил Neilana 7 FebruaryEurope/MoscowbWed, 07 Feb 2018 07:52:28 +0300000000amWed, 07 Feb 2018 07:52:28 +030018 2018, 07:52:28

3 ответа


3

Это определенно хорошая идея отделить выкладку страниц от рендеринга. Хорошей идеей является также размещение их на разных потоках. Я не думаю, что решение состоит в том, чтобы делать спекулятивный макет на разных размерах. Я думаю, вы в конечном итоге делаете много ненужной работы. Мне также не нравится идея заставить пользователя установить несколько размеров.

Что я буду делать дальше, это профилировать ваше приложение, чтобы узнать, что занимает наибольшее время во время макета страницы. Профилировщик расскажет вам, какая функция занимает больше времени в вашем приложении. Затем вы можете изучить эту функцию, чтобы определить, почему она занимает так много времени. Часто операцию можно выполнить быстрее, используя другую структуру данных, другую структуру данных или другой алгоритм. Например, для нахождения максимального значения в массиве требуется каждый раз проверять каждый элемент, чтобы увидеть, больше ли этот элемент, чем текущий максимум. Но если массив уже отсортирован, для последнего элемента требуется только одно чтение.

После того как вы профилировали свой код, вы можете работать над тем, чтобы сделать эти функции более быстрыми, или задавать больше вопросов здесь, чтобы лучше подойти к проблеме.

ответил user1118321 7 FebruaryEurope/MoscowbWed, 07 Feb 2018 08:51:03 +0300000000amWed, 07 Feb 2018 08:51:03 +030018 2018, 08:51:03
1

Я полагаю, что повторный расчет, который вы упомянули, - это расчет потока текста, поскольку вы сохраняете размер шрифта одинаковым, но изменяете область страницы?

  1. Вам нужно оптимизировать логику рендеринга /растрирования страницы для скорости.
  2. Смежные страницы могут быть сохранены в более низком качестве /разрешении.
  3. Каждая страница может иметь свою собственную подпрограмму /задачу рендеринга на отдельном рабочем потоке (с поддержкой очереди FIFO и поддержкой отмены), которая может выполняться отдельно от переключения страницы.
  4. Переключение страниц или изменение размера просто перераспределяет содержимое (начало /конец) между страницами памяти. Фактическая работа рендеринга представляется рабочей очереди (# 3).
  5. Страницы, выходящие за пределы области действия, отмените любую незавершенную задачу рендеринга в очереди.
  6. Рабочий поток выбирает задачи, которые были недавно отправлены в очередь FIFO. То есть: сначала отображается страница, представленная пользователю.

Общий эффект будет заключаться в том, что пользователь может переключаться или изменять размер так быстро, как ему нравится, содержимое будет появляться с небольшой задержкой, как только будет выполнена его задача рендеринга в рабочей очереди (# 3).

ответил S.D. 7 FebruaryEurope/MoscowbWed, 07 Feb 2018 10:03:03 +0300000000amWed, 07 Feb 2018 10:03:03 +030018 2018, 10:03:03
-1

Содержимое страницы не должно изменяться в зависимости от размера холста дисплея. Вы выбираете ненужную сложность, потому что вы обрабатываете страницы книг так, как если бы они были HTML-страницами. Это не так.

Страница 47 «Остров сокровищ» должен быть одного и того же контента, независимо от уровня масштабирования. Большинство читателей электронных книг почитают разбиение на страницы оригинальной печатной книги.

Как только вы устраняете необходимость перетасовывать контент, ваш рендеринг и прокрутка страницы становятся намного проще. Неважно, используете ли вы параметр процентного увеличения или параметр фиксированного размера (маленький, средний, большой и т. Д.) Или используете физический размер окна. Для каждого размера холста экрана вам просто нужно выбрать соответствующий шрифт, поместить текст по горизонтали и позволить ему растягиваться по вертикали с помощью полосы прокрутки.

ответил Mark Benningfield 7 FebruaryEurope/MoscowbWed, 07 Feb 2018 11:04:23 +0300000000amWed, 07 Feb 2018 11:04:23 +030018 2018, 11:04:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132