Производительность.

Сообщения
4,758
Лучшие ответы
45
Реакции
637
Версия Minecraft
1.12.2
В общем, я не нашел эффективного способо окрашивать блоки при намокании... решил просто заменять простецкие блокстейты. Но возник вопрос - мир большой, песка много. Во время дождя он будет весь намокать. Смена блокстейта - она равна по ресурсоемкости смене блока? (Грубо говоря лагать будет больше или также, или меньше?)
 

Ivasik

Porting GrandBombaster
Администратор
Сообщения
2,902
Лучшие ответы
77
Реакции
327
Пусть он намокает только там где игрок(определенный радиус бери), пример со снегом.
 
Сообщения
608
Лучшие ответы
5
Реакции
13
Нормальные люди бы подменили текстурку во время дождя и профит.
Или чё серьёзней надо?
 

Ivasik

Porting GrandBombaster
Администратор
Сообщения
2,902
Лучшие ответы
77
Реакции
327
@svk2140, да, но не делать же это во всём мире? Дождь и снег же распространяются на ту область где находится игрок, не дальше(хотя на счёт дождя точно сказать не могу) и ещё одно НО, на новых версия так просто текстуру не заменить) Там нужно менять состояние блока.
 
Сообщения
1,983
Лучшие ответы
18
Реакции
91
Не нужно там состояние блока менять. Надо подменять иконку блока во время сборки чанка в дисплейлист (или что там используется на новых версиях) в зависимости от того, идет ли дождь в мире, есть ли в текущем чанке дождь и находится ли блок под небом. Ничего из этого не требует модификации или чтения блокстейта. Если хочется заменять не только блок прямо под небом - можно использовать в проверке скайлайт, например, чтобы все блоки со светом от неба >= 12 уровня намокали.

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

Dysphoria

aka Agravaine
Модератор
Сообщения
5,993
Лучшие ответы
334
Реакции
1,505
Дождь и снег же распространяются на ту область где находится игрок
Если дождь идет, то он идет во всем мире. Это визуально он рисуется только в небольшом радиусе от игрока.
 

Ivasik

Porting GrandBombaster
Администратор
Сообщения
2,902
Лучшие ответы
77
Реакции
327
@Agravaine, я же писал, что не уверен.
@Oldestkon, да там дисплейлисты. И под состояниями блоков я имел ввиду blockstates, только с помощью них(и iBakedModel) можно установить текстуру блоку(возможно есть и другие варианты, о которых я не знаю:unsure:)
 
Сообщения
1,983
Лучшие ответы
18
Реакции
91
Не знаю как на новых версиях, но на старых достаточно было сделать хук в WorldRenderer в момент, когда он собирает дисплейлист чанка из блоков и подменить там иконку для конкретного блока (там итерируются все блоки в чанке по одному).
Думаю, на новых это мало чем отличается, кроме названий классов и используемого API (если дисплейлисты уже наконец заменили на вбошки).
 

Ivasik

Porting GrandBombaster
Администратор
Сообщения
2,902
Лучшие ответы
77
Реакции
327
Да, на новых версия вбошка используется вместо дисплейлистов.
 

Ivasik

Porting GrandBombaster
Администратор
Сообщения
2,902
Лучшие ответы
77
Реакции
327
Начиная с 1.8, нет больше: метода getIcon, классов связанных с IIcon и т.п.
 

Dysphoria

aka Agravaine
Модератор
Сообщения
5,993
Лучшие ответы
334
Реакции
1,505
Я Коню говорю, он на старых сидит)
 

Ivasik

Porting GrandBombaster
Администратор
Сообщения
2,902
Лучшие ответы
77
Реакции
327
Сообщения
1,983
Лучшие ответы
18
Реакции
91
Да, хук и правда не обязателен, забыл совсем про getIcon.
 
Сообщения
4,758
Лучшие ответы
45
Реакции
637
Пусть он намокает только там где игрок(определенный радиус бери), пример со снегом.
Прочитав тему решил сделать так: В определенном радиусе от игрока будет менятся блокстейт. Если блок в него не попадает - он как был дефолтным так и остался. Вполне удобно и не грузит мир, я думаю.
Теперь другой вопрос: как мне связать игрока и блоки? Это ведь не та фигня с рендером, что я на клиенте воротил. Тут серьезнее...
 

Ivasik

Porting GrandBombaster
Администратор
Сообщения
2,902
Лучшие ответы
77
Реакции
327
Конь уже сказал, как лучше будет.
 
Сообщения
4,758
Лучшие ответы
45
Реакции
637
Не нужно там состояние блока менять. Надо подменять иконку блока во время сборки чанка в дисплейлист (или что там используется на новых версиях) в зависимости от того, идет ли дождь в мире, есть ли в текущем чанке дождь и находится ли блок под небом. Ничего из этого не требует модификации или чтения блокстейта. Если хочется заменять не только блок прямо под небом - можно использовать в проверке скайлайт, например, чтобы все блоки со светом от неба >= 12 уровня намокали.

Единственное, когда дождь начинается или заканчивается, надо форсить пересборку всех загруженных на клиенте чанков, что немного не круто, если нельзя сделать это по-тихому.
Можно поподробнее пожалуйста? Где, какой класс, какой метод?
Каким образом мне эту иконку подгружать? Где она должна находится для этого?
 
Сообщения
4,758
Лучшие ответы
45
Реакции
637
Java:
@SideOnly(Side.CLIENT)
public class RenderList extends ChunkRenderContainer
{
    public void renderChunkLayer(BlockRenderLayer layer)
    {
        if (this.initialized)
        {
            for (RenderChunk renderchunk : this.renderChunks)
            {
                ListedRenderChunk listedrenderchunk = (ListedRenderChunk)renderchunk;
                GlStateManager.pushMatrix();
                this.preRenderChunk(renderchunk);
                GlStateManager.callList(listedrenderchunk.getDisplayList(layer, listedrenderchunk.getCompiledChunk()));
                GlStateManager.popMatrix();
            }

            GlStateManager.resetColor();
            this.renderChunks.clear();
        }
    }
}
Это то что мне надо? И что тут подменять?
 
Сообщения
1,031
Лучшие ответы
19
Реакции
81
По моему опыту я бы сказал что смена блока берёт немного больше ресурсов чем смена состояния блока. Ведь при замене блока заново подгружаются и его состояния, а так не нужно их опять грузить. Подобный опыт я получил при игре с IC2, и там я как ставил блоки лагало больше чем например кликнуть краником по каучуковому дереву.
 
Сверху