Hacker第一原则,不做重复的事情。
所以我第一件事就是去寻找哪位先生和我一样要做一个音乐播放器,无奈每一个人都是懒鬼,各种瞎搞,两小时软件使用突破天际,CPU还好点,不过说实话,MFC的弊端不就是这个嘛。
所以我拷了一个人的源码,他这个Project已经挺好了,两小时内存占用还没过1G。
试过一个人的QT项目,啧啧,两小时内存占用1.3G。
不是我吹,你这个要是交付给客户,你工作立马就没了,请动点脑子写代码好吗?不要以完成为第一要任。
在该贴贴主的基础上改的:http://tieba.baidu.com/p/2707246273?pn=2
源码下载自百度云:http://pan.baidu.com/s/1b1HKM
打不开就算了。我也没有存备份。
好了,我要开始吹水了,请大家拿好板凳坐下。
本来的界面我改了一下,如下:
毕竟是MFC做的,丑了点大家认了吧。
主要就是加入了一个导入播放列表。
导入会尝试读取MML格式的文件,至于MML格式的文件肿么样呢?
所以,不用小心翼翼的像什么Apache配置文件一样,生怕留下个字符就无法启动了不是?
那么,我的标题是老爷机打游戏还要听歌?首先我们来看一下常用的音乐软件的资源占用率吧!
应用 CPU 内存 磁盘 网络 GPU
OK,来看看基于那位贴主改造后的程序是肿么样的占用率呢?
请注意哦,这是已经开始播放歌曲啦!是同一个MP3文件。
源程序此时的CPU占用峰值4.8%,后平衡至1.6%,内存持续增长,播放第一首歌时,为18MB+,后一小时持续增长。
磁盘都是0.1MB/秒。
此外,源程序有环状播放队列,但是对于这两个按钮,无环状循环。
因此,我对这两个Button的代码做了一下修改。
其实环状循环大家都会,只是想不想得到罢了(打码的那一个等下后面吹)。
同理另一个按钮:
至于导入列表是怎么做的呢?其实也很简单,但是我想贴主并没有以一个用户的角度思考这个问题,以他那种方法添加音乐有多麻烦,是很明显的。
代码如下:
void CMPlayerDlg::OnBnClickedButton7()
{
char fliter[] = "音乐列表文件(*.mml)\0*.mml\0"
"所有文件(*.*)\0*.*\0\0";
CFileDialog fdlg(TRUE);
fdlg.m_ofn.lpstrFilter = fliter;
if (IDOK == fdlg.DoModal())
{
CString path = fdlg.GetPathName();
CString file = fdlg.GetFileName();
bool LIST_ERROR = false;
CStdioFile mml;
CString str;
mml.Open(path, CFile::modeRead);
while (mml.ReadString(str)) {
if (str.IsEmpty() || (GetFileAttributes(str)==-1) || PathIsDirectory(str)) {
LIST_ERROR = true;
continue;
}
else {
list.InsertString(list.GetCount(), str);
list.SetCurSel(list.GetCount() - 1);
}
//MessageBox(str);
}
if (LIST_ERROR) {
MessageBox("列表文件有错!已忽略所有错误音乐指向!");
}
此行打码
//list.InsertString(list.GetCount(), path);
//list.SetCurSel(list.GetCount() - 1);
}
// TODO: 在此添加控件通知处理程序代码
}
不过是使用循环读取文件,然后插入队列罢了。
实现起来估计初中生都会了。
然后是各种显示优化了,再次重复,贴主肯定没有站在用户的角度上来思考这个程序要怎么做。我们做的不仅是能用,还要好用。
如果童鞋们自行编译了那位贴主的程序肯定知道这里和我的差距了。当前播放如果路径长一点,就只能看到是哪个盘哪个文件夹的了,这样还有意义吗?
根本就没有意义了吧!还有就是添加进入列表的音乐也是这个问题,如果路径长了我连歌名都看不到,还手动切歌?
列表那个控件右对齐即可。
至于上面的正在播放,也是改了一下,变得更加亲民。
代码是这样的,我将他的修改正在播放那个代码注释了,上面的是我的。那个GetFileNameFromPath是自己写的。
各位看官想必到现在估计已经在骂我了,还以为你很厉害,这样的代码我都能写,哪来的优化,骗我呢?
请你喝一口咖啡,耐心看下去好吧。
最后的自然就是资源优化了。
所以不要着急,嗯,好东西自然都是留在最后的。
不过先说一句,因为懒得鼓捣计时器,所以干脆利用控件触发和音乐切换来进行资源缩减。
优化基于EmptyWorkingSet了,别问我为什么不自己做了,自己做肯定可以,想之前学算法各种骚优化,想了想,
还是得遵循Hacker的原则啊,不能重开发啊!
核心代码:
然后在控件事件的最后一行加入这个函数。
程序将自动清理内存空间。真正的做到了低资源占用率。
好了,听我吹水了这么久,还不关了这个界面?
还没关?那行吧,我把Github地址给你了:https://github.com/1426652334/MiniPlayer