Почему игры работают быстро, а бизнес-приложения тормозят
Хотите пойти прямо и посмотреть, что это такое? Сразу дам ссылки!
Вы когда-нибудь замечали, как молниеносно работают игры, в то время как бизнес-приложения и приложения для повышения производительности часто отстают в плане скорости и отклика?
В то время как игры отдают предпочтение скорости, чтобы обеспечить увлекательный пользовательский опыт, другие типы приложений сосредоточены на предоставлении различных форм ценности. Однако что их отличает с технической точки зрения?
Разве не было бы здорово, если бы бизнес-приложения и приложения для повышения производительности могли обеспечивать такую же плавность работы, как и игры?
В этой статье мы коснемся основных причин, но, что более важно, предложим потенциальное решение для преодоления разрыва с помощью Rust.
Технические отличия
Игры разрабатываются с учетом производительности, часто с использованием низкоуровневых языков, таких как C++, и графических библиотек, таких как OpenGL, Metal, DirectX и Vulkan.
С другой стороны, бизнес-приложения могут использовать такие технологии, как JavaScript и React, чтобы повысить производительность разработчиков, иногда жертвуя производительностью. Хотя производительность остается желательной, она не всегда является критическим фактором для этих приложений.
Преодоление разрыва с помощью Rust
Я думаю, что Rust может сыграть решающую роль в преодолении разрыва между игровой производительностью и разработкой бизнес-приложений. Rust предлагает уникальное сочетание низкоуровневого контроля и высокой производительности для разработчиков.
Применяя Rust, разработчики бизнес-приложений могут извлечь выгоду из его функций, ориентированных на производительность, сохраняя при этом свою продуктивность.
Представляем приложение
Чтобы изучить возможности преодоления разрыва в производительности, я разработал фреймворк под названием Appy. Чтобы выделить его особенности:
- Прямое аппаратное ускорение. Appy рисует свои графические элементы напрямую, используя аппаратное ускорение, в настоящее время использующее OpenGL. Он избегает использования WebView, DOM или Virtual DOM, черпая вдохновение из практики разработки игр.
- Концепции, подобные React. Appy использует несколько концепций React, таких как XML, функциональные компоненты, крючки и контексты, для повышения производительности разработчиков. Однако он не полагается на виртуальный DOM, что обеспечивает более эффективный рендеринг.
- Упрощенная сборка и развертывание. Appy предоставляет инструмент командной строки, который компилирует приложение с помощью одной команды, подстраиваясь под знакомую среду программистов на Rust. Это устраняет необходимость в сложных инструментах, таких как Android Studio. Хотя текущая реализация ориентирована на Android, работа над поддержкой iOS также ведется.
Прогресс и следующие шаги
В настоящее время исходный код доступен на GitHub, а пример калькулятора, созданного с помощью Appy, можно загрузить с testapp.io. Он публикуется в виде крейта, и доступна документация.
Кроме того, фреймворк теперь поддерживает различные библиотеки создания окон и контекстов. Инструмент развертывания обновлен и переименован в cargo-sdl-apk. Хотя приложение Appy еще не закончено, оно достигло пригодного для использования состояния, и на данный момент я действительно был бы достаточно уверен, чтобы взяться за разработку приложения на основе Appy.
Связь с другими решениями
С момента моей последней статьи, в которой я представил Appy около месяца назад, я получил много отличных отзывов от сообщества Rust. Один вопрос, который я получил, заключается в том, что отличает Appy от других библиотек. Очевидно, что хорошие идеи никогда не существуют изолированно! Вот небольшое сравнение:
- Yew — это фреймворк Rust, который также использует XML, но выполняет рендеринг в DOM в браузере, таком как React. Можно сказать, что если Yew похож на React, то Appy больше похож на React Native.
- Dioxus также является декларативной средой пользовательского интерфейса Rust. Текущая реализация, по-видимому, в первую очередь ориентирована на Интернет, но архитектура не зависит от платформы. Freya — это экспериментальное воплощение, использующее собственный рендеринг, но в настоящее время ориентированное только на настольные платформы. Dioxus не использует XML, но использует что-то функционально похожее. Из существующих решений я бы сказал, что комбинация Dioxus/Freya представляет собой видение, наиболее похожее на мое.
Почему XML?
Другой вопрос, который я получил, заключается в том, почему я использую XML для объявления элементов компонентов. Я предполагаю, что ответ заключается в том, что это делает реакция, и поэтому она знакома.
Очевидно, что это хорошая вещь, чтобы оспорить это предположение. Чтобы сделать объяснение более информативным, позвольте мне сначала показать, как на самом деле выглядит код приложения:
use appy::{components::*, types::*, *}; #[main_window] pub fn app() -> Elements { apx! { <blk height=pct(50)> <bg color=0x000080/> <text text="Hello Blue World" color=0x8080ff /> </blk> } }
Что-то более полное, см. код для примера калькулятора, где очевидно, что деревья компонентов для любого реального приложения довольно быстро уходят довольно глубоко. Я думаю, что XML — лучший инструмент для работы, чтобы сделать это читабельным и управляемым.
Однако я понимаю, что не все согласны, и поэтому вышеизложенное также можно записать так:
use appy::{components::*, types::*, *}; #[main_window] pub fn app() -> Elements { vec![ blk().height(pct(50)).children(vec![ bg().color(0x000080), text().text("Hello Blue World").color(0x8080ff) ]) ] }
Заключение
Игры известны своей высокой производительностью, в то время как бизнес-приложения часто отдают приоритет различным аспектам предоставления ценности. Однако, используя язык программирования Rust и внедряя инфраструктуру Appy, разработчики могут сократить разрыв и создавать бизнес-приложения с игровой плавностью и интерактивностью.
Благодаря продолжающейся разработке и потенциальному расширению до iOS Appy обещает предоставить разработчикам возможность создавать высокопроизводительные бизнес-приложения без ущерба для производительности.