Добавление Google Guava в проект Android - значительно замедляет сборку

После добавления Google Guava r09 в наш проект Android время сборки значительно увеличилось, особенно на этапе генерации DEX. Я понимаю, что поколение DEX принимает все наши классы + все банки, от которых мы зависим, и переводит их в формат DEX. Гуава довольно большая банка вокруг 1.1MB

  1. Может ли это быть причиной замедления сборки?
  2. Есть ли что-то можно сделать, чтобы ускорить это?

P.S. Обычно я строю из Intellij, но я также пробовал строить с Maven - те же результаты.

Спасибо

Алекс

-121--1006406- Как избежать кастинга из интерфейса в класс При разработке компонента обнаружения столкновений для игры я придумал следующее решение. Я определяю интерфейс ICollidable, который выглядит примерно так: интерфейс ICollideable { ...

Пытаясь разработать компонент обнаружения коллизий для игры, я придумал следующее решение. Я определяю интерфейс ICollidable, который выглядит примерно так:

interface ICollideable
{
    Sprite Sprite { get; }
    int    Damage { get; }

    void HandleCollision(ICollideable collidedWith);
}

В основном, любые игровые объекты, которые хотят участвовать в обнаружении коллизий, должны реализовать этот интерфейс, затем зарегистрироваться на детекторе, который поддерживает список ICollideables. При обнаружении столкновения он вызывает метод HandleCollision для объекта и передает ссылку на объект, с которым он столкнулся.

Мне нравится это, потому что это позволяет мне держать все мои алгоритмы столкновений в одном месте, и позволяет игровым объектам самим решать, как справиться с столкновением. Но из-за последнего я нахожу, что мне приходится проверять базовый тип объекта. Например, я не хочу, чтобы игроки сталкивались друг с другом, поэтому в классе Player может быть что-то вроде:

void HandleCollision(ICollideable collidedWith)
{
    if (!(collidedWith is Player)) { // do stuff }
}

и так далее, и мне интересно, говорит ли это мне, что у меня плохой дизайн и каковы могут быть альтернативы.

Второй вопрос, далее по линии первого. В целях оценки, если Враг уничтожен Снарядом, кто-то должен знать «Владеющего игрока» члена класса Снаряд. Тем не менее, ни один из моих других столкнувшихся объектов не имеет или не нуждается в этом свойстве, поэтому я нахожусь в желании сделать (в Enemy HandleCollision):

void HandleCollision(ICollideable collidedWith)
{
    if (collidedWith is Projectile) {
        Health -= collidedWith.Damage;

        if (Health <= 0) {
            Player whoDestroyedMe = (collidedWith as Projectile).FiredBy
            // ...
        }
    }
}

У меня нет понятия, как справиться с этим с помощью лучшего дизайна. Любые идеи будут оценены.

ИЗМЕНИТЬ: Я хотел сосредоточиться на втором вопросе, потому что мой кишечник подсказывает мне, как справиться с этим решит первый вопрос. Что касается первого вопроса, я подумал о том, как абстрагироваться от этого поведения. Я мог бы определить перечисление:

enum Team
{
    Player,
    Enemy,
    Neither
}

и иметь ICollideables реализовать это свойство. Тогда детектор столкновений просто не регистрирует столкновения между конфликтующими объектами на одной и той же «Команде». Таким образом, Player и Player Projectiles будут в одной команде, Enemy и Enemy Projectiles - в другой,и окружающая среда (которая может повредить и то, и другое) не может быть ни на одном. Это не обязательно должен быть перечисление, может быть int или последовательность или что-либо еще, с идеей, что объекты с одинаковым значением для этого свойства не сталкиваются друг с другом.

Мне нравится идея моделирования поведения с помощью простого атрибута. Например, если я хочу включить «разрешить дружественный огонь», все, что мне нужно сделать, это создать Снаряды со значением Команды, отличным от значения Команды Игрока. Однако у меня все еще могут быть случаи, когда этого недостаточно. Например, Игрок может иметь щиты, которые временно непроницаемы для снарядов, но не будут защищать от прямого столкновения с противником и так далее.

9
задан idlewire 25 September 2011 в 15:07
поделиться