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

Версия Minecraft
1.12.2

Maxik

Золотой Петушок
4,942
46
711
В общем, я не нашел эффективного способо окрашивать блоки при намокании... решил просто заменять простецкие блокстейты. Но возник вопрос - мир большой, песка много. Во время дождя он будет весь намокать. Смена блокстейта - она равна по ресурсоемкости смене блока? (Грубо говоря лагать будет больше или также, или меньше?)
 

Icosider

iMixin
Администратор
3,277
85
476
Пусть он намокает только там где игрок(определенный радиус бери), пример со снегом.
 
608
5
15
Нормальные люди бы подменили текстурку во время дождя и профит.
Или чё серьёзней надо?
 

Icosider

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

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

tox1cozZ

aka Agravaine
Модератор
7,123
455
2,146
Дождь и снег же распространяются на ту область где находится игрок
Если дождь идет, то он идет во всем мире. Это визуально он рисуется только в небольшом радиусе от игрока.
 

Icosider

iMixin
Администратор
3,277
85
476
@Agravaine, я же писал, что не уверен.
@Oldestkon, да там дисплейлисты. И под состояниями блоков я имел ввиду blockstates, только с помощью них(и iBakedModel) можно установить текстуру блоку(возможно есть и другие варианты, о которых я не знаю:unsure:)
 
1,990
18
104
Не знаю как на новых версиях, но на старых достаточно было сделать хук в WorldRenderer в момент, когда он собирает дисплейлист чанка из блоков и подменить там иконку для конкретного блока (там итерируются все блоки в чанке по одному).
Думаю, на новых это мало чем отличается, кроме названий классов и используемого API (если дисплейлисты уже наконец заменили на вбошки).
 

Maxik

Золотой Петушок
4,942
46
711
Пусть он намокает только там где игрок(определенный радиус бери), пример со снегом.
Прочитав тему решил сделать так: В определенном радиусе от игрока будет менятся блокстейт. Если блок в него не попадает - он как был дефолтным так и остался. Вполне удобно и не грузит мир, я думаю.
Теперь другой вопрос: как мне связать игрока и блоки? Это ведь не та фигня с рендером, что я на клиенте воротил. Тут серьезнее...
 

Maxik

Золотой Петушок
4,942
46
711
Не нужно там состояние блока менять. Надо подменять иконку блока во время сборки чанка в дисплейлист (или что там используется на новых версиях) в зависимости от того, идет ли дождь в мире, есть ли в текущем чанке дождь и находится ли блок под небом. Ничего из этого не требует модификации или чтения блокстейта. Если хочется заменять не только блок прямо под небом - можно использовать в проверке скайлайт, например, чтобы все блоки со светом от неба >= 12 уровня намокали.

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

Maxik

Золотой Петушок
4,942
46
711
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
84
По моему опыту я бы сказал что смена блока берёт немного больше ресурсов чем смена состояния блока. Ведь при замене блока заново подгружаются и его состояния, а так не нужно их опять грузить. Подобный опыт я получил при игре с IC2, и там я как ставил блоки лагало больше чем например кликнуть краником по каучуковому дереву.
 
Сверху