2012-09-17 3 views
1

며칠 째로 자바 용으로 매끄럽게 사용하고 있으며 심각한 문제가 있습니다. 800x600의 솔루션으로 완전히 빈 apllication (그냥 fps를 보여줍니다)을 실행하면 700과 800 사이의 fps 카운트를 얻습니다. 13300 항목이있는 배열을 녹색 및 흰색 직사각형의 그리드로 그리면 fps가 약 70 정도로 떨어집니다.슬릭은 매우 느리지 만 드로우닝 사각형 만

배열에 항목이 많을수록 속도가 느려집니다. 는 1024 × 768의 솔루션과 내가 하나의 항목을 그리는 방법 (40)

-21760 입력 항목 FPS의 드롭 배열의 예를 들면 다음과 같습니다

public void draw(Graphics graphics){ 
    graphics.setColor(new Color(getColor().getRed(), getColor().getGreen(), getColor().getBlue(), getColor().getAlpha())); 

    graphics.fillRect(getPosition().x, getPosition().y, getSize().x, getSize().y); 

    Color_ARGB white = new Color_ARGB(Color_ARGB.ColorNames.WHITE); 
    graphics.setColor(new Color(white.getRed(), white.getGreen(), white.getBlue(), white.getAlpha())); 
} 

을 그리고 이것은 내가 전체 배열을 그리는 방법은 다음과 같습니다

public void draw(Graphics graphics) { 
    for (int ix = 0; ix < getWidth(); ix++) { 
     for (int iy = 0; iy < getHeight(); iy++) { 
      getGameGridAt(ix, iy).draw(graphics); 
     } 
    } 
} 

제 의견으로는 21760 그다지 중요하지 않습니다. 내 코드에 문제가 있습니까? 너무 매끄 럽기 때문에 너무 많은 사각형을 그릴 수 있습니까?

답변

1

화면에 사각형 만 그리려는 경우입니다. 화면 경계가 x 방향으로 0에서 1024로 이동하고 y 방향으로 0에서 768으로 이동하는 경우 해당 경계 안에있는 사각형을 반복하고 그 사각형 만 그리기를 원할 것입니다. 나는 그 범위 안에서 21760 개의 직사각형을 그리려하고 있다고 상상할 수 없습니다.

정적 사각형을 하나 생성 한 다음 매번 새로운 사각형을 작성하지 말고 그려야하는 모든 위치에서 하나의 사각형을 그리십시오. 예를 들어, 내가 만들고있는 게임에서 "풀"타일 인 1000 개의 타일을 가질 수 있지만 1000 개의 타일 모두 동일한 정적 텍스처를 공유합니다. 따라서 각 타일이 고유 한 이미지를 만드는 대신 하나의 이미지 만 참조하면됩니다.

각 사각형은 여전히 ​​고유 한 상태를 유지할 수 있습니다. 자신 만의 사각형 클래스를 만들고 5 * 5 이미지를 보유하는 정적 최종 이미지를 만드십시오. 각 사각형은 그릴 필요가있을 때이 이미지를 사용합니다. 여전히 각 사각형에 대해 고유 한 속성을 가질 수 있습니다. 예를 들어 개인 Vector2f 위치, 개인 부울 isAlive 등

+0

사실 저는 많은 직사각형을 그립니다. 나는 Conways Game of Life를 프로그래밍하고있다. 그리고 하나의 단일 필드는 현재 5 * 5 픽셀입니다. 그리드는 1024/5 넓이와 768/5 높이입니다. – M0rgenstern

+0

하나의 정적 사각형을 만든 다음 매번 새로운 사각형을 만드는 대신 그릴 필요가있는 모든 다른 위치에 하나의 사각형을 그려보십시오. 예를 들어, 내가 만들고있는 게임에서 "풀"타일 인 1000 개의 타일을 가질 수 있지만 1000 개의 타일 모두 동일한 정적 텍스처를 공유합니다. 따라서 각 타일이 고유 한 이미지를 만드는 대신 하나의 이미지 만 참조하면됩니다. – theDazzler

+0

그럴 수 있습니다. 모든 사각형에는 고유 한 상태가 있기 때문입니다. 그것은 죽음이나 살아있을 수 있습니다. 또한 모든 직사각형에는 이전 상태로 돌아갈 수 있도록 이전 상태 목록이 있습니다. – M0rgenstern

0

당신은 아마 그것보다 더 빨리 개별 사각형을 그릴 수 없을 것입니다.

VBO (vertex buffer objects)를 사용하여 초당 수백만 개의 폴리곤을 렌더링하는 게임. 이를 위해서는 래퍼가 아닌 OpenGL API (LWJGL)에 대해 코드를 작성해야합니다.

0

단 몇 개의 색상을 사용하기 때문에 새로운 색상 객체를 만들 때마다 하나 하나의 색상 객체가 느리게 생성됩니다 ... 사용 된 각 색상마다 새로운 색상을 한 번만 사용하고 다시 사용할 수있는 색상을 어딘가에 저장하십시오. 클래스를 사용하여 함수를 호출하는 것보다 지속적으로 메모리를 할당하고 해제하는 것은 매우 느립니다.

그리고

이 때마다 새로운 사용하지 않는만큼 혜택이 될하지만 당신은 모든 함수 호출의 결과를 캐싱 및

public void draw(Graphics graphics) { 
    int ixmax = getWidth(); 
    int iymax = getHeight(); 
    for (int ix = 0; ix < ixmax; ix++) { 
     for (int iy = 0; iy < iymax; iy++) { 
      getGameGridAt(ix, iy).draw(graphics); 
     } 
    } 
} 

로 코드를 재 작성 아니면하지 않으려면 생각이 없을 수도 있습니다 동안 새 변수를 선언하는 경우

public void draw(Graphics graphics) { 
    for (int ix = getWidth() - 1; ix >= 0; ix--) { 
     for (int iy = getHeight() - 1; iy >= 0; iy--) { 
      getGameGridAt(ix, iy).draw(graphics); 
     } 
    } 
} 
+0

모든 단계에서 색상이 새로 생성되지 않도록 코드가 변경되었습니다. 그러나 그것은 변화시키지 않았습니다. – M0rgenstern

+0

미안하지만, 정말로 시도해 보았습니다. 자바가 정상적으로 도움을 받았을 것입니다. 자바가 자주 재사용한다는 것을 감지하고 자주 할당 해제하거나 할당을 해제하는 메커니즘을 가지고 있습니다. (정말로 도움이되지 않는 Java 전문가입니다. – xception

+0

@ M0rgenstern 만약 당신이 C++에 익숙하다면, QGraphicsScene (Qt에서)이 매우 많은 수의 아이템을 관리하는 방법을 살펴 보자. 문서의 설명'QGraphicsScene 클래스는 많은 수의 2D 그래픽을 관리하기위한 표면을 제공한다. items.'. 아주 좋은 성능을 가진 매우 큰 세트의 항목을 처리 할 수 ​​있습니다. 코드를 보면 코드를 그리는 방법을 줄 수 있습니다 (그리드가 너무 큽니다. 한번에 모든 것을 볼 수있는 것은 아닙니다) – xception

0

Slick이 허용 할 수 있는지 확실하지 않지만이 것이 체스 판 그리드처럼 보이는 경우 ... 4 개의 직사각형을 그릴 수 있고 결과를 사용할 수 있습니다 전체 이미지의 질감으로 이미지.나는 자바 프로그래머조차도 해결책을 생각해 내지 못한다.

+0

직사각형의 색이 다르기 때문에 불가능합니다. 그리고 색상은 때때로 바뀔 수 있습니다. 그리드가 채색되어있는 패턴이 없습니다. – M0rgenstern

+0

@ M0rgenstern 색상은 때때로 변경됩니다. 그리드를 한 번만 그리면 결과 이미지가 저장되고, 다음 반복에서는 이미지가 페인트되고 이미지가있는 경우 변경된 그리드 요소가 그려집니다. 변경하여 캐시를 업데이트하십시오. 이렇게하면 그리기 작업이 크게 줄어 듭니다. 그리고 코드 개선이 성능에 영향을 미치지 않는다는 점을 고려할 때 분명히 여기서 병목 현상이 발생합니다. – xception

0

방금 ​​찾은 또 다른 대답은 완전한 크기의 격자 (5x5)입니다.이 경우 가장 빠른 방법은 각 항목을 단일 픽셀로 그리는 것입니다 (메모리에서 직접이 작업을 수행 할 수 있습니다). 2 차원 배열을 사용하여) 500 %로 스케일링하거나 텍스처로 사용하고 원하는 크기의 단일 직사각형을 그립니다 ... 아주 빨라야합니다. 이전 답변으로 인해 혼란스러워서 미안합니다. 처음부터 더 명확하게 말하고 있어야합니다. 확장과 질감은 여전히 ​​같은 것을 사용하여 메모리에 그릴 수 있습니다 사용할 수없는 경우 잘 모르겠어요,하지만

for(int x = 0; x < grid.width(); x++) { 
    for(int y = 0; y < grid.height(); y++) { 
     image[x*5][y*5] = grid.color[x][y]; 
     image[x*5][y*5 + 1] = grid.color[x][y]; 
     image[x*5][y*5 + 2] = grid.color[x][y]; 
     image[x*5][y*5 + 3] = grid.color[x][y]; 
     image[x*5][y*5 + 4] = grid.color[x][y]; 
    } 
    memcpy(image[x*5+1], image[x*5], grid.height() * sizeof(image[0][0])); 
    memcpy(image[x*5+2], image[x*5], grid.height() * sizeof(image[0][0])); 
    memcpy(image[x*5+3], image[x*5], grid.height() * sizeof(image[0][0])); 
    memcpy(image[x*5+4], image[x*5], grid.height() * sizeof(image[0][0])); 
} 

를 (C++로 작성된를, 그것은 자신을 자바 번역하시기 바랍니다) 아마 그래픽 x와 y는 여기에서 사용 된 것보다 역순으로 표현 될 수 있습니다. 따라서 코드를 적절하게 변경하십시오 (몇 번의 반복 작업이 완료 되 자마자 나타납니다). 데이터도 약간 다르게 구조화되어 있지만 생각합니다. 아이디어는 분명해야합니다.

관련 문제