【问题标题】:Accessing Array.items[] in a for-loop error在 for 循环错误中访问 Array.items[]
【发布时间】:2014-04-17 16:50:01
【问题描述】:

为了获得更好的性能,我正在微调代码,查看 DDMS 跟踪器。一方面是Array.get(x),比Array.items[x]

我们可以直接访问items证明数组类型是Object,或者,我们在构造函数中指定数组类型,像这样:

Array<MyClass> foo = new Array<MyClass>(MyClass.class)

这很好用,但是,如何在 for 循环中指定最后一个 MyClass.class?我现在有这个:

for (Array<MyClass> listOfObjects : allObjects) {

    for (int i=0; i<listOfObjects.size; i++) {

        MyClass myObj = listOfObjects.get(i);   
        //MyClass myObj = listOfObjects.items[i];  

注释行工作正常,但为了摆脱开销,我想提供上面提到的“(MyClass.class)”。在那个 for 循环构造函数中我可以在哪里执行此操作?

非常感谢 J

【问题讨论】:

  • 这很奇怪。在您增强的 for 循环中, foo 已经是当前项目。在您的 sn-p 中,您尝试使用不存在的变量 i 访问它。
  • 哦,我错误地复制了我的代码。更新中..
  • 要按照您设置的方式使用高级 for 循环,Array 应该是 Array>
  • 对您当前的问题没有帮助,但请确保您使用listOfObjects.size()
  • size() 不存在,因为这是一个 Libgdx Array 对象:com.badlogic.gdx.utils.Array;

标签: java android class for-loop libgdx


【解决方案1】:

我认为您尝试做的事情毫无意义。请阅读这篇精彩的文章:http://blog.codinghorror.com/the-sad-tragedy-of-micro-optimization-theater/

您正在尝试生成一些最小的优化,同时大大降低了可读性和可维护性。

如果您想要更少的开销,那么查看像 C++ 这样的语言可能会更明智,而不是尝试破解基本的 java for 循环。

您可能想要研究的另一件事是 Java 8,它添加了与 Streams 并发执行循环的功能。

【讨论】:

  • 有趣。问题是,像这样的小变化正在改变我们的 FPS,所以这是我目前知道的唯一路线......
  • 我对他们的 Array 类的 gdx 性能一无所知,但是您是否考虑过使用 Java HashSet 或 gdx 等价物?
【解决方案2】:
Array<MyClass> foo = new Array<MyClass>(MyClass.class)

请注意,您正在使用这一行创建一个新数组,并传递一个类参数。来自http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/Array.html

Array(java.lang.Class arrayType)
Creates an ordered array with items of the specified type and a capacity of 16.

我没有看到您尝试在您发布的其他代码中创建新数组。您是否尝试在allObjects 中填充每个listOfObjects? 如果是这样,你会想要做这样的事情:

for (int i = 0; i < allObjects.size; i++)
{
    allObjects.items[i] = new Array<MyClass>(MyClass.class);
}

如果您只是尝试遍历这些数组,则不需要类参数。如果迭代速度太慢,我建议将Array 类与其他 Gdx 或 Java 集合进行比较。

如果您从数组中删除大量内容,则上述链接中的引用也可能值得注意。

A resizable, ordered or unordered array of objects. If unordered, this class avoids a memory copy when removing elements (the last element is moved to the removed element's position).

【讨论】:

    猜你喜欢
    • 2016-02-12
    • 2019-01-13
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2015-06-07
    • 2012-02-29
    相关资源
    最近更新 更多