标题:gdiplus绘制占用cpu的问题
只看楼主
xyzdwf
Rank: 2
等 级:论坛游民
威 望:1
帖 子:52
专家分:10
注 册:2017-1-9
结帖率:88.89%
 问题点数:0 回复次数:1 
gdiplus绘制占用cpu的问题
最近用gdiplus绘制gui,滚动条滚动和鼠标频繁hover时发现cpu占用会升高很多,以为是事件传播低效的问题,但如果注释掉最后的绘制,事件传播几乎不消耗cpu,任务管理器中一直是0,加上绘制就占用比较高
下面是我绘制的代码,是网络上找的双缓冲绘制,自己的图形绘制是在gui_context_draw中进行,论坛里的高手帮我看看有没有问题
程序代码:
void gui_gdiplus_paint(gui_gdiplus_context_p context, HWND hwnd, HDC hdc)
{
    RECT rect;
    GpBitmap* bitmap;
    GpGraphics* hdcgraphic;
    
    GetClientRect (hwnd, &rect);
    GdipCreateFromHDC(context->hdc, &hdcgraphic);
    GdipCreateBitmapFromGraphics(rect.right, rect.bottom, hdcgraphic, &bitmap);
    
    GdipGetImageGraphicsContext(bitmap, &context->graphics);
//    GdipSetTextRenderingHint(context->graphics, 3);
//    GdipSetSmoothingMode(context->graphics, SmoothingModeAntiAlias);
    
    gui_context_draw(context->ctx);
    
    GdipDrawImageI(hdcgraphic, bitmap, 0, 0);
    
    GdipDisposeImage(bitmap);
    GdipDeleteGraphics(hdcgraphic);
    GdipDeleteGraphics(context->graphics);
}

以下是打的32位exe,不知道能不能在64为系统下运行
gdiplustest.zip (118.51 KB)

搜索更多相关主题的帖子: graphics HWND cpu bitmap 绘制 
2021-09-10 12:07
xyzdwf
Rank: 2
等 级:论坛游民
威 望:1
帖 子:52
专家分:10
注 册:2017-1-9
得分:0 
自己试了好多方式,也没找到好的解决办法,用上CachedBitmap也然并卵,除了多占了点内存,cpu占用依旧
程序代码:
//用上CachedBitmap
void gui_gdiplus_paint(gui_gdiplus_context_p context, HWND hwnd, HDC hdc)
{
    GpCachedBitmap* cache;
    GpBitmap* bitmap;
    GpGraphics* hdcgraphic;
    
    GdipCreateFromHDC(hdc, &hdcgraphic);
    GdipCreateBitmapFromGraphics(context->ctx->width, context->ctx->height, hdcgraphic, &bitmap);
    GdipGetImageGraphicsContext(bitmap, &context->graphics);

    gui_context_draw(context->ctx);
    
    GdipCreateCachedBitmap(bitmap, hdcgraphic, &cache);
    GdipDrawCachedBitmap(hdcgraphic, cache, 0, 0);

    GdipDeleteCachedBitmap(cache);
    GdipDeleteGraphics(context->graphics);
    GdipDisposeImage(bitmap);
    GdipDeleteGraphics(hdcgraphic);
}



还是直接绘制, 不用双缓冲占用cpu很低,但是滚动的时候能闪瞎眼睛
程序代码:
//不用缓冲直接绘制
void gui_gdiplus_paint(gui_gdiplus_context_p context, HWND hwnd, HDC hdc)
{
    GdipCreateFromHDC(hdc, &context->graphics);

    gui_context_draw(context->ctx);
    
    GdipDeleteGraphics(context->graphics);
}


以下是打的32位exe
gdiptest.zip (241.71 KB)


[此贴子已经被作者于2021-9-14 19:28编辑过]

2021-09-14 19:19



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506807-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013035 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved