3D游戏引擎〇 開始
游戏循环:
初始化:运行一些主要的初始化操作,如内存分配,资源获取。从磁盘载入数据等。
进入游戏循环:进入主游戏循环。用户不断地运行动作,知道退出主循环为止。
读取玩家输入:处理玩家输入,或将其存储到缓存区中,供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游戏引擎〇 開始的更多相关文章
- 转载:[转]如何学好3D游戏引擎编程
[转]如何学好3D游戏引擎编程 Albert 本帖被 gamengines 从 游戏引擎(Game Engine) 此文为转载,但是值得一看. 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的 ...
- 排名前10的H5、Js 3D游戏引擎和框架
由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.A ...
- 棒!使用.NET Core构建3D游戏引擎
原文地址:https://mellinoe.wordpress.com/2017/01/18/net-core-game-engine/ 作者:ERIC MELLINO 翻译:杨晓东(Savorboa ...
- Java 3D游戏引擎——JME(java Monkey Engine)
转自:http://bbs.gameres.com/forum.php?mod=viewthread&tid=180732 JME(java Monkey Engine),一个非常棒的Java ...
- 【直播预告】7月18日3D游戏引擎免费公开课答疑,參与送C币!
喜讯喜讯! 为了酬谢广大学员.CSDN学院特推出iOS和3D游戏引擎开发免费技术答疑公开课,让您度过一个充实的暑假~ 參与本次公开课,即有机会获得50C币! 答疑公开课时间:7月18日 晚7:30-9 ...
- 【直播预告】7月25日3D游戏引擎免费公开课答疑第三期,有奖问答!
喜讯喜讯! 为了酬谢广大学员.CSDN学院特推出iOS和3D游戏引擎开发免费技术答疑公开课.让您度过一个充实的暑假~ 參与本次公开课,进行有奖问答.即有机会获奖. 答疑公开课时间:7月25日 晚7:3 ...
- 3D游戏引擎设计 实时计算机图形学的应用方法 第2版 pdf 带索引书签目录
3D游戏引擎设计 实时计算机图形学的应用方法 第2版 目录 第1章 概述1.1 图形硬件和游戏发展史1.2 本书版本与软件发展史1.3 章节导读 第2章 图形系统2.1 基础知识2.1.1 坐标系 ...
- 3D游戏引擎一 win32编程
Windows程序一般都等待用户进行一些操作,然后响应并採取行动. 一般来说.对win32的程序的操作都会转换为系统事件队列中的消息,如按键消息WM_KEYDOWN,WM_MOUSECLICK等传递键 ...
- 基于Java的开源3D游戏引擎jMonkeyEngine
jMonkeyEngine简介 jMonkeyEngine是一款纯Java语言编写的游戏引擎,继承了Java应用跨平台的特性,而且是开放源代码的,遵循BSD开源协议,BSD开源协议用一句简单的话概括就 ...
随机推荐
- ACE调试中的一个小问题——ace_main_i无法链接
初学ace没多久,今天遇到了一个小问题. 具体是:我在写完代码之后,编译老是出现一个错误. 提示: ACE_TEST1.obj : error LNK2019: 无法解析的外部符号 "int ...
- RxJava API使用示例
概述 RxJava API示例代码,可离线查看rxjava1.0大部分API的marble图,描述,示例代码,并支持示例代码实时输出及展示执行结果. 详细 代码下载:http://www.demoda ...
- nginx 配置一个文件下载服务
cat openvpn.conf server { listen ; server_name localhost; location / { root /home/openvpn/client_fil ...
- 产品经理PM
首先希望大家记住的就是,千万不要以为产品经理是什么高大上的光环,产品经理其实只是一种状态,一种心态而已. 大家可能看到BAT每年都会从校园里面招聘一些产品经理,尤其是我们腾讯,声称以产品为王,每年投产 ...
- 跨浏览器的CORS
function createCORSRequest(method, url){ var xhr = new XMLHttpRequest(); if("withCredentials&qu ...
- Phone
User-Agent Switcher for Chrome EditThisCookie cornerstone SVN
- 利用dd命令制作u盘iso镜像
现在安装系统都是用u盘安装,那么制作u盘的iso镜像就是必须的了.现在此类工具倒是不少,但是,好用的不多,有的还收费.唉,还是用dd吧,老配方,老味道. 首先:要df -h一下,看看u盘的盘符,类似 ...
- Docker Python API 与 Docker Command
span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...
- [转]鼠标和键盘模拟API
几乎所有的游戏中都使用了鼠标来改变角色的位置和方向,玩家仅用一个小小的鼠标,就可以使角色畅游天下. 那么,我们如何实现在没有玩家的参与下角色也可以自动行走呢.其实实现这个并不难,仅仅几个Windows ...
- c#各类型转byte[]或转回
var tmp = BitConverter.ToInt32(new byte[]{...}); var bytes = BitConverter.GetBytes(tmp); 而String转byt ...