Аппаратное копирование текстур на SFML
| |
puksus | Дата: Понедельник, 06 Февраля 2017, 12:57 | Сообщение # 1 |
Пчёлка Зоя
Сейчас нет на сайте
| В ходе написания кода игры к 13-му гамирону столкнулся с проблемой.
Имеется карта из тайлов, на тайлы в ходе игры может капать кровь, падать трупы и т. д. и т. п. И я хочу чтобы эти изменения оставались на уровне навсегда. Поэтому вместо того, чтобы рисовать кучу объектов типа крови и трупов, я решил каждому тайлу прицепить свою собственную текстуру, на которую буду прямиком рендерить всё что нужно.
Сначала я прицепил каждому тайлу объект sf::RenderTexture - и всё было бы отлично, но оказалось, что, когда число тайлов превысило штук 80 (а это очень мало), то прога вылетала с ошибкой при больших размерах уровня.
Тогда я решил цеплять к тайлам обычные текстуры, ну и теперь рендеринг чего-то в этот тайл выглядит вот так:
//renderTileScreen - временный экран по размеру тайла, куда рендерим то что нам нужно //tile->tilePaintTexture - текстура тайла //копируем старое содержимое drawTexture(&renderTileScreen, tile->tilePaintTexture, TILE_SIZE/2.0f, TILE_SIZE/2.0f); //добавляем новое drawTexture(&renderTileScreen, tex, drawX, drawY, angle, scaleX, scaleY);
//SLOOOOOOW //применяем изменения renderTileScreen.display(); sf::Image tempImage = renderTileScreen.getTexture().copyToImage(); tile->tilePaintTexture.loadFromImage(tempImage);
Здесь сначала мы рисуем то, что нужно во временный рендер таргет, затем копируем его содержимое в оперативку, и из оперативки пересоздаём текстуру тайла. Вся эта процедура чудовищно медленная. Можно ли как-то сказать прямиком видеокарте "а скопируй-ка мне эту текстуру вот в эту"?
https://vk.com/beezoya
Сообщение отредактировал puksus - Понедельник, 06 Февраля 2017, 13:00 |
|
| |
Gudleifr | Дата: Понедельник, 06 Февраля 2017, 13:15 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| Цитата puksus ( ) И я хочу чтобы эти изменения оставались на уровне навсегда. Т.е. к концу игры уровень должен хранится в памяти "попиксельно"?
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
puksus | Дата: Понедельник, 06 Февраля 2017, 13:41 | Сообщение # 3 |
Пчёлка Зоя
Сейчас нет на сайте
| Gudleifr, да, грубо говоря, хранится каждый пиксель карты.
Если брать карту размером 180х180 тайлов (этого хватит с лихвой) и каждый тайл размером 32х32 пикселя, то всё хозяйство будет жрать 126 метров видеопамяти. Думаю, это не проблема даже для слабого компа.
https://vk.com/beezoya
|
|
| |
Gudleifr | Дата: Понедельник, 06 Февраля 2017, 14:02 | Сообщение # 4 |
почти ветеран
Сейчас нет на сайте
| При таком грубом квантовании - 32*32 - хватит заранее заготовленных тайлов с пятнами и трупами.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
puksus | Дата: Понедельник, 06 Февраля 2017, 14:21 | Сообщение # 5 |
Пчёлка Зоя
Сейчас нет на сайте
| Gudleifr, а если труп свалился на стыке тайлов? Кроме того, нужно будет ещё рендерить упавшие на уровень стрелы, следы, скажем, от взрыва фаербола. Загатавливать 1000 текстур подо все комбинации?
В общем, я уже чётко решил, что подобные объекты должны рендериться прямо на карту, это не обсуждается. Из этого встал вопрос копирования обычных текстур, ибо SFML отказывается создавать рендер таргет для каждого тайла. Поэтому вопрос стоит конкретно о копировании текстур.
Хотя у меня есть ещё одна идея - делать рендер таргет не каждому тайлу, а скажем, целым блокам размерами 32х32 тайла. Если вопрос о копировании не будет решён - возможно, перепишу под использование подобных блоков.
https://vk.com/beezoya
|
|
| |
Gudleifr | Дата: Понедельник, 06 Февраля 2017, 14:27 | Сообщение # 6 |
почти ветеран
Сейчас нет на сайте
| Цитата puksus ( ) Загатавливать 1000 текстур подо все комбинации? Вы только что заготовили 32400.
Цитата puksus ( ) Поэтому вопрос стоит конкретно о копировании текстур. А для подобных вопросов о SFML нет специального раздела форума?
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
puksus | Дата: Понедельник, 06 Февраля 2017, 14:43 | Сообщение # 7 |
Пчёлка Зоя
Сейчас нет на сайте
| Цитата Gudleifr ( ) Вы только что заготовили 32400. Положение объектов не привязано к сетке уровня. Если бы оно было привязано, тогда действительно имело бы смысл делать так, как вы сказали. Поэтому в моём случае заготовка текстур заранее не имеет смысла вовсе.
Цитата Gudleifr ( ) А для подобных вопросов о SFML нет специального раздела форума? Ну подскажите, что за раздел. Вижу только раздел про движки и конструкторы. Я бы не назвал sfml движком и тем более конструктором.
https://vk.com/beezoya
|
|
| |
Gudleifr | Дата: Понедельник, 06 Февраля 2017, 14:50 | Сообщение # 8 |
почти ветеран
Сейчас нет на сайте
| Цитата puksus ( ) Положение объектов не привязано к сетке уровня. 32*32? Привяжите, все равно никто не заметит.
Цитата puksus ( ) Вижу только раздел про движки и конструкторы. Это к ценителям. Но то, что технические тонкости SFML не относятся к общим проблемам программирования, это точно.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
puksus | Дата: Понедельник, 06 Февраля 2017, 15:00 | Сообщение # 9 |
Пчёлка Зоя
Сейчас нет на сайте
| Цитата Gudleifr ( ) 32*32? Привяжите, все равно никто не заметит. Да ну? Во-первых, в моей игре двукратное увеличение, значит, 32 пикселя превращаются в 64, во вторых, как тогда будет выглядить перемещение объектов (например, персонажей)? Резкими скачками визуально длиной в 64 пикселя? В третьих, а что тогда делать, когда несколько персонажей находятся в одном тайле?
В общем, то, что объекты не привязаны к сетке - также не обсуждается.
Цитата Gudleifr ( ) Это к ценителям. Но то, что технические тонкости SFML не относятся к общим проблемам программирования, это точно. Вы не сказали, в какой раздел форума следует писать с такой проблемой. Я подходящего вообще не вижу.
Кроме того, насчёт конкретной проблемы так ни слова и не было сказано.
https://vk.com/beezoya
|
|
| |
Gudleifr | Дата: Понедельник, 06 Февраля 2017, 15:05 | Сообщение # 10 |
почти ветеран
Сейчас нет на сайте
| Цитата puksus ( ) как тогда будет выглядить перемещение объектов Так же, как оно выглядело в старых RTS (Dune II, Warcraft и т.д.), где все статические состояния были привязаны к клеткам.
Цитата puksus ( ) Кроме того, насчёт конкретной проблемы так ни слова и не было сказано. Не исключаю, что Вы здесь самый крутой знаток SFML. Иначе, наверное, раздел бы, все-таки, создали.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
puksus | Дата: Понедельник, 06 Февраля 2017, 15:13 | Сообщение # 11 |
Пчёлка Зоя
Сейчас нет на сайте
| Gudleifr, я сам решу, какого рода игру мне писать и какая в ней будет заложена механика. Объекты рендерятся прямо на карту и не привязаны к тайлам. Я не буду это обсуждать.
Цитата Gudleifr ( ) Не исключаю, что Вы здесь самый крутой знаток SFML. Иначе, наверное, раздел бы, все-таки, создали. Что, по вашему, лучше, ошибиться с разделом или развести оффтоп?
https://vk.com/beezoya
|
|
| |
Gudleifr | Дата: Понедельник, 06 Февраля 2017, 15:32 | Сообщение # 12 |
почти ветеран
Сейчас нет на сайте
| Цитата puksus ( ) развести оффтоп Где Вы видите оффтоп? Вы влезли в тему где решаются общие проблемы. Вам дали решение "в общем". Для решения частных технических проблем есть другие темы (форумы).
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
puksus | Дата: Понедельник, 06 Февраля 2017, 15:43 | Сообщение # 13 |
Пчёлка Зоя
Сейчас нет на сайте
| Дебилизм. Вопрос закрыт. Буду переделывать через большие блоки тайлов.
https://vk.com/beezoya
|
|
| |
Gudleifr | Дата: Понедельник, 06 Февраля 2017, 15:54 | Сообщение # 14 |
почти ветеран
Сейчас нет на сайте
| Цитата puksus ( ) Дебилизм. Нет, просто непонимание того, что игра, будь хоть она трижды компьютерная, не состоит в навешивании на "как у всех" самых модных фич без разбору. Равно, как и программирование не сводится к коллекционированию разнообразых фич, которые можно скопипастить, не понимая.
Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
|
|
| |
|