• 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%的工作是数据操作。要使数据操作更简单高效是极其重要的。


  • 相关阅读:
    搭建appium的android环境
    SonarQube的安装、配置与使用
    使用jsonpath解析json内容
    浅析selenium的page object模式
    java读取word内容
    Java之XML操作:从XML中直接获取数据
    Java之指定Junit测试方法的执行顺序举例
    Mybatis之执行自定义SQL举例
    SpringBoot之处理JSON数据举例
    Mybatis之执行insert、update和delete操作时自动提交
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7261446.html
Copyright © 2020-2023  润新知