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

Версия Minecraft
1.12.2
5,018
47
783
В общем, я не нашел эффективного способо окрашивать блоки при намокании... решил просто заменять простецкие блокстейты. Но возник вопрос - мир большой, песка много. Во время дождя он будет весь намокать. Смена блокстейта - она равна по ресурсоемкости смене блока? (Грубо говоря лагать будет больше или также, или меньше?)
 

Icosider

Kotliner
Администратор
3,600
99
663
@svk2140, да, но не делать же это во всём мире? Дождь и снег же распространяются на ту область где находится игрок, не дальше(хотя на счёт дождя точно сказать не могу) и ещё одно НО, на новых версия так просто текстуру не заменить) Там нужно менять состояние блока.
 
1,990
18
105
Не нужно там состояние блока менять. Надо подменять иконку блока во время сборки чанка в дисплейлист (или что там используется на новых версиях) в зависимости от того, идет ли дождь в мире, есть ли в текущем чанке дождь и находится ли блок под небом. Ничего из этого не требует модификации или чтения блокстейта. Если хочется заменять не только блок прямо под небом - можно использовать в проверке скайлайт, например, чтобы все блоки со светом от неба >= 12 уровня намокали.

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

tox1cozZ

aka Agravaine
8,454
598
2,890
Дождь и снег же распространяются на ту область где находится игрок
Если дождь идет, то он идет во всем мире. Это визуально он рисуется только в небольшом радиусе от игрока.
 

Icosider

Kotliner
Администратор
3,600
99
663
@Agravaine, я же писал, что не уверен.
@Oldestkon, да там дисплейлисты. И под состояниями блоков я имел ввиду blockstates, только с помощью них(и iBakedModel) можно установить текстуру блоку(возможно есть и другие варианты, о которых я не знаю:unsure:)
 
1,990
18
105
Не знаю как на новых версиях, но на старых достаточно было сделать хук в WorldRenderer в момент, когда он собирает дисплейлист чанка из блоков и подменить там иконку для конкретного блока (там итерируются все блоки в чанке по одному).
Думаю, на новых это мало чем отличается, кроме названий классов и используемого API (если дисплейлисты уже наконец заменили на вбошки).
 
5,018
47
783
Пусть он намокает только там где игрок(определенный радиус бери), пример со снегом.
Прочитав тему решил сделать так: В определенном радиусе от игрока будет менятся блокстейт. Если блок в него не попадает - он как был дефолтным так и остался. Вполне удобно и не грузит мир, я думаю.
Теперь другой вопрос: как мне связать игрока и блоки? Это ведь не та фигня с рендером, что я на клиенте воротил. Тут серьезнее...
 
5,018
47
783
Не нужно там состояние блока менять. Надо подменять иконку блока во время сборки чанка в дисплейлист (или что там используется на новых версиях) в зависимости от того, идет ли дождь в мире, есть ли в текущем чанке дождь и находится ли блок под небом. Ничего из этого не требует модификации или чтения блокстейта. Если хочется заменять не только блок прямо под небом - можно использовать в проверке скайлайт, например, чтобы все блоки со светом от неба >= 12 уровня намокали.

Единственное, когда дождь начинается или заканчивается, надо форсить пересборку всех загруженных на клиенте чанков, что немного не круто, если нельзя сделать это по-тихому.
Можно поподробнее пожалуйста? Где, какой класс, какой метод?
Каким образом мне эту иконку подгружать? Где она должна находится для этого?
 
5,018
47
783
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
87
По моему опыту я бы сказал что смена блока берёт немного больше ресурсов чем смена состояния блока. Ведь при замене блока заново подгружаются и его состояния, а так не нужно их опять грузить. Подобный опыт я получил при игре с IC2, и там я как ставил блоки лагало больше чем например кликнуть краником по каучуковому дереву.
 
Сверху