Skip to content

Commit

Permalink
workaround: неверный подсчет pests и pestGenes
Browse files Browse the repository at this point in the history
        Подсчет статистики выполняется неверно по причине
        несинхронизированного доступа потоков к переменным класса World.
        (issue #1)

        Данным коммитом вводится подсчет pests и pestGenes по
        фактическому состоянию массива ботов matrix перед отрисовкой мира.
        Это "обходной путь". Главной идеей остается динамическое изменение
        pests и pestGenes в процессе пересчета, то есть при
        рождении/гибели/мутировании бота. Это будет выгоднее по производительности
        при малых шагах отрисовки.
  • Loading branch information
xlam committed Oct 10, 2018
1 parent 9b4ec51 commit 81c4333
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 25 deletions.
40 changes: 22 additions & 18 deletions ru/cyberbiology/Bot.java
Original file line number Diff line number Diff line change
Expand Up @@ -432,12 +432,13 @@ void bot2Organic(Bot bot) {
}
bot.mprev = null;
bot.mnext = null;
this.world.organic++;
this.world.population--;
if (bot.pest > 0) {
this.world.pests--;
this.world.pestGenes -= bot.pest;
}
// todo: https://github.com/xlam/CyberBiology/issues/2
// this.world.organic++;
// this.world.population--;
// if (bot.pest > 0) {
// this.world.pests--;
// this.world.pestGenes -= bot.pest;
// }
}

/**
Expand Down Expand Up @@ -487,16 +488,17 @@ public void deleteBot(Bot bot) {
}
bot.mprev = null;
bot.mnext = null;
if (bot.alive == bot.LV_ORGANIC_HOLD || bot.alive == bot.LV_ORGANIC_SINK) {
this.world.organic--;
}
if (bot.alive == bot.LV_ALIVE) {
this.world.population--;
if (bot.pest > 0) {
this.world.pests--;
this.world.pestGenes -= bot.pest;
}
}
// todo: https://github.com/xlam/CyberBiology/issues/2
// if (bot.alive == bot.LV_ORGANIC_HOLD || bot.alive == bot.LV_ORGANIC_SINK) {
// this.world.organic--;
// }
// if (bot.alive == bot.LV_ALIVE) {
// this.world.population--;
// if (bot.pest > 0) {
// this.world.pests--;
// this.world.pestGenes -= bot.pest;
// }
// }
world.clearBot(bot.x, bot.y); // удаление бота с карты
}

Expand Down Expand Up @@ -861,7 +863,8 @@ private void botDouble(Bot bot) {
newbot.direction = (int) (Math.random() * 8); // направление, куда повернут новорожденный, генерируется случайно

world.setBot(newbot); // отмечаем нового бота в массиве matrix
this.world.population++;
// todo: https://github.com/xlam/CyberBiology/issues/2
// this.world.population++;
}

/**
Expand Down Expand Up @@ -914,7 +917,8 @@ private void botMulti(Bot bot) {
newbot.direction = (int) (Math.random() * 8); // направление, куда повернут новорожденный, генерируется случайно

world.setBot(newbot); // отмечаем нового бота в массиве matrix
this.world.population++;
// todo: https://github.com/xlam/CyberBiology/issues/2
// this.world.population++;

if (nbot == null) { // если у бота-предка ссылка на следующего бота в многоклеточной цепочке пуста
bot.mnext = newbot; // то вставляем туда новорожденного бота
Expand Down
9 changes: 9 additions & 0 deletions ru/cyberbiology/World.java
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,15 @@ public void run() {
.filter(b -> b != null && b.isOrganic())
.parallel()
.count();
pests = (int) Arrays.stream(matrix)
.filter(b -> b != null && b.pest > 0)
.parallel()
.count();
pestGenes = (int) Arrays.stream(matrix)
.filter(b -> b != null && b.pest > 0)
.mapToInt(b -> b.pest)
.parallel()
.sum();
// замеряем время пересчета 10 итераций без учета отрисовки
PerfMeter.tick();
paint(); // отображаем текущее состояние симуляции на экран
Expand Down
7 changes: 0 additions & 7 deletions ru/cyberbiology/prototype/view/View.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@ public Image paint(World world, JPanel canvas) {

g.drawRect(0, 0, world.width * World.BOTW + 1, world.height * World.BOTH + 1);

world.pests = 0;
world.pestGenes = 0;

for (int y = 0; y < world.height; y++) {
for (int x = 0; x < world.width; x++) {
Bot bot = world.getBot(x, y);
Expand All @@ -44,10 +41,6 @@ public Image paint(World world, JPanel canvas) {
if (bot != null && bot.alive == bot.LV_ALIVE) {
g.setColor(Color.BLACK);
g.drawRect(x * World.BOTW, y * World.BOTH, World.BOTW, World.BOTH);
if (bot.pest > 0) {
world.pestGenes += bot.pest;
world.pests++;
}
}
}
}
Expand Down

0 comments on commit 81c4333

Please sign in to comment.