Огромная площадь текстуры? - PullRequest
0 голосов
/ 10 августа 2009

Это очень общий вопрос, который не связан с конкретным языком. У меня есть этот массив целых:

int[100][100] map;

Он содержит только номера плиток и отображается как 256x256 плиток. Так что это в основном просто карта тайлов или как она должна называться. Дело в том, что я хочу иметь возможность записывать что угодно на карту, где угодно, и она должна оставаться там. Например, уметь рисовать на материалах на земле, таких как трава, цветы, камни и другие вещи, делая ландшафт более разнообразным, без необходимости рендеринга каждого из этих спрайтов огромное количество раз каждый раз, когда он рендерится. Но если каждая плитка содержит свою собственную текстуру для записи, это будет ужасно занимать память при 256x256x100x100 = 655360000 пикселей для хранения. Разве это не похоже на гигабайты данных или что-то в этом роде??

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

Если кому-то интересно, я использую C ++ с HGE (игровой движок Haaf).

РЕДАКТИРОВАТЬ: я решил ограничить количество материала на экране, чтобы он мог отображать. Но посмотрите сюда, так что, возможно, вы поймете, чего я пытаюсь достичь: Ссылка на изображение, потому что я не могу использовать теги изображений: (* ​​1011 *

Ответы [ 4 ]

2 голосов
/ 10 августа 2009

Если он основан только на плитке, то вы сохраняете только один экземпляр каждой уникальной плитки и каждого уникального «наложения» (цветок, камень и т. Д.). Вы ссылаетесь на него по идентификатору или месту в памяти, как вы это делали.

Вы бы просто сохранили местоположение (номер плитки и местоположение на плитке) и ссылку на оверлей, чтобы «нарисовать» его, не занимая много памяти.

Кроме того, я уверен, что вы это знаете, но вы отображаете только то, что на экране. Таким образом, использование памяти остается постоянным, когда все загружено.

1 голос
/ 10 августа 2009

Вместо сохранения только номера плитки сохраните также номер оверлея и позицию смещения.

struct map_zone {
    int tile; // tile number
    int overlay; // overlay number (flower, rock, etc). In most cases will be zero
    int overlay_offset_x; // draw overlay at X pixels across from left
    int overlay_offset_y; // draw overlay at Y pixels down from top
}

map_zone[100][100] map;

А для рендеринга:

int x, y;
for(y = 0; y < 100; ++y) {
    for(x = 0; x < 100; ++x) {
        render_tile(map[y][x].tile)
        render_overlay(map[y][x].overlay, map[y][x].overlay_offset_x, map[y][x].overlay_offset_y);
    }
}

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

1 голос
/ 10 августа 2009

Я не совсем уверен, что вы пытаетесь сделать, но вы, вероятно, должны иметь плитки в отдельных слоях. Итак, скажем, что для каждой «плитки» у вас есть список упорядоченных текстур снизу вверх, которые вы смешиваете вместе, таким образом вы сохраняете только индексы плиток.

0 голосов
/ 10 августа 2009

Вы должны использовать альфа-карты ..

Вы собираетесь нарисовать текстуру 256x256, которая отображает всю вашу местность. для каждого канала r, g, b, a вы будете накладывать свой ландшафт на другую текстуру ..

r = sand.jpg g = grass.jpg b = water.jpg a = ground.jpg

в шейдере, вы проверите цвет альфа-карты и раскрасите этими текстурами ..

Я сейчас так делаю, и мне это нравится

alt text

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...