使用UpdateLayeredWindow做桌面歌词,发现GetHbitmap(Color)效率太低,新手求帮助

小红帽A_A 2013-03-03 06:08:47







桌面歌词需要实时更新,所以需要实时调用UpdateLayeredWindow函数画透明界面。timer是40毫秒,但是做好之后发现CPU使用率偏高,比酷狗,千千静听高太多了,奇怪了。使用性能分析发现是主要是GetHbitmap(Color)这个方法的问题。想打算用C++把SetBits(bitmap bitmap)封装一个dll来使用,不知道能否提升性能。 但是没学过C++没能成功。

本想再做个频谱,但是这样的效率。。。

希望高手能给点帮助!!!
...全文
886 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 30 楼 dylike 的回复:
我现在的任何一个窗口都是updatelayeredwindow,而且都是动态的。
求分享- -。
dylike 2013-04-20
  • 打赏
  • 举报
回复
我现在的任何一个窗口都是updatelayeredwindow,而且都是动态的。
mrsupersky 2013-04-20
  • 打赏
  • 举报
回复
引用 28 楼 dylike 的回复:
引用 26 楼 shigaofei1 的回复:引用 13 楼 dylike 的回复:1 迅雷不是用的.NET,所以不是边解释边编译,没有中间复杂的转换过程 2 迅雷虽然也用updatelayeredwindow,但图像创建部分是Directx 3 updatelayeredwindow本身的效率是高的,慢是慢在GDI+上和.NET代码的托管处理上. 别瞎说了。。。。……
3 updatelayeredwindow本身的效率是高的,慢是慢在GDI+上和.NET代码的托管处理上. 我上面说的主要是针对这句话。。。。 你可以试试用Vc 调用updatelayeredwindow 函数看看,效率有多高。。。
dylike 2013-04-15
  • 打赏
  • 举报
回复
引用 26 楼 shigaofei1 的回复:
引用 13 楼 dylike 的回复:1 迅雷不是用的.NET,所以不是边解释边编译,没有中间复杂的转换过程 2 迅雷虽然也用updatelayeredwindow,但图像创建部分是Directx 3 updatelayeredwindow本身的效率是高的,慢是慢在GDI+上和.NET代码的托管处理上. 别瞎说了。。。。别误导群主。。。
好的,误导群主了,抱歉,当我没说。
mrsupersky 2013-04-15
  • 打赏
  • 举报
回复
LZ的桌面歌词 显然 比酷狗的,面积要大很多吧。。。 当然迅雷怎么弄的我确实还不是很清楚。。。。
mrsupersky 2013-04-15
  • 打赏
  • 举报
回复
引用 13 楼 dylike 的回复:
1 迅雷不是用的.NET,所以不是边解释边编译,没有中间复杂的转换过程 2 迅雷虽然也用updatelayeredwindow,但图像创建部分是Directx 3 updatelayeredwindow本身的效率是高的,慢是慢在GDI+上和.NET代码的托管处理上.
别瞎说了。。。。别误导群主。。。
ttsping 2013-04-08
  • 打赏
  • 举报
回复
先PS,lz的代码好像和有个桌面金鱼的一样。。 貌似GDI+中那个函数效率不高,自己写个替换试试: 以下摘抄自FOOBAR插件wsh mod
    HBITMAP create_hbitmap_from_gdiplus_bitmap(Gdiplus::Bitmap * bitmap_ptr)
    {
        BITMAP bm;
        Gdiplus::Rect rect;
        Gdiplus::BitmapData bmpdata;
        HBITMAP hBitmap;

        rect.X = rect.Y = 0;
        rect.Width = bitmap_ptr->GetWidth();
        rect.Height = bitmap_ptr->GetHeight();

        if (bitmap_ptr->LockBits(&rect, Gdiplus::ImageLockModeRead, PixelFormat32bppPARGB, &bmpdata) != Gdiplus::Ok)
        {
            // Error
            return NULL;
        }

        bm.bmType       = 0;
        bm.bmWidth      = bmpdata.Width;
        bm.bmHeight     = bmpdata.Height;
        bm.bmWidthBytes = bmpdata.Stride;
        bm.bmPlanes     = 1;
        bm.bmBitsPixel  = 32;
        bm.bmBits       = bmpdata.Scan0;

        hBitmap = CreateBitmapIndirect(&bm);
        bitmap_ptr->UnlockBits(&bmpdata);
        return hBitmap;
    }
summer_insects 2013-04-03
  • 打赏
  • 举报
回复
按楼主在19楼的提示,我倒是实现出跟酷狗差不多的效果了 也是40MS一刷新,也是用的UpdateLayeredWindow,基本上不占CPU 不知道为什么你的会那么占CPU
summer_insects 2013-03-11
  • 打赏
  • 举报
回复
PS:我用XueTr看了,酷狗的没有加载gdiplus.dll
laviewpbt 2013-03-11
  • 打赏
  • 举报
回复
GetHbitmap实际是调用的GdipCreateHBITMAPFromBitmap函数,这个函数会重新创建一个图像的,然后再把Bitmap的数据拷贝到HBITMAP中,看楼主下面的代码,应该是想调用AlphaBlend来显示PNG图像,由于AlphaBlend需要PARGB的数据才能正确显示PNG,楼主应该还要做个ARGB-->的转换过程,这个速度就还不如GDI+的DrawImage了。 如果楼主的图像大小固定并且一定要使用AlphaBlend函数,我的方案是先创建好一副32位的DIBSECTION,然后每次要处理时,用GDI+的Lockbits 配合 ImageLockMode.UserInputBuffer 以及 PixelFormat.Format32bppPArgb参数 将数据写入DIBSECTION的内存中,在显示。
summer_insects 2013-03-11
  • 打赏
  • 举报
回复
楼主,我用C写了个DLL,可以用来解KRC歌词,你要的话给个邮箱

另外我也想做桌面歌词,只是锯齿问题不知道怎么解决,
我仔细看了酷狗的
截了张图

注意到,当黑色字遇到白色背景时,它的边缘做了抗锯齿
而黑色字遇到黑色背景,则什么都看不见
而,白色字遇到白色背景时,边缘有勾连,而且也做了抗锯齿
白色字遇到黑色背景,同样也有边缘抗锯齿
想了几天都不知道这个效果是怎么实现的
小红帽A_A 2013-03-11
  • 打赏
  • 举报
回复
引用 22 楼 lllanm 的回复:
楼主 你那个资源样本占用 用的是什么工具 可以介绍一下么
就是VS2010自带的性能分析工具!
lllanm 2013-03-11
  • 打赏
  • 举报
回复
楼主 你那个资源样本占用 用的是什么工具 可以介绍一下么
summer_insects 2013-03-11
  • 打赏
  • 举报
回复
引用 19 楼 woshixiaohongmao 的回复:
引用 16 楼 wohaaitinciu 的回复:楼主,我用C写了个DLL,可以用来解KRC歌词,你要的话给个邮箱 另外我也想做桌面歌词,只是锯齿问题不知道怎么解决, 我仔细看了酷狗的 截了张图 注意到,当黑色字遇到白色背景时,它的边缘做了抗锯齿 而黑色字遇到黑色背景,则什么都看不见 而,白色字遇到白色背景时,边缘有勾连,而且也做了抗锯齿 白色字遇到……
但是,我用XueTr看了,酷狗的没有加载gdiplus.dll
小红帽A_A 2013-03-11
  • 打赏
  • 举报
回复
引用 17 楼 laviewpbt 的回复:
GetHbitmap实际是调用的GdipCreateHBITMAPFromBitmap函数,这个函数会重新创建一个图像的,然后再把Bitmap的数据拷贝到HBITMAP中,看楼主下面的代码,应该是想调用AlphaBlend来显示PNG图像,由于AlphaBlend需要PARGB的数据才能正确显示PNG,楼主应该还要做个ARGB-->的转换过程,这个速度就还不如GDI+的D……


我不是使用AlphaBlend函数,AlphaBlend函数不是用来图像混合的吗!而我用的是UpdateLayeredWindow函数来做透明窗体。
调用UpdateLayeredWindow函数的这些代码是来自互联网的,GetHbitmap方法是将GDI+对象转为GDI对象,如果不使用GDI对象能调用UpdateLayeredWindow来实现透明窗体吗?
接着上面的代码:
小红帽A_A 2013-03-11
  • 打赏
  • 举报
回复
引用 16 楼 wohaaitinciu 的回复:
楼主,我用C写了个DLL,可以用来解KRC歌词,你要的话给个邮箱 另外我也想做桌面歌词,只是锯齿问题不知道怎么解决, 我仔细看了酷狗的 截了张图 注意到,当黑色字遇到白色背景时,它的边缘做了抗锯齿 而黑色字遇到黑色背景,则什么都看不见 而,白色字遇到白色背景时,边缘有勾连,而且也做了抗锯齿 白色字遇到黑色背景,同样也有边缘抗锯齿 想了几天都不知道这……
使用GDI+绘图就可以有抗锯齿的效果。 修改绘图对象的平滑模式为抗锯齿。再画路径和填充路径。 g.SmoothingMode = SmoothingMode.AntiAlias;
dylike 2013-03-09
  • 打赏
  • 举报
回复
我是非常热衷层窗体的,但涉及频繁绘制,我不敢用大面积.
dylike 2013-03-09
  • 打赏
  • 举报
回复
1 迅雷不是用的.NET,所以不是边解释边编译,没有中间复杂的转换过程 2 迅雷虽然也用updatelayeredwindow,但图像创建部分是Directx 3 updatelayeredwindow本身的效率是高的,慢是慢在GDI+上和.NET代码的托管处理上.
菜牛 2013-03-09
  • 打赏
  • 举报
回复
你去逐个写点效率可想而知,用剪裁区域直接绘制上去。
Yale_Yange 2013-03-08
  • 打赏
  • 举报
回复
引用 11 楼 woshixiaohongmao 的回复:
引用 10 楼 Grey110 的回复:引用 8 楼 woshixiaohongmao 的回复:引用 5 楼 dylike 的回复:减少绘制面积是提升性能的最好方法。 但是,我就是需要一个大窗体显示歌词啊!但是,迅雷的界面为什么效率那么高啊!还是动态半透明的! 之前我做的仿酷狗歌曲列表,你提示了,绘制需要绘制的部分,我现在也这样建议你 你没用过UpdateL……
是我最近才在网上无意中找到的 java版本的代码,还没来得及翻译成C#的,先给你吧
加载更多回复(11)
源码链接: https://pan.quark.cn/s/a4b39357ea24 ### Ubuntu 用户磁盘空间分配与 Linux 硬盘分区方案深入剖析 #### 标题与描述中的核心知识要点说明 本文件将系统性地阐释在 Ubuntu 操作系统中如何为用户科学地分配磁盘空间,并深入分析适用于 Linux 的硬盘分区策略。文件不仅会介绍基础的目录结构及其功能,还会提供具体的分区指导以及在实际操作过程中需要留意的事项。 #### 目录结构及其功能说明 - **/bin**:系统常用基础命令的存储位置。 - **/boot**:包含启动时所需文件,例如内核镜像和初始化脚本等。 - **/dev**:存放设备文件。 - **/etc**:存储系统配置信息。 - **/home**:用户个人目录,每个用户拥有独立的子目录。 - **/lib**:存放运行二进制文件所需的共享库。 - **/mnt**:用于临时挂载其他文件系统的目录,可用于挂载软盘或 CD-ROM 设备。 - **/proc**:虚拟文件系统目录,存储当前运行内核的相关信息。 - **/root**:超级用户(root)的主目录。 - **/sbin**:系统管理程序的存放位置。 - **/tmp**:临时文件存储的目录。 - **/usr**:存放只读数据,包括应用程序的可执行文件和文档等。 - **/var**:存储可变数据文件,例如日志文件和邮件队列等。 - **/X11R6**:X Window 系统的安装路径。 #### 硬盘分区策略分析 文件中强调,在 Linux 环境下进行硬盘分区时需要综合考量多个因素,以确保系统的稳定运行和性能表现。以下是一些关键的分区建议: 1. **/boot ...
代码转载自:https://pan.quark.cn/s/4f1937b2c732 Quartus Prime是由Altera公司(现已被Intel公司所收购)研发的一款集成化电子设计自动化软件,其主要应用领域在于Field-Programmable Gate Array(现场可编程门阵列)以及Complex Programmable Logic Device(复杂可编程逻辑器件)的设计、仿真、综合、布局布线以及编程等任务。在本案例中,所提及的为Quartus Prime 17.1版本的安装程序,该程序内含器件库文件及其他相关组件,适用于Windows 10 64位操作系统环境,并且已有相关测试验证其可用性。 **1. Quartus Prime概述** Quartus Prime是Altera/Intel公司FPGA设计流程的核心工具,它提供了一个集成化的开发平台,支持从设计概念到硬件实现的完整过程。该软件不仅涵盖了逻辑综合、时序分析、仿真、物理设计等基础功能,还包含了高速接口IP核、嵌入式处理器系统、内存资源管理等多种高级特性。 **2. Quartus Prime 17.1版本的新增功能** - QSYS系统构建工具的优化:17.1版本可能对QSYS系统进行了升级,使得系统集成更为便捷,支持更多的外部设备和处理器模型。 - 性能提升:可能增强了综合和布局布线的效率,降低了设计的功耗和面积。 - 新器件支持:可能会增加对最新发布的Altera FPGA和CPLD产品的支持,如Arria 10、Cyclone 10等系列产品。 - 调试功能的改进:可能强化了硬件调试工具,如JTAG调试和软件调试器的性能。 **3. 器件库文件** 器件库文件是Quartu...

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧