19年发布了一篇《FPS游戏:实现GDI方框透视》这篇文章,本篇文章中使用到的技术是外部GDI绘制,该绘制模式在Win10系统中如果不关闭毛玻璃效果则绘制会失效,为了解决绘制失效的窘境,故本人将代码从易语言顺利移植成了C/C++并使用注入的方式劫持绘图函数实现内部D3D绘制,如下本人将具体分析如何实现的内部绘制。

首先在外部GDI绘制时,您肯定发现了,在WindowsXP系统下绘制出来的无论是方框还是文字都会频繁闪烁,而在Win10系统,由于启用了毛玻璃效果,则外部GDI绘制干脆躺平了,这就很尴尬。

本人通过C/C++封装实现了D3D内部与外部多种绘制方法,接下来将逐一分析代码是如何实现的。

外部D3D绘制模块

所谓外部D3D绘制,其实现原理是,通过在外部创建顶层窗体,并每隔指定毫秒数,自动附加窗体到目标进程上,我们所有的绘制操作都是在自身进程上实现的。

这种方式绘制出来的方框或菜单,都有一个显著的特点,首先占用CPU过高,且当有其他窗体覆盖到游戏顶层时,则绘制出来的菜单或方框将会被置顶,如下效果:

至于外部绘制如何监控热键,我们可以使用RegisterHotKey(NULL, 1, 0, VK_UP);注册,由于是外部,因此不需要热键回调,所以只需要注册即可全局生效。

菜单的绘制,很简单,首先一个外包矩形,矩形的大小需要自己计算得到,你有几个功能则矩形就需要有多长,矩形内部嵌套一个小矩形,当用户按下上下左右时,我们默认让其自动移动位置,这个移动位置是通过下标计算得出的偏移,根据计算的得出的偏移值,从而实现动态移动,当用户选中某个菜单项时,则全局变量负责接收,并判断功能即可。

内部D3D绘制模块

相对于外部D3D绘制模块来说,则不存在以上问题,与外部绘制不同,内部绘制需要控制转接函数,在原始绘图函数工作之前,需要增加新的绘制方法,内部绘制效率时最高的,且内部绘制不存在占用CPU资源高的情况,一般绘制出来的效果如下:

如上,很明显内部绘制与父进程已经融合了,并不存在挡住的情况,但内部绘制使用RegisterHotKey()无法注册热键,需要将自身热键注册到父窗体回调事件中才可以,所以代码上也需要增加一些。

FPS游戏:D3D内部游戏菜单实现相关推荐

  1. rust腐蚀怎么单人游戏_腐蚀RUST怎么提高帧数_腐蚀RUST提高FPS方法_52pk单机游戏

    一.如何查看你当前的FPS.(steam办法) 一种方法是激活Steam FPS: 在Rust客户端关闭的情况下,进入主Steam程序窗口的"Steam"选项卡 点击"设 ...

  2. rust腐蚀怎么单人游戏_腐蚀游戏怎么提高帧数 Rust设置隐藏画质提高FPS教程

    腐蚀游戏怎么提高帧数 Rust设置隐藏画质提高FPS教程 2018-03-04 10:58:10来源:游戏下载编辑:云曼衍评论(0) <腐蚀(Rust)>已经正式上市发售了,因为游戏的配置 ...

  3. java游戏开发入门(二) - 菜单

    java游戏开发入门(二) - 菜单 前言 编码 主菜单 游戏内菜单(按下ESC后出现,并会暂停游戏) 效果展示 主菜单 游戏内菜单 完整代码 完整项目 前言   上一章我们创建了一个600x600的 ...

  4. 【从0到1实现多人FPS房间对战游戏】

    从0到1实现FPS房间对战游戏 简介 服务器结构 序列化实现 demo获取 简介 基于godot开源客户端引擎和go开源游戏框架pitaya,实现经典多人3D房间fps射击游戏 立足开源才能站在巨人肩 ...

  5. 目前游戏行业内部主要几款游戏引擎的技术对比(转)

    如果只有客户端的话,可以考虑用gamebryo,技术好一点,用ogre也可以,如果规模不大,用unity3d,如果很有钱,要效果很好的,用unreal3,bigworld是带服务器的,如果能力不够,最 ...

  6. [转]目前游戏行业内部主要几款游戏引擎的技术对比

    如果只有客户端的话,可以考虑用gamebryo,技术好一点,用ogre也可以,如果规模不大,用unity3d,如果很有钱,要效果很好的,用unreal3,bigworld是带服务器的,如果能力不够,最 ...

  7. 【Iphone 游戏开发】游戏引擎剖析

    为什么80%的码农都做不了架构师?>>>     李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame. ...

  8. 《游戏机制——高级游戏设计技术》一1.1 规则定义游戏

    本节书摘来异步社区<游戏机制--高级游戏设计技术>一书中的第1章,第1.1节,作者: [美]Ernest Adams 译者: 石曦 责编: 陈冀康,更多章节内容可以访问云栖社区" ...

  9. 多人网络游戏服务器开发基础学习笔记 I:基本知识 | 游戏设计模式 | 网游服务器层次结构 | 游戏对象序列化 | 游戏 RPC 框架 | 帧同步和状态同步

    今天继续开新坑,尽管过了很多 Unix 套接字编程的坑,但是实际还是有很多不同场景和性能的需求,以及最服务器架构的内容也就接触过 preforking 和 master 带 worker 而已. 所以 ...

最新文章

  1. 防sql注入 php代码,完美的php防sql注入代码
  2. JDK、J2EE、J2SE、J2ME的区别
  3. 64位传参利用方法LibcSearcher使用入门ROPgadget利用
  4. hive如何处理not in和in的问题
  5. ?php php,PHP: Balises PHP - Manual
  6. (组合数学笔记)Pólya计数理论_Part.2_群及其性质
  7. 轮到苹果追赶国产厂商了?苹果新专利曝光iPhone将使用屏幕指纹解锁
  8. c# string 转 datetime_利用swig封装C++的dll为C#方便使用
  9. 卷积神经网络CNN原理以及TensorFlow实现
  10. Apache CarbonData学习资料汇总
  11. 解决谷歌浏览器chrome的CPU占用率过高的问题
  12. 炼石白小勇:合规与实战推动密码产业发展
  13. android2048项目报告,Android项目开发实战-2048游戏
  14. 华硕主板电脑开机后一直反复进入BIOS界面解决办法(其中之一)
  15. 在VMware上安装macOS
  16. 虐我千百遍之NS3安装
  17. xp系统开机自检很久_xp系统开机慢怎么解决两种提升电脑开机速度方法
  18. 如何快速创建vue的SPA项目
  19. h1283 linux内核,H1073C H1073 H1283升级失败恢复方法
  20. 项目进度安排必须妥善处理的几个问题

热门文章

  1. 深圳弘辽科技电商|马云:我希望未来中国的500个好公司中,有200个CEO来自于阿里巴巴的人
  2. 数据库复试——数据库设计(主观题)
  3. php使用邮件找回密码,thinkphp实现发送邮件密码找回功能实例
  4. negative和passive的反义词_negative 和 passive的区别?
  5. .NET Core C#系列之XiaoFeng.ToCast万能类型转换器
  6. 爬虫基础之爬取豆瓣top250电影名字
  7. 一村一码,扫二维码反映民生
  8. 在uniapp上使用不了FormData对象的问题解决
  9. VMware虚拟机安装DOS6.22(二)
  10. STM32F103之实验2控制1个电机并采用编码器读取电机转速(代码)