Показывать заставку сразу - PullRequest
4 голосов
/ 21 апреля 2011

Мы имеем дело с медленным запуском для приложений WinForm (это большое приложение с множеством управляющих сборок).Управляющие сборки являются DevComponents.Ngen был применен для предотвращения JIT-компиляции, но время загрузки немного уменьшилось.

Приложение имеет заставку, но оно появляется только через 12 секунд после запуска приложения.Есть ли какой-либо подход к одновременному отображению заставки?

Наше текущее предложение - создать облегченное приложение с заставкой, запустить основное приложение в отдельном процессе и закрыть облегченное приложение при инициализацииОсновное приложение готово.

Ответы [ 4 ]

12 голосов
/ 21 апреля 2011

Вы никогда не получите заставку для приложения .NET, чтобы показать мгновенно . Даже если вы собрали сборки NGen, чтобы исключить время JIT-компиляции, вам все равно придется подождать, пока все библиотеки .NET Framework загрузятся в память. Это довольно большой фреймворк, и при холодном старте загрузка занимает нетривиальное время. С этим ничего не поделаешь.

Microsoft пыталась максимально облегчить боль. Класс WindowsFormsApplicationBase (он определен в пространстве имен Microsoft.VisualBasic, но не пугает вас; его можно использовать в приложении C #) предоставляет встроенный механизм для отображения заставки. , Все, что вам нужно сделать, это установить для свойства SplashScreen соответствующую форму, а все остальное обрабатывается за кадром. Он был сильно оптимизирован для максимального времени отклика, даже в ситуации холодного запуска, но все равно он не будет мгновенный .

Единственный другой вариант, который у вас есть, - это написать небольшую оболочку в неуправляемом коде, единственная цель которой - как можно быстрее вывести всплывающее окно, а затем вызвать ваше приложение .NET, чтобы начать его запуск. Чем светлее, тем лучше здесь, конечно. C ++ - это вариант, но C, вероятно, лучше. Вам нужно минимизировать количество внешних библиотек, которые вы должны связать, поэтому такая инфраструктура, как MFC или Qt, определенно отсутствует: вам нужно напрямую ориентироваться на API Windows.

Команда Visual Studio сделала нечто похожее в VS 2010. У них есть довольно интересное объяснение процесса , доступное в их блоге :

Несмотря на то, что Visual Studio 2010 использует WPF для своего главного окна, использование WPF для заставки потребует от нас ожидания инициализации CLR и WPF, прежде чем мы сможем нарисовать один пиксель на экране. Несмотря на то, что мы сделали несколько значительных улучшений в скорости запуска CLR и WPF в .Net 4.0, она все еще не вполне соответствует производительности исходного Win32. Итак, выбор был сделан, чтобы остаться с собственным кодом C ++ и Win32 для заставки.

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

5 голосов
/ 30 октября 2012

Облегченный, многократно используемый компонент заставки, написанный на C ++ и использующий собственные API-интерфейсы Windows, см. Всплывающее окно Стефана Олсона . В подходе, на который ссылается Коди Грей, используется отдельный не-CLR-процесс, который затем загружает основное приложение CLR.

Мне пришлось реализовать ту же самую вещь на моей последней работе, и я могу подтвердить, что подход работает хорошо - время между нажатием пользователем значка программы в меню «Пуск» и появлением заставки составляет всего несколько миллисекунд, и так чувствует себя «мгновенно».

1 голос
/ 21 апреля 2011

Я бы сказал, согласитесь с вашим текущим предложением.

Приложение Winforms не будет отображаться, если оно полностью не загружено в память, и, поскольку оно требует времени, я бы предложил иметь приложение-загрузчик, которое показывает всплеск и выполняет главное огромное приложение (как дочерний процесс).

В огромном приложении завершите работу родительского приложения при загрузке. Это не убьет ребенка, кстати.

0 голосов
/ 21 апреля 2011

Быстрый и грязный способ, который я сделал в прошлом, состоит в том, чтобы иметь два приложения, ваше основное приложение и ваше приложение-заставку. Основное приложение нормально со всеми его тяжелыми библиотеками DLL, элементами управления и т. Д. Приложение-заставка - это просто приложение и одна форма Windows со всеми ненужными ссылочными библиотеками DLL, удаленными из проекта - фактически вы можете сделать этот шаг еще дальше и используйте облегченный .NET-фреймворк, например, компактный .NET-фреймворк или более раннюю версию .NET-фреймворка, например 1.X или 2.0.

Что бы вы сделали, это запустили приложение-заставку и сразу же показали единственный экран-заставку. Имейте таймер формы Windows (установлен, скажем, на 100 мс) и включите таймер в качестве последней строки события Load формы. Когда таймер срабатывает, отключите таймер, а затем запустите ваше реальное приложение. См. это обсуждение , чтобы узнать, как это сделать. Теперь основное приложение начнет запускаться. Как только приложение выполнено с его инициализацией и, возможно, загрузкой первой формы, тогда заставьте основное приложение уничтожить приложение с заставкой. Подробнее об убийстве приложения здесь .

...