Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
кверти
4 / 4 / 3
Регистрация: 22.09.2013
Сообщений: 166
Завершенные тесты: 2
1

Dirty в коде: Кто может подсказать для чего это и можно ли как-то убрать это?

03.06.2017, 16:38. Просмотров 527. Ответов 10
Метки нет (Все метки)

Добрый день. Увидел тут в используемом фреймворке переменную dirty, которая ограничивает работу методов. Кто может подсказать для чего это и можно ли как-то убрать это? Исходники естественно открыты только для чтения.
Полный код: https://pastebin.com/XursTYgN (сюда не влез из-за ограничения)

Добавлено через 3 минуты
Пробовал вызывать метод getVertices для того, чтобы просто перевести этот флаг в false. Но методы всеравно не отрабатывают как нужно.

Добавлено через 2 минуты
Вот как я вызываю методы для теста:
Java
1
2
3
background = ElementFactory.createBackground("blue");
        background.getVertices();
        background.setSize(100,100);
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.06.2017, 16:38
Ответы с готовыми решениями:

Кто может это переработать для андроида? И вообще это возможно?
програма на CLI (windows form)

Кто сможет объяснить что означает в этом коде 0x55555, что это такое, для чего предназначено?
#include "stdafx.h" #pragma warning(disable : 4996) #include <stdio.h> #include <conio.h>...

При включении нетбука появляется, как бы окно, я не знаю что это такое, подскажите как можно убрать это (фото внутри)

Разваливается RAID1 - что можно сделать, и, вообще, из-за чего это может происходит?
Материнская плата: Asus X79-Deluxe Жесткие диски: 2 диска ST31000524AS система стоит...

Кто знает и может подсказать с чего начать
Есть телефон! хотелось бы попробовать что-то сделать из его экранчика .Тока не в курсе с чего...

10
turbanoff
Эксперт Java
4054 / 3789 / 743
Регистрация: 18.05.2010
Сообщений: 9,330
Записей в блоге: 11
Завершенные тесты: 1
05.06.2017, 13:18 2
Цитата Сообщение от кверти Посмотреть сообщение
которая ограничивает работу методов
Что это значит? Как это ограничивает?
Судя по коду - это флажок, для кэширования результатов getVertices.
При любом вызове setter флажок сбрасывается в true, так как закэшированное значение будет устаревшим, и его наго рассчитать заново.
Как он вам помешал в вашем коде?
0
кверти
4 / 4 / 3
Регистрация: 22.09.2013
Сообщений: 166
Завершенные тесты: 2
07.06.2017, 08:09  [ТС] 3
К примеру я вызываю метод background.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); Фон должен принять размер соответствующий размеру экрана девайса. Но этого не происходит. Изображение фона остается неизменным. Тоже самое если вызывать метод: setBounds.
Почему я подумал что проблема в переменной dirty:
Объявление: private boolean dirty = true;
Изначально флаг true. В конструкторах нет аргумента для того чтобы задать значение для него. Специальных методов тоже нет для изменения.
Смотрим метод setSize. Перед тем как переписывается float[] vertices есть условие: if (dirty) return;
Таким образом получается, если я создаю объект типа Sprite и сразу после создания вызываю метод setSize то флаг будет true и в методе сработает return, но не отработает основная логика. Верно?
0
LeX
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,439
07.06.2017, 10:02 4
дай ссылку на исходник либы
0
07.06.2017, 10:02
кверти
4 / 4 / 3
Регистрация: 22.09.2013
Сообщений: 166
Завершенные тесты: 2
07.06.2017, 12:42  [ТС] 5
https://github.com/libgdx/libgdx/blo...2d/Sprite.java Вот ссылка на класс с кодом, который я кидал выше. Там можно всё остальное найти.
Сайт с фреймворком на всякий случай: https://libgdx.badlogicgames.com/
0
LeX
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,439
07.06.2017, 12:50 6
а проанализировать этот класс вообще никак? посмотреть где и при каких условиях этому флагу присваивается false?
Java
1
2
3
4
5
public void set (Sprite sprite) {
        if (sprite == null) throw new IllegalArgumentException("sprite cannot be null.");
...
        dirty = sprite.dirty;
    }
Java
1
2
3
public float[] getVertices () {
        if (dirty) {
            dirty = false;
ну вот getVertices использованный тобой и сбрасывает, значит setSize должен отработать
0
кверти
4 / 4 / 3
Регистрация: 22.09.2013
Сообщений: 166
Завершенные тесты: 2
07.06.2017, 15:24  [ТС] 7
посмотрите пожалуйста мое первое сообщение.
Вот так я тестирую:
Java
1
2
3
background = ElementFactory.createBackground("blue");
background.getVertices();
background.setSize(100,100);
метод не отрабатывает.

По поводу метода set. dirty просто берется из спрайта с параметром. Так как я не могу сделать спрайт с dirty = false, то это довольно бесполезный метод для отключения этого флага.
0
xoraxax
2204 / 1943 / 570
Регистрация: 05.07.2013
Сообщений: 9,254
Завершенные тесты: 2
07.06.2017, 15:43 8
с чего ты взял, что он не отрабатывает?
0
кверти
4 / 4 / 3
Регистрация: 22.09.2013
Сообщений: 166
Завершенные тесты: 2
07.06.2017, 15:47  [ТС] 9
изображение фона не подстраивается под размер окна если я вызываю: background.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); фон вылазит за рамки экрана. Для теста устанавливал вручную size как 100 на 100. Размер остается неизменным. Пробовал юзать setBounds, но эффект тот же.
0
LeX
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,439
08.06.2017, 12:04 10
а с чего ты взял что метод не отрабатывает. скорее всего тебе окно просто перерисовать надо после изменения размеров.

цикл перерисовки есть? с какой частотой идет перерисовка?
0
кверти
4 / 4 / 3
Регистрация: 22.09.2013
Сообщений: 166
Завершенные тесты: 2
09.06.2017, 14:11  [ТС] 11
Я задаю размер в конструкторе, следовательно сначала задается размер, потом вызывается рендер. Рендер я осуществляю средставами самого фреймворка. Я просто переопределяю метод render. Вот так он выглядит у меня:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
    public void render(SpriteBatch batch) throws InterruptedException {
        batch.setProjectionMatrix(camera.combined);
        world.step(Gdx.graphics.getDeltaTime(), 20, 20);
 
        batch.begin();
        batch.draw(background, 0, 0);
        mainPlatform.getSprite().draw(batch);
        box_1.getSprite().draw(batch);
        character.getSprite().draw(batch);
        batch.end();
 
        box2DDebugRenderer.render(world, camera.combined);
        stage.draw();
 
    }
0
09.06.2017, 14:11
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2017, 14:11

Увидел в коде слово POSIX, для чего это?
Что это за позикс? Зачем это?

Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для чего если можно в сборках это все обьявлять.
Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для...

Факториал! Для кого-то это легко, а кто-то вообще это не знает!
Написать определение функции факториал которая возвращает факториал от полученного в качестве...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.