2016-08-11 6 views
0

목표pixmap을 동적으로 업데이트하는 충분한 방법은 무엇입니까?

  • 바의 폭을 업데이트하는 동안 건강 줄이 미친 듯이 빠르게 수행 할 수 있도록합니다.
  • 스케일링하면서 품질을 유지합니다 (픽셀 대 미터 비율).

현재 나는 건강 막대가 만들어 Pixmap을 libgdx 사용하고 있지만 새로운 값으로 drawLine 매개 변수를 변경할 때 갑자기 여전히 변화가 없습니다. 아래 코드는 현재 작업중인 코드입니다. 이것이 Pixmap을 동적으로 그리는 충분한 방법인지 확실하지 않습니다.

// This code is working when written all in update method 

Pixmap frame = new Pixmap(32, 3, Pixmap.Format.RGBA8888); 
frame.drawRectangle(...); 
frame.drawLine(...); 

Texture texture = new Texture(frame); 
frame.dispose(); 

batch.begin(); 
batch.draw(texture ...); 
batch.end(); 

샘플 healthbar

enter image description here

+0

당신은 모두 render()에서 호출하고 있습니까? –

+0

네, 그걸 모두 호출했을 때 올바르게 작동하지만, 그걸 모두 호출하지 않는 방법이 있습니까? – ronscript

+0

먼저, 실제로이 목적으로 pixmap을 생성 할 필요가 없습니다. 둘째 어쩌면 당신은 클래스에서 pixmap 필드를 만들 수 있지만 그냥 배우고 싶었거나하지 않았 으면 좋겠어 :) 그건 그렇고 라인과 직사각형을 그리는 동안 pixmap 색상을 변경하고 있습니다. –

답변

4
당신은 그것에 대해 Pixmap를 사용해서는 안

(엄지 손가락의 일반적인 규칙으로 : 당신은 당신이 당신이 잘못된 가능성이 뭔가 픽스맵을 사용할 필요가 있다고 생각하는 경우) . Pixmap은 CPU 메모리 : RAM에 이미지 데이터를로드, 저장 또는 조작하는 데 사용됩니다. CPU 메모리에서 이미지 데이터를 조작하는 것은 상대적으로 느리고 결과 데이터는 예를 들어 화면에 렌더링하는데 사용될 수 없다. SpriteBatch.

그 때문에 CPU 메모리에서 GPU 메모리 인 VRAM으로 데이터를 업로드 (복사)해야합니다. Texture은 VRAM에서 이미지 데이터를 나타내는 데 사용됩니다. 따라서 실제로는 Texture을 작성하면됩니다. 또는 texture.load(pixmap) 메서드를 호출하여 기존 텍스처를 다시 사용할 수도 있습니다. 그러나 RAM에서 VRAM으로 이미지 데이터를 업로드하는 것도 비교적 느립니다.

그래서 CPU에서 이미지 데이터를 조작 한 다음 GPU로 복사하는 대신 GPU를 직접 사용하여 원하는 것을 얻는 것이 좋습니다. 실제로 달성하고자하는 것에 대한 충분한 정보를 제공하지 못했지만 여기서는 시작하는 데 도움이 될 수있는 몇 가지 옵션이 있습니다.

  1. 풀 바의 일부분 만 그립니다. 전체 헬스 바를 나타내는 아트라스에서 실제 건강을 나타내는 이미지의 일부만 렌더링하려는 이미지가 있다고 가정 해 보겠습니다. batch.draw(region.getTexture(), x, y, width * health, height, region.getU(), region.getV(), region.getU() + health * (region.getU2() - region.getU()), region.getV2()); (여기 x, y, 및 height은 세계 좌표이며 health은 0에서 1까지의 정규화 된 건강입니다.
  2. 막대의 크기로 TextureRegion 크기를 조정하십시오. 건강 바가 완전히 불투명하거나 외곽선 만있는 경우 다음 단일 픽셀 TextureRegion을 사용하여 원하는 크기로 조정할 수 있습니다. barch.draw(region, x, y, width * health, height);
  3. nine-patch을 사용합니다.
  4. 실제로는 Pixmap과 동일하지만 더 많은 드로잉 기능을 제공하지만 GPU를 직접 사용하는 것은 ShapeRenderer입니다.
+0

성능면에서 가장 권장하는 것은 어느 것입니까? – ronscript

+1

다른 코드에 따라 다릅니다. 어쨌든'ShapeRenderer'를 이미 사용하고 있다면 이것을 사용할 수도 있습니다. 그러나 'SpriteBatch'를 사용하는 경우 일반적으로 단일 픽셀 인 'TextureRegion'을 스트리치 처리하는 것이 더 효과적입니다 (SpriteBatch로 원하는 색상으로 색상을 지정할 수 있으므로 단일 흰색 픽셀을 사용할 수 있습니다). 어쨌든 눈에 띄는 성능 차이는 결코 없을 것입니다. – Xoppa

+0

현재 ECS 프레임 워크를 사용하고 있으며 다용도 시스템을 이미 만들었으므로 내가 선택한 것을 사용할 수 있으며 게임 아트 디자인은 픽셀 아트로 만들어졌습니다. 내 게임에 가장 적합한 것은 어느 것입니까? – ronscript