Bob*_*age 5 java collections android
我正在为Android编写游戏.举个例子,游戏可能涉及子弹,敌人,宝石等,需要:
在游戏过程中在游戏世界中创造和销毁,例如子弹是火,然后当它撞到墙壁时消失.
按顺序访问很多,例如按顺序更新,然后按顺序绘制.
根据我迄今为止在Android工作中所知,为了保持帧速率,我需要考虑以下因素:
不必在没有时分配对象,因为垃圾收集器会启动并破坏您的帧速率.
首选例如访问对象字段和调用函数的局部变量访问.
对于PC游戏中上面提到的游戏对象,我通常只是喜欢使用像Vector或LinkedList这样的东西.但是,这些不会回收对象,并且使用Iterator会创建一个新对象,并在迭代时涉及多个函数调用.
什么是合适的收藏品?
我发现目前运作良好的是创建一个100个子弹的标准阵列,其中所有100个子弹都是预先创建的.然后,当所有活动子弹出现在阵列的开头时,我会计算有多少子弹是活动的.每当我迭代一系列子弹并且我需要销毁一个子弹时,我只需将当前项目符号索引与最后一个活动项目符号索引交换,然后减少活动项目符号数.这改变了子弹顺序,但没关系.
这非常有效:
优点:Recycles对象,很少/没有函数调用缺点:未实现为集合类时容易出错(特别是删除)
谁能提出更好的选择?我见过许多用于管理对象池的类,但我不确定哪些适合我.
谢谢.
我在80年代后期编程游戏,最近在Java中编写移动设备.我可以告诉你,如果你使用LinkedList或Vector来存储对应于物品的Java对象,那么你将会杀死你的帧速率.这并不是手机游戏的编程效率.通过考虑"每一点都很重要"来编程高效的移动游戏.这是优化占主导地位的领域之一.
过度简化,但想象你有一个游戏目前有四个子弹"活着"(它不是真的"在屏幕上",你的"活跃世界"可以并且通常应该比你的屏幕稍微大一点,它使很多处理更容易).
(20,30,3)(10,50,2)(30,40,-3)(50,50,5)
因此,子弹1在您的坐标空间中的像素(20,30)处以3的速度(无论3的速度意味着,它只是一个示例)向右(过度简化,只是为了解释),子弹2在(10,50)以2的速度向右移动,子弹3在(30,40),以3的速度向左移动(减去这里意味着左),最后的子弹在(50, 50,5)以5的速度向右移动.
在当前的手机游戏中,这如何在内存中呈现?
像这样,在int []中:
int [] = {4,20,30,3,10,50,2,30,40,-3,50,50,5,...,...,...};
前4个告诉我们这个"数据结构有4个元素.而且你知道每个都是由3个值构成的(在我们过于简单的例子中).
现在想象一下子弹2击中一堵墙并消失,会发生什么?
这个:
int [] = {3,20,30,3,50,50,5,30,40,-3,50,50,5,...,...,...};
我们简化了将第一个int减少为3,表示我们的游戏世界中只剩下3个子弹,我们只是将(50,50,5)移动到位置'2',替换(10,50,2) )(50,50,5).那是因为我们的子弹的顺序没有重要性(它们都具有相同的效果)并且"将所有int []元素移动到左侧"将是非常低效的.
请注意,我们甚至懒得"清除"'第4个子弹':旧的(50,50,5)仍然在那里,但我们知道我们只剩下3个元素,所以我们不在乎.
所以在内存中它看起来像这样:
int [] = {3,20,30,3,50,50,5,30,40,-3,50,50,5,...,...,...};
你只关心这个:
int [] = {3,20,30,3,50,50,5,30,40,-3,...,...,...,...,...,...} ;
THAT是它是如何在目前大多数手机游戏完成:零对象创建在主循环"子弹处理".您可以使用基元数组自己管理这些简单的数据结构.
并且int []在您的关卡游戏开始时初始化为游戏/关卡中可能发生的最大子弹数.
有你的"可重复使用的子弹池".
如果您开始考虑将Java对象视为一个像子弹一样微不足道的东西,并使用您在每个帧上修改的LinkedList或Vector,那么您将永远无法获得可接受的性能:您将产生无数不必要的东西对象每秒50次并且过于频繁地触发GC.
现在我当然不是说OO编程在移动游戏中没有它的位置:我只是说,如果你认为物体的对象与子弹一样微不足道,那么你将无法获得可接受的性能.
我的"子弹移除"技术涉及一个减量(子弹数量)和3个副本.你不能打败那个;)
它适用于很多东西:子弹,粒子效果,敌人,物品,奖金,诸如此类的东西:)
在游戏循环中可能经常删除/重新创建的微不足道的东西可能不应该使用对象建模,当然也不应该放在Vector和LinkedList中.
| 归档时间: |
|
| 查看次数: |
1583 次 |
| 最近记录: |