JavaFX TriangleMesh вызывает большие накладные расходы / медлительность по сравнению с обычными Box - PullRequest
0 голосов
/ 26 февраля 2019

Моя цель - создать боксы с отдельными изображениями на каждой стороне, которые я завершаю, используя TriangleMesh для создания блоков и используя одну текстуру для отображения точек над сеткой.

Проблема заключается в том, что я испытывал большие накладные расходы (высокая скорость памяти, длительное время загрузки и медлительность при перемещении объектов в мире) при создании этих TriangleMesh, и я не уверен, почему полностью, но вотнесколько моих догадок.

  1. Сначала я пытался использовать в общей сложности 8 точек и повторно использовать точки при создании отдельных граней, а также оборачивать текстуры, но по какой-то причине текскорды не сделали этого.нравится использовать только 8 баллов.Когда я смотрю на класс Бокса, я вижу, что они используют 24 точки так же, как и я, поэтому кажется, что мы не можем повторно использовать точки.

    2.a Я загружаю 3 изображения в hbox, а затем делаю снимок длязатем сопоставьте координаты.Мне интересно, вызывает ли моментальный снимок какие-либо проблемы, или если есть какие-то проблемы с количеством пикселей.

2.b Это далее возникает, когда я пытался повернуть несколько ящиков, которые былисложены в одну большую коробку, и она все еще имеет тонну медлительности, если не больше.Я бы сделал снимок x-го числа изображений, а затем отобразил их на этой большой коробке.то есть, если бы у меня было 5x5x5, это была бы одна коробка с 5 изображениями, сопоставленными с каждой стороны.Даже с 1 одиночной сеткой это все еще вызывает медленность.Он ускоряется, если я редактирую «fitWidth / fitHeight» imageView, что вызывает изменение качества.Мне кажется, что количество пикселей является причиной.Дело в том, что если я беру одни и те же изображения и просто умножаю их, почему это вызывает медлительность?Тем более, что при создании обычного блока у одного изображения, которое я использовал, было больше пикселей, чем у других изображений, поэтому я подумал бы, что будет быстрее, если сам сделаю треугольную сетку.

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

Я просто пытаюсь понять, почему я делаю TriangleMesh самостоятельно, который имеет код, аналогичный коду Box, за исключением.

  1. без группы сглаживания лица, но не уверен, что это имеет значение.

  2. Массив моего лица отличается, и немного сбит с толку, почему у них 24точки, но массив граней идет только от 1-8

                int[] faces = {
                2, 2, 1, 1, 0, 0, //front
                2, 2, 3, 3, 1, 1,
    
                6, 6, 5, 5, 4, 4, //right
                6, 6, 7, 7, 5, 5, 
    
                10, 10, 9, 9, 8, 8, //back
                10, 10, 11, 11, 9, 9,
    
                14, 14, 13, 13, 12, 12,//left
                14 ,14, 15, 15, 13, 13,
    
                18, 18, 17, 17, 16, 16,//top
                18, 18, 19, 19, 17, 17,
    
                22, 22, 21, 21, 20, 20, //bottom
                22, 22, 23, 23, 21, 21`
    
  3. Мои texCoords - это 6 наборов пар вместо 1, установленного здесь.

static TriangleMesh createMesh (float w, float h, float d) {

// NOTE: still create mesh for degenerated box
float hw = w / 2f;
float hh = h / 2f;
float hd = d / 2f;

float points[] = {
    -hw, -hh, -hd,
     hw, -hh, -hd,
     hw,  hh, -hd,
    -hw,  hh, -hd,
    -hw, -hh,  hd,
     hw, -hh,  hd,
     hw,  hh,  hd,
    -hw,  hh,  hd};

float texCoords[] = {0, 0, 1, 0, 1, 1, 0, 1};

// Specifies hard edges.
int faceSmoothingGroups[] = {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

int faces[] = {
    0, 0, 2, 2, 1, 1,
    2, 2, 0, 0, 3, 3,
    1, 0, 6, 2, 5, 1,
    6, 2, 1, 0, 2, 3,
    5, 0, 7, 2, 4, 1,
    7, 2, 5, 0, 6, 3,
    4, 0, 3, 2, 0, 1,
    3, 2, 4, 0, 7, 3,
    3, 0, 6, 2, 2, 1,
    6, 2, 3, 0, 7, 3,
    4, 0, 1, 2, 5, 1,
    1, 2, 4, 0, 0, 3,
};

TriangleMesh mesh = new TriangleMesh(true);
mesh.getPoints().setAll(points);
mesh.getTexCoords().setAll(texCoords);
mesh.getFaces().setAll(faces);
mesh.getFaceSmoothingGroups().setAll(faceSmoothingGroups);

return mesh;

}

Я также слышал, что были улучшения в 3D с версией 9. Я пытался обновить последние несколько дней до 11 с проблемами (я пробовал 10 раньше, но многомой код нуждался в исправлениях), и 9 не загружается, поэтому я хотел бы спросить, прежде чем пытаться приложить больше усилий, чтобы заставить 11 работать, если это действительно улучшит ситуацию, но я все еще задаюсь вопросом, почему trianglmesh так сильно замедляется.Возможно, я делаю 1000 коробок максимум.

Спасибо

РЕДАКТИРОВАТЬ:

Пример того, как я создаю изображения.

     public BoxMesh(width, height,depth, int stack)
    {
        float width = width;
        float height = height;
        float depth = depth
        List<ImageView> imageList = new ArrayList();


        imageList.add(new ImageView(new Image("file:"C:\\file1.jpg"));

            HBox h = new HBox();
               Image image = null;
            for(int i = 0; i < stack; i++)
            {

             image = new Image("file:"C:\\file2.jpg");


               ImageView iv = new ImageView(image);
               iv.setFitWidth(image.getWidth()/2);  //decreases quality to
               iv.setFitHeight(image.getHeight()/2);  //speed up program
               h.getChildren().add(iv);
            }  
            imageList.add(new ImageView(h.snapshot(null,null)));


            VBox v = new VBox();
              Image image = null;
             for(int i = 0; i < stack; i++)
            {

               image = new Image("file:"C:\\file3.jpg");


                ImageView iv = new ImageView(image);
                iv.setFitWidth(image.getWidth()/2);
                iv.setFitHeight(image.getHeight()/2);
               v.getChildren().add(iv);

            }

             imageList.add(new ImageView(v.snapshot(null, null)));

        PhongMaterial p = new PhongMaterial();
       HBox hb = new HBox();


     hb.getChildren().addAll(imageList);

    WritableImage snapshot = hb.snapshot(null, null);
    if(snapshot.isError())
    {
        System.out.println(snapshot.exceptionProperty().getValue());
    }
    p.setDiffuseMap(snapshot);
...