游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6940|回复: 4

如何以最快的速度显示BMP图片?

[复制链接]

1

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2012-11-2 20:55:00 | 显示全部楼层 |阅读模式
RT,假设我的内存中有一块连续的内存中存放了一个R8G8B8格式的像素矩阵,请问有什么办法可以以最快的速度把这个矩阵所包含的图像以最快的速度绘制到窗口上?

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20515
发表于 2012-11-6 12:29:00 | 显示全部楼层

Re:如何以最快的速度显示BMP图片?

这个要看你用什么方式绘制,比如用DDraw,你把这块内存写到显存的surface里,然后blt一下,应该还是挺快。

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-11-6 16:35:00 | 显示全部楼层

Re: 如何以最快的速度显示BMP图片?

如果是最精简的,那一定是win32的SetDIBitsToDevice()函数
这是核心代码:

  1. void DrawBmp(UINT* pBmp, int width, int height, int x, int y)
  2. {
  3.         UINT* pSrc = pBmp;
  4.         UINT* pDst = g_GDI.m_pBackBuffer + y*g_GDI.m_Width+x;
  5.         for (int h=0; h<height; h++)
  6.         {
  7.                 memcpy(pDst, pSrc, width*4);
  8.                 pSrc += width;
  9.                 pDst += g_GDI.m_Width;
  10.         }
  11. }

  12. void MainLoop()
  13. {
  14.         // 清空后台像素
  15.         memset(g_GDI.m_pBackBuffer, -1, g_GDI.m_Width*g_GDI.m_Height*4);


  16.         // 绘制
  17.         DrawBmp(g_Bmp32, g_bmpWidth, g_bmpHeight, 10, 10);


  18.         // 将g_GDI.m_pBackBuffer显示到屏幕
  19.         ::SetDIBitsToDevice(g_GDI.m_hMainDC,
  20.                 0, 0, g_GDI.m_Width, g_GDI.m_Height,
  21.                 0, 0, 0, g_GDI.m_Height,
  22.                 g_GDI.m_pBackBuffer, &g_GDI.m_BmpInfo.m_BitmapInfo, DIB_RGB_COLORS);
  23. }
复制代码


足够简单吧?

ps:
附件包含了完整代码,其中图片就在代码中。

5

主题

84

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2012-12-19 13:41:48 | 显示全部楼层
微无渊 发表于 2012-11-6 16:35
如果是最精简的,那一定是win32的SetDIBitsToDevice()函数
这是核心代码:

这个代码经典,用 memcpy 来拷贝颜色数据 !!

0

主题

6

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2012-12-19 16:15:06 | 显示全部楼层
路过看看。。。






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-10 13:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表