zoukankan      html  css  js  c++  java
  • 优化技术之高级优化

    2013-06-29

    高级优化

     

    目前被普遍采用的优化方案有:

    1. 优化循环,通过重新组织重复的子表达式来提高循环体的运行性能。

    2. 减少使用对象的数量来提高运行性能。

    3. 缩减网络传输数据来缩短等待时间等。

     

    本文学习另外三种性能优化策略:

    1. 采用对象池技术,提高对象的利用率。

    本文提出一种对象池技术,将有效解决创建和释放对象带来的性能损失问题。

    根据需要先创建一定量的对象,在需要创建对象的时候从池中申请空闲对象,释放对象时把对象释放回池中,以有效避免由创建和释放对象带来的性能损失。

    游戏分析:假设同时显示的敌机数量最多不超过5架,采用对象池技术可以先定义一个对象池,容量为同时的敌机的最大数量。

    Enemy[] enemyPool = new Enemy[5];

    for(int i=0; i<5; i++) {

      enemyPool[i] = new Enemy();

    }

    在类Enemy里增加标志属性used和带参数的reset方法使对象重置到初始化。在载入游戏的时候,初始化对象池,在需要创建对象的时候从对象池中获取一个未被使用的对象并使用reset方法初始化,需要释放对象的时候只需将修改标志位属性used以供下次使用。使用对象池技术不但减少了相当大一部分的资源开销,而且避免了频繁创建对象的额外资源开销。

    2. 尽量使用基本数据类型代替对象。

    在游戏中飞机要发射子弹,基于面向对象的设计模式可将子弹抽象成Bullet类,然后定义代表子弹的对象池,在发射子弹的时候,在对象池中查找可用对象并重置其位置为飞机所在的位置。由于对象操作的效率低于对基本数据类型的操作,由此可以想到由基本数据类型来代替对象实现。

    int[][] bullet = new int[2][10]; // 假设屏幕同时显示最多10颗子弹

    for(int i=0; i<10; i++) {

      bullet[0][i] = 999; // 对应x位置

      bullet[1][i] = 999; // 对应y位置

    }

    在每一个Game Loop中

    while(run) {

    for(int i=0; i<10; i++) {

        if(bullet[1][i] == 999) {

          // 设置子弹发射位置为飞机当前的位置

          bullet[0][i] = plane.getX();

          bullet[1][i] = plane.getY();

        } else {

          // 子弹纵坐标减小

          bullet[1][i] –= 10;

        }

      }

    }

    3. 用简单的数值计算代替复杂的函数计算。

    减少函数计算复杂度,减少复杂函数的调用次数,避免使用复杂函数计算,有利于程序性能提高。与复杂函数运算相比,简单的数值计算无论从时间还是空间上都有极大的优势。

    由基本的数学原理可知,当角度一定时其对应的三角函数值也是一定的,又因为三角函数是周期函数,因此本文的优化算法是用0度~45度的函数值通过简单的四则运算来模拟任意函数值。

    游戏开发性能优化状况:

    当前游戏性能的瓶颈在于有限的存储资源和偏弱的处理器速度,而游戏优化的关键之处在于节省资源开销、节省冗余计算和计算简化,所以牺牲部分设计上的结构化换来性能的提升,在当前情况下仍然是非常有必要的。本文提出的优化方法为在较低的硬件条件下实现流畅的画面,提供了可行的解决方案。

  • 相关阅读:
    如何设计一个安全的对外接口?
    Java架构师必须知道的 6 大设计原则
    Spring Boot 如何快速改造老项目?
    Java 类中可以覆盖静态方法吗?
    Dubbo 的心跳设计,值得学习!
    在滴滴和头条干了 2 年后端开发,太真实…
    别乱提交代码了,看下大厂 Git 提交规范是怎么做的!
    3种骚操作,教你查看 Java 字节码!
    sysbench测试服务器性能
    mysql DDL时出现的锁等待状态
  • 原文地址:https://www.cnblogs.com/fengzhblog/p/3162852.html
Copyright © 2011-2022 走看看