热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GameKnifeEngine第一个游戏Demo版完成!

毕设中期检查前一天终于完成了!自从上个星期一从公司离职,回家闭关写了整整一个星期中间平安夜圣诞节也就和女友象征性的过了一下。终于,在毕设中期检查的前一天完成了!toons

毕设中期检查前一天

终于完成了!

自从上个星期一从公司离职,回家闭关写了整整一个星期... 中间平安夜圣诞节也就和女友象征性的过了一下。终于,在毕设中期检查的前一天完成了!

 

toonshading + 复杂后处理 + 1920*1080... pixelshader表示压力很大...

等检查完了开始优化...检查嘛,主要是用画面感觉震住老师们...

 

这一个星期的成果

  其实11月中旬那次检查,GameKnifeEngine的底层就已经出来了。模仿OGRE的几个核心:[gkSceneManager] [gkResourceManagers] [gkRenderSequence] 已经联系在一起了。

  由于时间紧迫gkRenderTarget只是个[虚拟]的假象, 模型渲染直接继承了Renderable和Movable做了一个最基本的物体。这次的一个半月,主要是做一些和TANK3D游戏开发本身相关的一些东西。

  gkGameObject

  提供对游戏物件的抽象,这个抽象同时存在于GameKnifeEngine中和Max场景编辑器中。其上可以挂载一系列SubMesh用于渲染,每个可以设置不同Material;可以挂载一个luaScript,来控制一些简单运动;可以挂载一个physxemulator,来实现物理模拟或碰撞检测。

  max场景编辑器

  毕业设计的开发时间共计7个月,目前已经花了3个半月开发底层了。还有3个半月做游戏逻辑和改进,优化,最后测试。而场景编辑器对我们这个游戏来说应该是必不可少的,但是如果要基于游戏引擎,开发一个只上的场景编辑器,开销太大:UI界面系统,交互系统,特殊渲染,可能还得开发插件系统... 反正各种复杂,估计3个半月拿来开发都不够...

  而我“从小”就对3dsmax有很深厚的感情,3dsmax的交互跟(silo,modo比起来)虽然算不上非常人性化,但是比起我使用过的游戏引擎编辑器来说,应该是最好的了。max本身有相当强大的插件系统,并且内部的管理也十分庞大,几乎所有问题都能够得到相应的解决方法,何不使用max作为场景编辑器呢?

  其实,我只写了两个插件,就初步构建出了场景编辑器结构。

    1:gkObject,这是之前说的那个抽象。在这里可以直接选择资源库中的gkm模型文件加载,使用max的directx材质球来编辑材质,挂载luaScript来控制简单逻辑。

    2:gkSceneExporter,这里从max场景中遍历node,如果是gkObject就将其模型文件,shader文件,材质参数块,脚本文件和其变换信息和节点结构写入xml。最后GameKnifeEngine通过xml解析器来将max中编辑好的场景还原。

  max中编辑的场景,一键导出gks文件,gameknifeengine就可以建立出一个完全一样的场景,并且可以通过max中的object名称取得每个物体的控制权

  当然,要制作成一个完整的地形编辑器,还差得比较远。之后的三个半月,需要完善luaScript对max中node的控制,使得能在max中看到脚本的效果。

  PostProcess处理器

  后处理,自从知道了这种技术后就一直很热衷。可能也是因为photoshop经常修图的原因吧,其实后处理感觉就是用shader的photoshop,两个RTchain来回处理,两层通过蒙版叠加...通过对渲染出来的最终图像进行图层级别的处理和混合,达到PS级别的效果。确实是一个非常美妙的事情。fakeHDR,DepthOfField,NormalDetectedToonShading,这些技术真是太棒了!

  这次的后处理基本是参照directx的sample做的,不过将setRenderTarget的方式改为了截获surface,和我的gkRenderTarget系统联系了起来。另外增加了CopyToSrc的操作,因为在处理途中可能需要暂存一些处理后的图像但不立即用在下一次处理,所以要拷贝到一个缓存中在之后应当操作的时候再取出来操作。(其实这一节做得很仓促,思考和实现时间都非常短...)

  后处理的原理这里稍微说一下吧:

    第一步:将场景渲染到color,normal,position通道。这里的color就是意指通常的渲染结果,normal是基于view坐标系的每个点的normal值,在很多后处理中有大用处,例如卡通勾边等,position是基于view坐标系每个点的位置,在后处理中也有很大用处,例如景深效果,运动模糊等。渲染的方式目前的新显卡直接使用simulateRT就行了,直接在PS阶段输出到COLOR0, COLOR1, COLOR2。只用走一个pass就行了,否则,就要走多次pass进行不必要的VS阶段。

    第二步:根据预先设置的后处理shader顺序,使用刚才得到的三个通道图像作为贴图传入,进行计算,最后存到RTchain中。Rtchain有点swapBuffer的味道,其上有两个surface,一次操作时以A作为源,写入到B。然后翻转,下一次操作,以B作为源,写入到B,再次翻转... 这样理论上可以实现无限多次的后处理(前提要你的机器够快...)

    第三步:后处理将所有顺序进行完成以后,用当前激活的RTCHAIN的SURFACE写到BACKBUFFER上,在屏幕上渲染出最终图像。

 

服务器-客户端结构

  这次毕设的进展还包括网络结构的搭建。目前服务器,客户端底层已经搭建完成,基本消息结构也建立完毕。

本机9客户端大战,服务器的并发效率还是很高的~

 

  网络这里其他就不大多说了,其实自己还是比较水。服务器是找了个IOCP的服务器结构,给每个socket线程写了点小逻辑,然后加入了自己的消息结构。关于消息结构大家可以看一下game gem3 的 serializer(序列化)。特别好用!

 

网络这边感觉唯一值得一提的就是变换信息的同步。一开始,我是通过发送position,orientation,velocity来实现网络玩家的同步的。但发现效果很不理想,因为发包和收包的时机是完全不同的,所以这边老是卡一卡的忽快忽慢。后来通过查资料等各种方式,了解到有一个timestamp(时间戳)这个概念。也就是说,我在信息里加一条我发送的时间,即时你接到包的间隔和我发送不一样,你也可以将它“变”得一样。这里就要根据时间戳插值了。

  举个例子:

  我客户端A发送了a,b,c,d四个包。客户端B收到了这a,b,c,d四个包。那么,我应该用哪一个呢?

  不怕,我们有时间戳,时间同步的问题这里就不多说了,虽然两个客户端系统时钟可能不同,但是假设时间流逝是一样的(用加速齿轮除外)...这个好理解。

  那么,我们就根据现在的时间,找到我现在应该要的时间戳time,然后在我收到的a,b,c,d的四个包中找到time前后的两个包,假设是b,c。那么这时,我们就可以根据b,c的时间戳和time比较,来做一个从b到c的插值,得到一个位于b,c“中间的包”。

  利用它作为当前帧的信息,就不会出现“卡”的现象了。


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
author-avatar
小帅哥骑小猪撞墙
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有