游戏循环:

初始化:运行一些主要的初始化操作,如内存分配,资源获取。从磁盘载入数据等。

进入游戏循环:进入主游戏循环。用户不断地运行动作,知道退出主循环为止。

读取玩家输入:处理玩家输入,或将其存储到缓存区中,供AI和游戏逻辑使用。

运行AI和游戏逻辑:这部分为游戏代码的主体部分。将运行AI,物理系统,和通用系统逻辑。并依据结果在屏幕上绘制下一帧。

渲染下一帧:首先游戏绘制的下一帧图像在离频offscreen缓存中绘制,然后进行一系列的渲染。在基于3D软件的引擎中,由一个很复杂的3D图形流水线来进行渲染构成世界的无数多边形。而在基于OpenGL或Direct3D的3D硬件加速引擎中。大部分工作有硬件来承担。

同步显示:控制固定帧率,30帧为可接收的最小值,60帧为最大值。一般通过一些定时函数或等待函数来同步游戏到某个最大帧频。

循环。









大型游戏是一种超高性能计算机程序,为了效率。关键代码部分不会去使用高级API。一般来说,必须编写与游戏代码内部循环有关的一切内容,否则游戏达不到须要的速度和性能。

如使用memset()函数。这个函数相当快。但事实上进行单字节填充,而一般使用的都是4字节或8字节的基础数据类型组成内存结构。所以通常会使用四字节填充或者很多其它。效率也会提高非常多,如以下实现的一次写入4字节的函数,为内联汇编语言函数,进一步提高效率:

inline void Memset_QUAD(void *dest,UINT data,int count){
//每次填充4字节 32位
_asm
{
mov edi,dest;
mov ecx,count;
mov eax,data;
rep stosd;
}//汇编代码使一些时间关键代码部分和内存关键代码部分的效率大幅提升,以后有空还是要研究一下汇编的。 }

这段代码是32位的汇编代码。如今CPU都是64位的为了效率应该使用64位的汇编代码。

而对于DirectX中的API还是值得信任的,DirectX是作为一种高性能API编写的。其效率是有保证的,一般要避免Win32 API的高级函数的使用。





一些技巧须要注意的地方:

对所做工作进行备份。编写游戏代码非常easy让系统锁死。进行辈备份是必要的。

開始游戏项目时。须要进行良好的组织。项目中使用合理的文件名和文件夹名称。使用一致的变量命名规则。尽可能使用单独的文件夹存储图形和声音数据。而不是将全部内容放到一个文件夹中。

使用内联函数。使用inline来避免函数调用,加快程序速度。这会将程序变大。但对于游戏来说速度更重要。

尽可能使用32位变量而不是8位或16位,如今是尽量使用64位变量,由于如今的CPU都是64位而不是32位。而对于小于64位的数据,会由快速缓存和其它相关的内存寻址操作。导致速度变慢。

不要害怕使用全局变量:很多游戏在对于时间有严格要求的函数中都不使用參数,而是简单地使用全局參数。參数的出栈入栈会造成较高的消耗。而全局变量一定要使用较好的命名规则。且注意安全。

以RISC精简指令集计算机方式进行编程。(精简指令集通过精简指令使计算机系统的复杂操作由硬件交给软件实现,而实现系统的更加高效)而这样做的详细做法就是 不要写复杂的语句,因为CPU中处理这些复杂语句耗费很多其它,而使用多句简单语句来取代复杂语句。

多使用位运算来替代乘除。以及熟练使用异或。

编写高效的算法,尽管汇编能够提高O(n)的算法的速度,但对于O(n*n)没有效果。最重要的还是从算法入手,来提高效率。

不要在编写代码过程中优化代码。代码编写中,忍不住想去优化之前的代码,但这是浪费时间。与其分心与与当前任务无关的代码。不如更快的将如今的任务完毕。然后再进行细致的优化。

慎用C++。

尤其是C++中的多继承。

假设你发现当前採取的路线非常困难。立即停止,进行备份。然后想办法绕过困难。犯一个错误,并又一次编写1000行代码,要比採用一个不好的编码结构强得多。

代码的可扩展性。可维护性和结构美丽是非常重要的一件事。

对于简单对象,不要编写复杂的数据结构。游戏编程中90%的工作是数据操作。要使数据操作更简单高效是极其重要的。

3D游戏引擎〇 開始的更多相关文章

  1. 转载:[转]如何学好3D游戏引擎编程

      [转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...

  2. 排名前10的H5、Js 3D游戏引擎和框架

    由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.A ...

  3. 棒!使用.NET Core构建3D游戏引擎

    原文地址:https://mellinoe.wordpress.com/2017/01/18/net-core-game-engine/ 作者:ERIC MELLINO 翻译:杨晓东(Savorboa ...

  4. Java 3D游戏引擎——JME(java Monkey Engine)

    转自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=180732 JME(java Monkey Engine),一个非常棒的Java ...

  5. 【直播预告】7月18日3D游戏引擎免费公开课答疑,參与送C币!

    喜讯喜讯! 为了酬谢广大学员.CSDN学院特推出iOS和3D游戏引擎开发免费技术答疑公开课,让您度过一个充实的暑假~ 參与本次公开课,即有机会获得50C币! 答疑公开课时间:7月18日 晚7:30-9 ...

  6. 【直播预告】7月25日3D游戏引擎免费公开课答疑第三期,有奖问答!

    喜讯喜讯! 为了酬谢广大学员.CSDN学院特推出iOS和3D游戏引擎开发免费技术答疑公开课.让您度过一个充实的暑假~ 參与本次公开课,进行有奖问答.即有机会获奖. 答疑公开课时间:7月25日 晚7:3 ...

  7. 3D游戏引擎设计 实时计算机图形学的应用方法 第2版 pdf 带索引书签目录

    3D游戏引擎设计  实时计算机图形学的应用方法  第2版 目录 第1章 概述1.1 图形硬件和游戏发展史1.2 本书版本与软件发展史1.3 章节导读 第2章 图形系统2.1 基础知识2.1.1 坐标系 ...

  8. 3D游戏引擎一 win32编程

    Windows程序一般都等待用户进行一些操作,然后响应并採取行动. 一般来说.对win32的程序的操作都会转换为系统事件队列中的消息,如按键消息WM_KEYDOWN,WM_MOUSECLICK等传递键 ...

  9. 基于Java的开源3D游戏引擎jMonkeyEngine

    jMonkeyEngine简介 jMonkeyEngine是一款纯Java语言编写的游戏引擎,继承了Java应用跨平台的特性,而且是开放源代码的,遵循BSD开源协议,BSD开源协议用一句简单的话概括就 ...

随机推荐

  1. BroadcastReceiver应用详解——广播

    转自:http://blog.csdn.net/liuhe688/article/details/6955668 BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收 ...

  2. JDBC数据库编程:PreparedStatement接口

    使用PreparedStatement进行数据库的更新及查询操作. PreparedStatement PreparedStatement是statement子接口.属于预处理. 使用statemen ...

  3. 特殊文件权限(setuid、setgid 和 Sticky 位)

    可执行文件和公共目录可以使用三种特殊类型的权限:setuid.setgid 和 sticky 位.设置这些权限之后,运行可执行文件的任何用户都应采用该可执行文件属主(或组)的 ID. setuid 权 ...

  4. 编译ORBSLAM2 build_ros.sh,实现kinect2在ROS环境下运行ORBSLAM2

    //編譯ORBSLAM2 build_ros.sh參考:“http://www.cnblogs.com/bigzhao/p/6635770.html”1.source ~/.bashrc出現問題:ct ...

  5. 为什么说Kindle难圆“中国梦”? 支撑Kindle模式成功的要素,在当下中国并不太具备

    http://www.huxiu.com/article/12993/1.html 6月7日更新:Kindle入华终于尘埃落定,苏宁将在下午4点在北京30家店面同时销售,首批产品为Kindle Pap ...

  6. python selenium--常用函数1

    新建实例driver = webdriver.Chrome() 1.通过标签属性Id查找元素 方法:find_element_by_id(element_id) 实例:driver.find_elem ...

  7. C++ - 派生类强制转换为基类

    派生类强制转换为基类 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24268821 在多态的使用时, 派生类的指针或引用能够转换 ...

  8. jquery 在ul中取得第一级的li

    在ul中取得第一级的li <div id='demo1'> <ul> <li id='1'>1<li> <li id='2'>2<li ...

  9. XML 实体扩展攻击libxml_disable_entity_loader

    XML 实体扩展攻击libxml_disable_entity_loader https://pay.weixin.qq.com/index.php/public/cms/content_detail ...

  10. NGUI 取ScrollView中遮罩区域4个点

    用panel.localCorners而不是panel.finalClipRegion,Region还要再换算 首先通过ScrollView取panel,然后取Corners,它返回值代表4个点,映射 ...