.NET Framework 4를 사용하여 C#으로 프로그래밍하고 XNA를 사용하여 타일 기반 게임을 만들려고합니다. 하나의 큰 텍스처 (256 x 4096 픽셀)가 있습니다. 타일 기반 게임이라는 것을 기억하십시오.이 텍스처는 크기가 32 픽셀 x 32 픽셀 인 많은 타일을 포함하기 때문에 엄청납니다. 타일 기반 게임이 어떤 전문가인지 확실히 알 것입니다. 방향은 직각 (체스 보드처럼)이며 등각이 아닙니다.Draw() 20,000 32 x 32 텍스처 또는 1 개의 큰 텍스처 20,000 시간
Game.Draw() 메서드에는 두 가지 옵션이 있는데 그 중 하나는 다른 옵션보다 훨씬 효율적입니다.
선택/방법 # 1 :
세미 의사 코드 :이
public void Draw()
{
// map tiles are drawn left-to-right, top-to-bottom
for (int x = 0; x < mapWidth; x++)
{
for (int y = 0; y < mapHeight; y++)
{
SpriteBatch.Draw(
MyLargeTexture, // One large 256 x 4096 texture
new Rectangle(x, y, 32, 32), // Destination rectangle - ignore this, its ok
new Rectangle(x, y, 32, 32), // Notice the source rectangle 'cuts out' 32 by 32 squares from the texture corresponding to the loop
Color.White); // No tint - ignore this, its ok
}
}
}
캡션 : 그래서, 효율적으로, 첫 번째 방법은 참조하는 하나 개의 큰 텍스처 많은 많은 시간마다 이 큰 텍스처의 작은 사각형을 사용하여 적절한 타일 이미지를 그립니다. 효과적으로, 두 번째 방법은 많은 작은 텍스처 여러 번 드로잉되도록 :
선택/방법 # 2 :
세미 의사 코드 :
public void Draw()
{
// map tiles are drawn left-to-right, top-to-bottom
for (int x = 0; x < mapWidth; x++)
{
for (int y = 0; y < mapHeight; y++)
{
Texture2D tileTexture = map.GetTileTexture(x, y); // Getting a small 32 by 32 texture (different each iteration of the loop)
SpriteBatch.Draw(
tileTexture,
new Rectangle(x, y, 32, 32), // Destination rectangle - ignore this, its ok
new Rectangle(0, 0, tileTexture.Width, tileTexture.Height), // Notice the source rectangle uses the entire texture, because the entire texture IS 32 by 32
Color.White); // No tint - ignore this, its ok
}
}
}
자막.
질문 : 어떤 방법과 이유가 있습니까? 개인적으로, 나는 첫 번째 방법을 사용하는 것이 훨씬 더 효율적이라고 생각합니다. 맵에서 타일 배열에 대해 의미하는 바가 무엇인지 생각해 보면 (2000 타일로 2000 개가있는 큰지도를 생각해보십시오.) 각 Tile 객체는 소스의 X 및 Y 위치에 대해 2 개의 정수만 포함하면됩니다. 하나의 큰 텍스처 - 8 바이트의 사각형. 그러나 메서드 # 2를 사용하는 경우 맵의 타일 배열에있는 각 Tile 객체는 32 바이트 32 텍스처 (이미지 - RGBA 픽셀에 32 × 32 배의 메모리를 할당해야 함)를 저장해야하므로 타일 당 4096 바이트 그때? 그래서, 어떤 방법과 왜? 우선 순위는 속도, 메모리 부하, 효율성 또는 전문가가 믿는 것입니다.
종합적인 답변에 진심으로 감사드립니다. 많은 감사합니다! – Jason