立即显示启动画面

本文关键字:动画 启动 显示 | 更新日期: 2023-09-27 17:52:13

我们正在处理WinForm应用程序启动缓慢的问题(它是一个大型应用程序,有许多控制程序集)。控制组件是DevComponents。Ngen被用于防止jit编译,但加载时间只是减少了一点。

应用程序有一个启动屏幕,但它只在应用程序启动后12秒出现。有什么方法可以立即显示启动画面吗?

我们目前的建议是创建一个轻量级的应用程序与启动屏幕,运行主应用程序在一个单独的进程,并关闭轻量级的应用程序,当主应用程序的初始化完成。

立即显示启动画面

你永远不会得到一个。net应用程序的闪屏来立即显示即使您已经对程序集进行了NGen以消除jit编译时间,您仍然需要等待所有. net Framework dll加载到内存中。这是一个相当大的框架,在冷启动时加载需要花费大量的时间。你真的无能为力。

微软已经试图尽可能地减轻痛苦。WindowsFormsApplicationBase类(它定义在Microsoft.VisualBasic名称空间中,但不要被吓倒;它在c#应用程序中完全可用)提供了显示启动屏幕的内置机制。您所要做的就是将其SplashScreen属性设置为适当的形式,其他一切都在幕后处理。即使在冷启动情况下,它也经过了大量优化,以获得最大的响应时间,但它仍然不会是即时

您唯一的其他选择是在非托管代码中编写小包装器,其唯一目的是尽可能快地抛出启动屏幕,然后调用。net应用程序开始启动自己。当然,这里的颜色越淡越好。c++是一种选择,但C可能是更好的选择。你需要最小化你必须链接的外部库的数量,所以像MFC或Qt这样的框架肯定是不存在的:你需要直接针对Windows API。

Visual Studio团队在VS 2010中做了类似的事情。在他们的博客上有一个非常有趣的过程解释:

尽管Visual Studio 2010使用WPF作为其主窗口,但使用WPF作为启动屏需要我们等待CLR和WPF初始化,然后才能在屏幕上绘制单个像素。虽然我们在。net 4.0中对CLR和WPF的启动速度做了一些巨大的改进,但它的性能仍然无法与原始的Win32媲美。所以,我们决定使用本地c++代码和Win32来制作开机画面。

但我不会在这里花太多时间。因为你通常应该让用户选择打开和关闭启动屏幕,而大多数用户会选择关闭它,所以不太可能有很多人一开始就看到它。任何优秀的优化分析器都会告诉您,它不值得优化。

有关用c++编写并使用本机Windows api的轻量级可重用启动屏幕组件,请参阅Stefan Olson的启动屏幕。它采用了Cody Gray提到的方法,从一个单独的非CLR进程开始,然后加载主CLR应用程序。

我必须在我的上一份工作中执行完全相同的事情,我可以确认这种方法很有效——用户点击开始菜单中的程序图标和出现启动屏幕之间的时间只有几毫秒,所以感觉"瞬间"。

我同意你目前的建议。

Winforms应用程序将不会显示,除非它已经完全加载到内存中,因为它需要时间,我建议有一个加载程序,它显示的splash和执行主要的巨大的应用程序(作为一个子进程)。

在庞大的应用中,在加载时终止父应用。顺便说一句,那不会害死孩子的。

我过去做过的快速而肮脏的方法是有两个应用程序,主应用程序和闪屏应用程序。主应用程序的所有重量级dll、控件等都是正常的。闪屏应用程序只是一个应用程序和一个Windows窗体,从项目中去掉了所有不必要的参考dll——事实上,你可以更进一步,使用轻量级的。net框架(如紧凑型。net框架)或。net框架的早期版本(如1)。X或2.0

你要做的是启动闪屏应用程序并立即显示单个闪屏。有一个Windows窗体计时器(设置为100毫秒),并启用计时器作为窗体Load事件的最后一行。当计时器触发时,禁用计时器,然后启动真正的应用程序。关于如何做到这一点,请参阅本讨论。现在,主应用程序将开始启动。一旦应用程序完成了初始化并加载了第一个表单,那么就让主应用程序杀死启动屏幕应用程序。关于终止应用程序的更多信息请点击这里。