2013年4月10日星期三 (DEMO7——6使用blitter)

2023-11-04

本来打算晚上进行封装,不过由于上午进行HDR,只剩下RENDERBLOOM()了,有些疲倦,不妨先进行封装,闲话少说,现在是14:18,开始进行了。

这1节还是开头强调了硬件局限性,目前当然没有这个问题了,只考虑封装方法吧 。

大概浏览了一下这一节,主要说明了硬件blitter的优点,克服了以前的双缓冲的缺点

1,   速度加快,内存矩形填充代替逐行复制。

2,   透明色可以挑出,不复制。

从这里可以纠正上一节的错误,就是blt不只是窗口复制,也可以用于全屏。而双缓冲只能用于全屏

 

这部分主要讲了Blt()函数的使用,当然,也有个BltFast(),但是,我感觉意义不大。

BLT()函数的几个参数

Blt( 目标矩形,源表面,源矩形,标志,DDBLTFX参数);

具体使用方法

1,   将填充色彩或色彩索引放进DDBLTFX结构的dwFillColor字段

2,   将标志写为DDBLT_COLORFIL \ DDBLT_WAIT

在这个DEMO中,只是单纯BLT到目标表面,没有源表面,所以,其余可以写为NULL,

理论部分就这些,看看具体例子吧。

这个DEMO是16位,#define SCREEN_BPP      16    // bits per pixel

也不用锁定内存了,直接BLT,只需要设置颜色,目标矩形即可。也不用SLEEP()了。

初始化时,ddsd.dwFlags没有DDSD_BACKBUFFERCOUNT;了,当然也没有ddsd.dwBackBufferCount,

ddsd.ddsCaps.dwCaps也没有 DDSCAPS_COMPLEX | DDSCAPS_FLIP了。调色板可以不要了。

运行结果这样了,终于不全屏白点了。

 

 

现在考虑如何把这个弄到引擎过去,

HRESULT DDRAW_Interface::InitDDraw( HWND hWnd, DWORD width, DWORD height, DWORD bpp, bool windowed  )

{

if( m_bWindowed == true )

         {

              m_dwCooprativeFlags = DDSCL_NORMAL;

              m_lpdd->SetCooperativeLevel( m_hWnd,  m_dwCooprativeFlags );

 

              if ( m_dwBPP == 8)

              {

                   for ( int index = 0; index < 10; index ++)

                   {

                       palette[index].peFlags = palette[index+246].peFlags = PC_EXPLICIT;

 

                   }

                   // create the palette object

                   if (FAILED( m_lpdd->CreatePalette(DDPCAPS_8BIT | DDPCAPS_INITIALIZE,

                       palette,&m_lpddpal, NULL)))

                   {

                        // error

                       return(0);

                   } // end if

              }

 

              DDSURFACEDESC2        ddsd;    

 

              // clear ddsd and set size

              DDRAW_INIT_STRUCT( ddsd );

              // enable valid fields

              ddsd.dwFlags = DDSD_CAPS;

              // request primary surface

              ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

 

              // create the primary surface

              if (FAILED( m_lpdd->CreateSurface(&ddsd, &m_lpddsprimary, NULL)))

              {

                   // error

                   return(0);

                                 } // end if

}

 

int Game_Main(void *parms = NULL, int num_parms = 0)

{

 

     // for now test if user is hitting ESC and send WM_CLOSE

     if (KEYDOWN(VK_ESCAPE))

     {

         exit( 0 );

         //PostMessage(main_window_handle,WM_CLOSE,0,0);

     } // end if

    

     DDBLTFX       ddbltfx;

     RECT     dest_rect;

 

DDRAW_INIT_STRUCT( ddbltfx );

     ddbltfx.dwFillColor              = _RGB16BIT565( rand() % 256, rand() % 256, rand() % 256 );

 

     int x1                           = rand() % SCREEN_WIDTH;

     int  y1                          = rand() % SCREEN_HEIGHT;

     int  x2                          = rand() % SCREEN_WIDTH;

     int  y2                          = rand() % SCREEN_HEIGHT;

 

     dest_rect.left                   = x1;

     dest_rect.top               = y1;

     dest_rect.right                  = x2;

     dest_rect.bottom            = y2;

 

     ddraw->getPrimarySurface()->Blt( & dest_rect, NULL, NULL, DDBLT_COLORFILL|DDBLT_WAIT, & ddbltfx );

 

     // return success or failure or your own return code here

     return(1);

 

} // end Game_Main

将位数改为16位,窗口,OK了

 

 

第三步,进行与T3DLIB结合。在T3DLIB,填充颜色的是

 

 

void DDRAW_Interface::DDraw_Fill_Surface(LPDIRECTDRAWSURFACE7 lpdds, USHORT color, RECT *client)

{

     DDBLTFX            ddbltfx;

     DDRAW_INIT_STRUCT( ddbltfx );

     ddbltfx.dwFillColor                            = color;

 

     lpdds->Blt( client, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, & ddbltfx );

 

 

}

 

在调用时,

int Game_Main(void *parms = NULL, int num_parms = 0)

{

 

     // for now test if user is hitting ESC and send WM_CLOSE

     if (KEYDOWN(VK_ESCAPE))

     {

         exit( 0 );

         //PostMessage(main_window_handle,WM_CLOSE,0,0);

     } // end if

    

 

     RECT     dest_rect;

 

     int x1                           = rand() % SCREEN_WIDTH;

     int  y1                          = rand() % SCREEN_HEIGHT;

     int  x2                          = rand() % SCREEN_WIDTH;

     int  y2                          = rand() % SCREEN_HEIGHT;

 

     dest_rect.left                   = x1;

     dest_rect.top               = y1;

     dest_rect.right                  = x2;

     dest_rect.bottom            = y2;

 

     ddraw->DDraw_Fill_Surface( ddraw->getPrimarySurface(), _RGB16BIT565( rand() % 256, rand() % 256, rand() % 256 ), & dest_rect );

 

     // return success or failure or your own return code here

     return(1);

 

}

这个DEMO就结束了,相应的引擎也封装结束了。16:59,用时2小时41分钟,

小结:

这个DEMO主要就说了硬件BLT是多么的NB,原因是能够成块复制了,而不是逐行了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2013年4月10日星期三 (DEMO7——6使用blitter) 的相关文章

  • 使用bat文件安装卸载Window服务

    1 安装服务 echo off title 安装windows服务 path SystemRoot Microsoft NET Framework v4 0 30319 echo echo echo windows服务程序安装 echo e
  • 硬核!「金三银四」Java 高级面试题之Java基础(附答案详解)

    前言 好久没更新了 我裂开来 一直在忙新项目的事情 唉 陆陆续续也没啥时候写东西了 刚过完元旦 才有了休息时间给大家做做分享 这个2020 程序员实在是太难了 眼瞅着马上又要过年了 口袋里的钱是一天比一天少 谁谁谁摆满月酒 哪家邻居的二儿子
  • 【解决】启动数据分析软件SPSS17遭遇的两弹窗解决方案

    问题描述 某任前女友请我帮她安装SPSS17这款软件 我寻思这是啥软件 谷歌一下 发现是一个数据分析工具 在一系列的下一步 确定后 打开时 第一个惊喜弹窗来了 弹窗内容 应用程序无法启动 因为应用程序的并行配置不正确 有关详细信息 请参阅应
  • 分享 100 道基础的前端面试题(附答案)

    最近在整理 JavaScript 的时候发现遇到了很多面试中常见的面试题 本部分主要是作者在 Github 等各大论坛收录的 JavaScript 相关知识和一些相关面试题时所做的笔记 分享这份总结给大家 对大家对 JavaScript 的
  • 【学习笔记】欧拉降幂

    壹 定理 1 基础版 当 a p a p a p 互质 时 我们有 a
  • Unix时间戳(Unix timestamp)及其他时间标准

    以下内容摘自 http blog hehehehehe cn a 15592 htm Unix时间戳 Unix timestamp 或称Unix时间 Unix time POSIX时间 POSIX time 是一种时间表示方式 定义为从格林
  • Rikka with Phi 【HDU - 5634】【线段树+欧拉函数】

    题目链接 很好的一道题 也算是开阔了我的思维 一开始 我的想法是既然是区间求欧拉 那么到一定地步的时候 数的欧拉值就会降到1 那我们维护区间值等于区间长度不就是可以了吗 然后T了 然后我再想 是不是哪里可以优化 毕竟还有另外一个条件没用优化

随机推荐

  • Azure Blob云存储

    文章目录 Azure Blob云存储 什么是Azure Blob 存储 关于Blob 存储 关于 Azure Data Lake Storage Gen2 使用Blob 创建容器 上传块 Blob 下载块 Blob 删除块 Blob Azu
  • esp芯片命名规则

    ESP32芯片命名规则 参考资料 ESP32技术规格书
  • Qt菜单QMenu和菜单栏QMenuBar及自定义菜单用法

    本文主要介绍了Qt菜单QMenu和菜单栏QMenuBar及自定义菜单用法 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下面随着小编来一起学习学习吧 目录 QMenu和QMenuBar是Qt中的菜单
  • RS485通信模块使用及代码【简】

    1 485模块简介 485 通信接口的远程称重数据采集方法 在要求通信距离为几十米到上千米时 广泛采用 RS 485 串行总线标准 RS 485采用平衡发送和差分接收 因此具有抑制共模干扰的能力 大致意思 具有rs485硬件接口 并且采用协
  • Linux内核--网络栈实现分析(一)--网络栈初始化

    本文分析基于内核Linux Kernel 1 2 13 原创作品 转载请标明http blog csdn net yming0221 article details 7488828 更多请看专栏 地址http blog csdn net c
  • (附源码)springboot+mysql+基于Java的学生请销假审批管理系统的设计与实现 毕业设计130939

    摘 要 科技进步的飞速发展引起人们日常生活的巨大变化 电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用 信息时代的到来已成为不可阻挡的时尚潮流 人类发展的历史正进入一个新时代 在现实运用中 应用软件的工作规则和开发步
  • BOOST负电压输出电路、倍压输出电路

    SEPIC电路可实现升降压以及负压
  • Distance Queries 【POJ--1986】【动态树LCT】

    题目链接 虽然LCA也是可以写的 但是动态树明显写起来简单的多 雾 只是个人观点 我们这道题 暗藏了一个信息就是它一定是一棵树 题目中有这样说到 每两个点一定是相互链接 或者是 一串 这样的可以到达的 然后就是直接上LCT的模板咯 并且将边
  • 爬虫合集!(看这里)

    awesome spider 收集各种爬虫 默认爬虫语言为 python 欢迎大家 提 pr 或 issue 收集脚本见此项目 github search A 暗网爬虫 Go 爱丝APP图片爬虫 B Bilibili 用户 Bilibili
  • php curl cookie,php中curl获取返回页面的cookie

    php的curl可以模仿用户浏览网页并且获取网页的cookie 获取cookie还有专用的参数如CURLOPT COOKIEJAR 用于保存 cookie 到文件了 下面一起来看几个例子吧 curl可以获取返回页面设置的cookie 原理跟
  • 数学建模写作指导20篇(一)-如何写好数学建模论文?

    数模国赛开赛在即 给大家推荐一个比较好的专栏 喜欢的小伙伴请移步 2022年高教社杯全国大学生数学建模竞赛 比赛规则篇 比赛规则及比赛指导 一 写好数模论文的重要性 1 评定参赛队的成绩好坏 高低 获奖级别 数模论文是唯一依据 2 论文是竞
  • java SpringBoot 切换不同的运行环境(生产环境、开发环境、测试环境)SpringBoot配置多个不同运营环境【多文件版本】

    背景 同一套Spring Boot应用程序会被安装到不同环境 比如 开发 测试 生产等 其中修改最多的无非 数据库地址 服务器端口等等配置 使用profile功能实现不同的运行环境 生产环境 开发环境 测试环境 切换 yml文件 yml配置
  • Spring高手之路5,Dubbo服务注册与发现(文末送书)

    目录 一 介绍 1 介绍 Dubbo 服务注册与发现的基本概念和重要性 2 阐述 Dubbo 服务注册与发现的实现方式和应用场景 二 Dubbo 服务注册与发现的架构设计 1 Dubbo 服务注册与发现的总体架构设计 2 Dubbo 服务提
  • stm32(六)中断

    什么是中断呢 可以举一个日常生活中的例子来说明 假如你正在给看书 电话铃响了 这时 你放下手中的书 记录下你看书的页数 去接电话 通话完毕 再继续从原来的位置继续看书 这个例子就表现了中断及其处理过程 电话铃声使你暂时中止当前的看书的动作
  • Flink-CDC实践(含实操步骤与截图)

    文章目录 前言 Flink CDC 1 CDC简介 1 1 什么是 CDC 1 2 CDC 的种类 1 3 Flink CDC 2 Flink CDC 案例实操 2 1 DataStream 方式的应用 2 1 1 导入依赖 2 1 2 编
  • DM达梦如何再修改了端口好的情况登录

    1 登录DM的disql 再bin目录下输入disql 输入用户名和密码 即可登录 也可以不用输入用户名和密码 直接敲连个空格 就可以直接登录 不过前提是用户名和密码都是默认密码 2 如果端口不是默认5236 那么这种登录方式 也就不起作用
  • 常见的内存泄漏原因和解决方案

    常见的内存泄漏原因和解决方案 1 全局引用 问题 在JavaScript代码中 使用全局变量或全局对象来保存对DOM元素或其他对象的引用 这可能导致内存泄漏 解决方案 避免使用全局变量或全局对象 改用合适的作用域来管理变量和对象的生命周期
  • 【STM32】-串口调试中软硬件问题定位过程分享

    1 概述 串口调试中难免会遇到问题 对于新手来说 会觉得无从下手 或急于修改代码 查找软件原因 本文将分享调试中遇到的问题及排故思路 供读者参考 学习 2 问题描述 在将原工程文件移植到原子阿波罗开发板 其他开发板类似 后 上位机无法接收到
  • 【毕业设计】人脸识别算法研究与实现 - 深度学习 机器学习

    文章目录 0 前言 1 机器学习 人脸识别过程 1 1 人脸检测 1 2 人脸对齐 1 3 人脸特征向量化 1 4 人脸识别 2 深度学习 人脸识别过程 2 1 人脸检测 2 2 人脸识别 3 最后 0 前言 Hi 大家好 这里是丹成学长的
  • 2013年4月10日星期三 (DEMO7——6使用blitter)

    本来打算晚上进行封装 不过由于上午进行HDR 只剩下RENDERBLOOM 了 有些疲倦 不妨先进行封装 闲话少说 现在是14 18 开始进行了 这1节还是开头强调了硬件局限性 目前当然没有这个问题了 只考虑封装方法吧 大概浏览了一下这一节