0 голосов
 
250 просмотров
8.05.2020 / 15:43  DominaN

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

Итак у нас есть класс AWTImage:
Открыть спойлер

Он используется движком для предварительной загрузки и кэширования изображений вне OpenGL контекста. И есть класс Texture:
Открыть спойлер

который используется непосредственно для передачи текстур в контекст OpenGL и дальнейшей их отрисовки. Как мы видим, многие поля дублируются, и при создании текстуры заполняются данными из AWTImage в TextureManager:
Открыть спойлер

Собственно, сделано это для того, чтобы в коде рендера можно было напрямую получать свойства текстуры вида someTexture.width, someTexture.height, someTexture.raw и т.д. вместо someTexture.image.width, someTexture.imageHeight, someTexture.image.raw - суть ясна.

Вопрос в том, есть ли какой-нибудь изящный способ обойтись без дубляжа членов класса, кроме как обернуть их в метод вида getWidth() { return image.width}?
Ответы
 
1 голос
 
# 8.05.2020 / 16:08  vl@volk
Унаследовать класс Texture от AWTImage
8.05.2020 / 19:09  DominaN
Обсуждали уже с Витей в телеге, нет никакого смысла наследовать и тянуть в Texture все автшное дерьмо типа Graphics2D и т.д. Текстура в первую очередь это легковесный класс для взаимодействия напрямую с OpenGL, в то время как AWTImage - тяжелый класс для загрузки и кэширования изображений непосредственно с диска.
 
0 голосов
 
# 13.05.2020 / 18:23  Ginosaji
Вариант с использованием Texture в AWTImage вместо этих полей не подойдёт? Типа этого, придётся AWTImage порефакторить:
  1. public class AWTImage {
  2.     private Texture texture;
  3.  
  4.     public AWTImage(String name, BufferedImage source_image) {
  5.         ...
  6.         texture = createTexture(this.name, this.width, this.height, this.has_alpha);
  7.         texture.image = this;
  8.         texture.raw = this.raw;
  9.     }
  10.  
  11.     public Texture getTexture() {
  12.         return texture;
  13.     }
  14. }
  1. public static Texture createTexture(AWTImage image) {
  2.     if (!TextureManager.cached_textures.containsKey(image.name)) {
  3.         //texture fields already initialized in AWTImage constructor, only compile here
  4.         compileTexture(image.getTexture());
  5.         TextureManager.cached_textures.put(image.name, image.getTexture());
  6.     }
  7.     return getTexture(image.name);
  8. }
14.05.2020 / 19:22  DominaN
Я вообще избавился от связи Texture и AWTImage, оставил только создание в TextureManager. Просто AWTImage используется и вне контекста рендеринга
 
-2 голоса
 
# 9.05.2020 / 20:35  Death
Сделать у текмтуры AWTImage data поле и через texture.getData().(и тут твои поля и методы)
10.05.2020 / 13:45  DominaN
Та я вообще уже от ссылки на AWTImage избавился
Всего: 3

Реклама

Мы в соцсетях

vk tw tg yt