Странность

Версия Minecraft
1.12.2
476
9
39
Настроил я visual vm и решил глянуть чего как.
И увидел странную вещь: BlockPos сжирал от 500мб до 850 и даже иногда выше.
Возможно забить на этот BlockPos и делать всё по привычке через x,y,z?
p.s сам vvm при повторном запуске очень странно работает такое ощущение будто 5-7 тиков тупо пропускает игра из-за него

Ну и сразу ещё один вопрос, ради которого всё и затевалось:
Что может на спавне при возрождении просаживать сильно фпс? В частности мне интересны причины такого поведении, а точнее примерно где копать.
Тестить все варианты возникновения бага пока больше не могу, кажется я приплыл =_=
 
Последнее редактирование:
Решение
Попробуй написать код который извлечет 10 квадратных корней из чего-нибудь НЕ В ЦИКЛЕ, а потом добавит что-нибудь в мапу. Выруби только JIT. Попробуй провести сэмплирующий профайлинг и увидишь что он скажет, что самый медленный метод это добавление в мапу. Если ты сделаешь инструментирующий профайлинг, то все таки самым медленным будет вычисление корней.
Прикол в том что Visual VM снимает стэк трейс только в сейф поинтах. Сейфпоинты находятся в циклах и в ретурнах.

Вообщем попробуй провести профайлинг тем профайлером который я предложил и почувствуй разницу))
476
9
39
Забить на BlockPos в 1.12.2?
не юзать везде где только можно, я по привычке апгрейд воспринял как невероятно важную и нужную фичу и стал юзать абсолютно везде где можно в коде рендера, в коде расчётов и так далее. Грубо говоря вместо пары new BlockPos, я теперь вижу что он создаёт их тысячи особенно при рендере кастомной модельки. Ладно одну проблему решили.
Теперь я думаю может ли первая проблема создать вторую? Перебирать гиг инфы думаю довольно затратно, хотя до смерти проблем вообще не возникает или если после смерти отойти от спавна :\
 
476
9
39
а чем он лучше обычного?
 
1,111
47
420
Ну и сразу ещё один вопрос, ради которого всё и затевалось:
Что может на спавне при возрождении просаживать сильно фпс? В частности мне интересны причины такого поведении, а точнее примерно где копать.
Тестить все варианты возникновения бага пока больше не могу, кажется я приплыл =_=
Ты можешь использовать сэмплировские профайлеры, но так как большинство общедоступных профайлеров(в том числе и VisualVM) собирают стэктрэйсы только в сейфпоинтах, ждать от них что то полезное не стоит. Именно по этому я всем советую использовать профайлер от работника однокласников в качестве альтернативы есть еще "честный профайлер". В кавычка из-за того что он порой стопает процессы в момент когда фрейм сформирован не окончательно. Скорее всего в майне ты этого не почувствуешь, но все же))
 
1,111
47
420
Я как то сэмплил майн. Вот такая картина вышла:
Код:
 7281000000 (28.64%)    7281  org.lwjgl.opengl.GL11.nglCallLists
  5254000000 (20.67%)    5254  org.lwjgl.opengl.GL11.nglCallList
  2720000000 (10.70%)    2720  org.lwjgl.opengl.GL11.nglFlush
  1461000000 ( 5.75%)    1461  net.minecraft.client.renderer.RenderGlobal.renderSortedRenderers
   840000000 ( 3.30%)     840  org.lwjgl.opengl.GL11.nglDrawArrays
   741000000 ( 2.91%)     741  org.lwjgl.opengl.MacOSXContextImplementation.nSwapBuffers
   722000000 ( 2.84%)     722  org.lwjgl.opengl.MacOSXContextImplementation.nUpdate
   623000000 ( 2.45%)     623  net.minecraft.client.renderer.EntityRenderer.renderWorld
   581000000 ( 2.29%)     581  java.lang.Thread.yield
   535000000 ( 2.10%)     535  org.lwjgl.opengl.GLContext.getThreadLocalCapabilities
   391000000 ( 1.54%)     391  java.lang.Thread.sleep
   367000000 ( 1.44%)     367  net.minecraft.client.renderer.Tessellator.addVertex
   333000000 ( 1.31%)     333  org.lwjgl.opengl.GL11.nglBegin
   305000000 ( 1.20%)     305  java.lang.ThreadLocal.get
   283000000 ( 1.11%)     283  java.lang.Thread.interrupt0
   166000000 ( 0.65%)     166  org.lwjgl.opengl.GL11.nglVertex3f
   129000000 ( 0.51%)     129  net.minecraft.client.renderer.culling.ClippingHelper.isBoxInFrustum
   120000000 ( 0.47%)     120  org.lwjgl.opengl.GL11.nglEnd
    93000000 ( 0.37%)      93  org.lwjgl.opengl.GL11.nglEnableClientState
    80000000 ( 0.31%)      80  net.minecraft.client.renderer.RenderGlobal.renderCloudsFancy
    70000000 ( 0.28%)      70  java.lang.String.indexOf
    65000000 ( 0.26%)      65  java.lang.ThreadLocal$ThreadLocalMap.getEntry
    64000000 ( 0.25%)      64  org.lwjgl.opengl.GL11.nglBindTexture
    53000000 ( 0.21%)      53  org.lwjgl.opengl.GL11.nglDisableClientState
    52000000 ( 0.20%)      52  net.minecraft.client.renderer.Tessellator.addVertexWithUV
    47000000 ( 0.18%)      47  org.lwjgl.opengl.GLContext.getCapabilitiesImpl
    43000000 ( 0.17%)      43  org.lwjgl.opengl.GL11.nglTexCoord2f
    42000000 ( 0.17%)      42  org.lwjgl.opengl.GL11.nglEnable
    42000000 ( 0.17%)      42  net.minecraft.util.LongHashMap.getValueByKey
    41000000 ( 0.16%)      41  net.minecraft.client.renderer.Tessellator.setColorRGBA
    38000000 ( 0.15%)      38  java.util.HashMap.getNode
    35000000 ( 0.14%)      35  net.minecraft.client.renderer.culling.Frustrum.isBoxInFrustum
    32000000 ( 0.13%)      32  org.lwjgl.opengl.GL11.nglTexCoordPointer
    30000000 ( 0.12%)      30  org.lwjgl.opengl.GL11.nglTranslatef
    29000000 ( 0.11%)      29  net.minecraft.client.renderer.WorldRenderer.getGLCallListForPass
    29000000 ( 0.11%)      29  org.lwjgl.opengl.GL11.nglVertexPointer
    29000000 ( 0.11%)      29  jlong_disjoint_arraycopy
    28000000 ( 0.11%)      28  org.lwjgl.opengl.GL11.nglDisable
    25000000 ( 0.10%)      25  org.lwjgl.opengl.GL11.nglRotatef
    25000000 ( 0.10%)      25  net.minecraft.client.renderer.OpenGlHelper.setActiveTexture
    21000000 ( 0.08%)      21  org.lwjgl.opengl.GL11.nglColorPointer
    19000000 ( 0.07%)      19  org.lwjgl.opengl.GL11.nglClear
    19000000 ( 0.07%)      19  java.lang.Object.wait
    18000000 ( 0.07%)      18  net.minecraft.entity.Entity.isInRangeToRenderDist
    16000000 ( 0.06%)      16  org.lwjgl.opengl.GL11.glBindTexture
    15000000 ( 0.06%)      15  org.lwjgl.opengl.GL11.nglNormalPointer
    15000000 ( 0.06%)      15  net.minecraft.client.renderer.Tessellator.setColorRGBA_F
    14000000 ( 0.06%)      14  net.minecraft.client.renderer.Tessellator.setTextureUV
    14000000 ( 0.06%)      14  java.util.ArrayList.ensureExplicitCapacity
    14000000 ( 0.06%)      14  org.lwjgl.opengl.GL11.nglPopMatrix
    13000000 ( 0.05%)      13  org.lwjgl.opengl.GLContext.getCapabilities
    13000000 ( 0.05%)      13  org.lwjgl.opengl.GL11.nglLightfv
    13000000 ( 0.05%)      13  org.lwjgl.opengl.GL11.nglTexParameteri
    12000000 ( 0.05%)      12  java.util.concurrent.locks.AbstractQueuedSynchronizer.compareAndSetState
    12000000 ( 0.05%)      12  org.lwjgl.BufferChecks.checkFunctionAddress
    12000000 ( 0.05%)      12  org.lwjgl.MemoryUtil.getAddress
    11000000 ( 0.04%)      11  net.minecraft.client.renderer.RenderList.rendersChunk
    11000000 ( 0.04%)      11  org.lwjgl.opengl.GL11.nglColorMaterial
    11000000 ( 0.04%)      11  net.minecraft.world.chunk.NibbleArray.get
    11000000 ( 0.04%)      11  java.lang.ThreadLocal$ThreadLocalMap.access$000
    10000000 ( 0.04%)      10  net.minecraft.client.renderer.Tessellator.setNormal
    10000000 ( 0.04%)      10  org.lwjgl.opengl.GL11.nglPushMatrix
    10000000 ( 0.04%)      10  net.minecraft.client.renderer.Tessellator.startDrawing
    10000000 ( 0.04%)      10  org.lwjgl.opengl.GL13.nglActiveTexture
    10000000 ( 0.04%)      10  net.minecraft.client.renderer.RenderGlobal.clipRenderersByFrustum
     9000000 ( 0.04%)       9  net.minecraft.client.renderer.Tessellator.draw
     9000000 ( 0.04%)       9  net.minecraft.util.ResourceLocation.hashCode
     9000000 ( 0.04%)       9  net.minecraft.entity.DataWatcher.getWatchedObject
     9000000 ( 0.04%)       9  org.lwjgl.opengl.GL11.glVertex3f
     8000000 ( 0.03%)       8  net.minecraft.world.chunk.storage.ExtendedBlockStorage.getBlockByExtId
     8000000 ( 0.03%)       8  org.lwjgl.opengl.GL14.nglBlendFuncSeparate
     8000000 ( 0.03%)       8  net.minecraft.util.MathHelper.floor_double
     8000000 ( 0.03%)       8  org.lwjgl.opengl.GL11.glTexCoordPointer
     8000000 ( 0.03%)       8  org.lwjgl.opengl.GL11.glTexCoord2f
     8000000 ( 0.03%)       8  java.util.HashMap.hash
     7000000 ( 0.03%)       7  org.lwjgl.opengl.GL11.nglColor4f
     7000000 ( 0.03%)       7  net.minecraft.world.chunk.Chunk.getBlock
     7000000 ( 0.03%)       7  java.nio.ByteOrder.nativeOrder
     7000000 ( 0.03%)       7  net.minecraft.client.renderer.texture.TextureManager.bindTexture
     7000000 ( 0.03%)       7  cpw.mods.fml.common.eventhandler.EventBus.post
     7000000 ( 0.03%)       7  org.lwjgl.opengl.GL11.nglShadeModel
     7000000 ( 0.03%)       7  java.lang.Integer.valueOf
     7000000 ( 0.03%)       7  java.util.ArrayList.add
     6000000 ( 0.02%)       6  net.minecraft.client.gui.Gui.drawTexturedModalRect
     6000000 ( 0.02%)       6  org.lwjgl.opengl.GL11.nglLoadIdentity
     6000000 ( 0.02%)       6  net.minecraft.client.renderer.texture.AbstractTexture.getGlTextureId
     6000000 ( 0.02%)       6  org.lwjgl.opengl.MacOSXDisplay.nIsFocused
     6000000 ( 0.02%)       6  java.util.concurrent.ConcurrentHashMap.get
     6000000 ( 0.02%)       6  org.lwjgl.opengl.GL11.nglBlendFunc
     6000000 ( 0.02%)       6  org.lwjgl.opengl.GL11.glColor4f
     5000000 ( 0.02%)       5  net.minecraft.client.model.ModelRenderer.render
     5000000 ( 0.02%)       5  org.lwjgl.opengl.GL11.nglFogfv
     5000000 ( 0.02%)       5  net.minecraft.client.renderer.entity.RendererLivingEntity.doRender
     5000000 ( 0.02%)       5  org.lwjgl.opengl.GL11.nglLightModelfv
     5000000 ( 0.02%)       5  net.minecraft.client.renderer.Tessellator.reset
     5000000 ( 0.02%)       5  net.minecraft.client.util.RenderDistanceSorter.compare
     5000000 ( 0.02%)       5  org.lwjgl.opengl.GL11.nglMatrixMode
     5000000 ( 0.02%)       5  java.lang.Integer.hashCode
     5000000 ( 0.02%)       5  net.minecraft.client.gui.FontRenderer.renderCharAtPos
     5000000 ( 0.02%)       5  net.minecraft.client.multiplayer.ChunkProviderClient.provideChunk
     4000000 ( 0.02%)       4  net.minecraft.world.WorldProvider.calculateCelestialAngle
     4000000 ( 0.02%)       4  org.lwjgl.opengl.StateTracker.getReferences
     4000000 ( 0.02%)       4  java.util.regex.Matcher.search
     4000000 ( 0.02%)       4  java.nio.DirectIntBufferU.put
     4000000 ( 0.02%)       4  org.lwjgl.opengl.GL11.glEnableClientState
     4000000 ( 0.02%)       4  java.lang.String.hashCode
     4000000 ( 0.02%)       4  org.lwjgl.opengl.GL11.nglScalef
     4000000 ( 0.02%)       4  net.minecraft.util.MathHelper.sin
     4000000 ( 0.02%)       4  net.minecraft.world.World.getChunkFromChunkCoords
     4000000 ( 0.02%)       4  net.minecraft.world.World.getBlockLightValue_do
     4000000 ( 0.02%)       4  net.minecraft.client.gui.Gui.drawGradientRect
     4000000 ( 0.02%)       4  java.lang.Throwable.fillInStackTrace
     4000000 ( 0.02%)       4  net.minecraft.client.model.ModelQuadruped.setRotationAngles
     4000000 ( 0.02%)       4  net.minecraft.entity.EntityList.getEntityString
     4000000 ( 0.02%)       4  org.lwjgl.opengl.GL11.nglGetIntegerv
     4000000 ( 0.02%)       4  java.util.HashMap.containsKey
     4000000 ( 0.02%)       4  net.minecraft.client.gui.GuiIngame.renderInventorySlot
     4000000 ( 0.02%)       4  paulscode.sound.CommandThread.run
     3000000 ( 0.01%)       3  java.nio.Buffer.nextPutIndex
     3000000 ( 0.01%)       3  itable stub
     3000000 ( 0.01%)       3  net.minecraft.client.Minecraft.isGuiEnabled
     3000000 ( 0.01%)       3  net.minecraft.util.MathHelper.cos
     3000000 ( 0.01%)       3  org.lwjgl.opengl.GL11.glScalef
     3000000 ( 0.01%)       3  net.minecraft.world.chunk.Chunk.getBlockLightValue
     3000000 ( 0.01%)       3  sun.nio.ch.KQueueArrayWrapper.kevent0
     3000000 ( 0.01%)       3  org.lwjgl.opengl.GL11.glBegin
     3000000 ( 0.01%)       3  java.util.ArrayList.elementData
     3000000 ( 0.01%)       3  net.minecraft.profiler.Profiler.endSection
     3000000 ( 0.01%)       3  net.minecraft.client.renderer.Tessellator.startDrawingQuads
     3000000 ( 0.01%)       3  java.util.ArrayList.rangeCheck
     3000000 ( 0.01%)       3  org.lwjgl.opengl.GL11.glEnd
     3000000 ( 0.01%)       3  net.minecraft.client.gui.FontRenderer.renderStringAtPos
     3000000 ( 0.01%)       3  net.minecraft.entity.DataWatcher.getWatchableObjectByte
     3000000 ( 0.01%)       3  unsafe_arraycopy
     3000000 ( 0.01%)       3  cpw.mods.fml.common.eventhandler.ListenerList.getListeners
     3000000 ( 0.01%)       3  net.minecraftforge.client.GuiIngameForge.renderHealth
     3000000 ( 0.01%)       3  org.lwjgl.opengl.GL11.nglGetFloatv
     3000000 ( 0.01%)       3  org.lwjgl.opengl.GL30.nglBindFramebuffer
     3000000 ( 0.01%)       3  net.minecraft.client.renderer.culling.Frustrum.<init>
     2000000 ( 0.01%)       2  net.minecraft.client.gui.FontRenderer.renderDefaultChar
     2000000 ( 0.01%)       2  net.minecraft.client.renderer.entity.RendererLivingEntity.passSpecialRender
     2000000 ( 0.01%)       2  net.minecraft.util.StringTranslate.tryTranslateKey
     2000000 ( 0.01%)       2  java.lang.Object.<init>
     2000000 ( 0.01%)       2  org.lwjgl.opengl.GL11.nglAlphaFunc
     2000000 ( 0.01%)       2  sun.util.locale.provider.JRELocaleProviderAdapter.getLocaleResources
     2000000 ( 0.01%)       2  net.minecraft.world.World.blockExists
     2000000 ( 0.01%)       2  net.minecraft.profiler.Profiler.startSection
     2000000 ( 0.01%)       2  paulscode.sound.SimpleThread.snooze
     2000000 ( 0.01%)       2  org.lwjgl.opengl.GL11.glColorPointer
     2000000 ( 0.01%)       2  cpw.mods.fml.common.eventhandler.ListenerList$ListenerListInst.shouldRebuild
     2000000 ( 0.01%)       2  org.lwjgl.opengl.GL11.nglViewport
     2000000 ( 0.01%)       2  net.minecraft.item.ItemStack.getItem
     2000000 ( 0.01%)       2  java.nio.DirectIntBufferU.ix
     2000000 ( 0.01%)       2  net.minecraftforge.client.event.EntityViewRenderEvent.setup
     2000000 ( 0.01%)       2  net.minecraft.world.WorldProvider.getSkyColor
     2000000 ( 0.01%)       2  net.minecraft.world.World.func_147447_a
     2000000 ( 0.01%)       2  net.minecraft.client.renderer.ItemRenderer.renderItemIn2D
     2000000 ( 0.01%)       2  java.util.Random.setSeed
     2000000 ( 0.01%)       2  org.lwjgl.opengl.GL11.nglTranslated
     2000000 ( 0.01%)       2  net.minecraft.client.gui.GuiButtonLanguage.drawButton
     2000000 ( 0.01%)       2  net.minecraft.client.gui.FontRenderer.getCharWidth
     2000000 ( 0.01%)       2  java.util.regex.Pattern$BmpCharProperty.match
     2000000 ( 0.01%)       2  net.minecraft.entity.Entity.isInsideOfMaterial
     2000000 ( 0.01%)       2  org.lwjgl.MemoryUtilSun$AccessorUnsafe.getAddress
     2000000 ( 0.01%)       2  java.util.concurrent.locks.AbstractQueuedSynchronizer.getState
     2000000 ( 0.01%)       2  net.minecraft.world.ChunkCoordIntPair.chunkXZ2Int
     2000000 ( 0.01%)       2  net.minecraftforge.client.event.RenderLivingEvent.<init>
     2000000 ( 0.01%)       2  org.lwjgl.openal.AL10.nalListenerfv
     2000000 ( 0.01%)       2  org.lwjgl.opengl.GL11.glPushMatrix
     2000000 ( 0.01%)       2  java.util.concurrent.ConcurrentHashMap.spread
     2000000 ( 0.01%)       2  cpw.mods.fml.common.eventhandler.Event.setPhase
     2000000 ( 0.01%)       2  java.util.ArrayList.ensureCapacityInternal
     2000000 ( 0.01%)       2  java.nio.Bits.byteOrder
     2000000 ( 0.01%)       2  arrayof_jint_fill
     2000000 ( 0.01%)       2  org.lwjgl.opengl.ReferencesStack.getReferences
     2000000 ( 0.01%)       2  org.lwjgl.opengl.GL11.glAlphaFunc
     2000000 ( 0.01%)       2  java.net.Inet6AddressImpl.lookupAllHostAddr
     2000000 ( 0.01%)       2  org.lwjgl.opengl.GL11.nglDepthMask
     2000000 ( 0.01%)       2  net.minecraftforge.client.GuiIngameForge.renderPlayerList
     2000000 ( 0.01%)       2  net.minecraft.block.Block.getBlockById
     2000000 ( 0.01%)       2  net.minecraft.world.gen.ChunkProviderServer.provideChunk
     2000000 ( 0.01%)       2  net.minecraft.entity.DataWatcher.getWatchableObjectInt
     2000000 ( 0.01%)       2  org.lwjgl.opengl.GL13.nglMultiTexCoord2f
     2000000 ( 0.01%)       2  net.minecraft.client.model.ModelSpider.setRotationAngles
     1000000 ( 0.00%)       1  org.lwjgl.openal.AL10.nalGetError
     1000000 ( 0.00%)       1  java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock
     1000000 ( 0.00%)       1  net.minecraft.client.gui.GuiNewChat.func_146246_g
     1000000 ( 0.00%)       1  java.nio.Buffer.limit
     1000000 ( 0.00%)       1  net.minecraft.client.renderer.texture.TextureManager.getResourceLocation
     1000000 ( 0.00%)       1  java.lang.String.charAt
     1000000 ( 0.00%)       1  java.nio.DirectFloatBufferU.get
     1000000 ( 0.00%)       1  net.minecraft.client.gui.FontRenderer.drawStringWithShadow
     1000000 ( 0.00%)       1  net.minecraft.util.LongHashMap.getEntry
     1000000 ( 0.00%)       1  org.lwjgl.opengl.GL11.glBlendFunc
     1000000 ( 0.00%)       1  java.lang.Thread.run
     1000000 ( 0.00%)       1  net.minecraftforge.client.ForgeHooksClient.dispatchRenderLast
     1000000 ( 0.00%)       1  net.minecraftforge.client.event.RenderLivingEvent$Specials$Pre.getListenerList
     1000000 ( 0.00%)       1  java.lang.Runtime.maxMemory
     1000000 ( 0.00%)       1  net.minecraftforge.client.GuiIngameForge.renderFood
     1000000 ( 0.00%)       1  net.minecraft.client.renderer.entity.RenderLiving.doRender
Ну как бы тут очевидно что тормозит
 
476
9
39
А под окна есть?
Уж сильно хочу всё поковырять и раскопать все тайны оптимизации и провисаний, глядением в код много картины не построишь.
Ибо я например не знал что BlockPos РЕАЛЬНО столько жрёт, хотя предполагал.
 
1,111
47
420
Извени но под окна нет. Дело в том что в пингвине общение между процессами возможно через сигналы, а вот окна в такое не могут. Там приходится подсаживать свой процесс, что как то не в кайф. "честный профайлер" написан на Java. Почему бы тебе не использовать его? Там только приходится подсаживать его как Java Agent, но в принципе норм))
 
1,990
18
105
но так как большинство общедоступных профайлеров(в том числе и VisualVM) собирают стэктрэйсы только в сейфпоинтах, ждать от них что то полезное не стоит
Есть какие-нибудь жизненные примеры, где это действительно важно? По собственному опыту, сколько не ковырялся с вижуал-вм или jmc, они меня отлично выручали в вопросах работы с памятью или повышением производительности, да и к тому же в первый раз о таком слышу вообще.
 
1,111
47
420
Попробуй написать код который извлечет 10 квадратных корней из чего-нибудь НЕ В ЦИКЛЕ, а потом добавит что-нибудь в мапу. Выруби только JIT. Попробуй провести сэмплирующий профайлинг и увидишь что он скажет, что самый медленный метод это добавление в мапу. Если ты сделаешь инструментирующий профайлинг, то все таки самым медленным будет вычисление корней.
Прикол в том что Visual VM снимает стэк трейс только в сейф поинтах. Сейфпоинты находятся в циклах и в ретурнах.

Вообщем попробуй провести профайлинг тем профайлером который я предложил и почувствуй разницу))
 
5,018
47
783
Код:
BlockPos pos = ... ;
***
new BlockPos(pos.getX(), pos.getY(), pos.getZ());
Вот так можно или

Код:
BlockPos pos = ... ;
int x = pos.getX();
int y = pos.getY();
int z = pos.getZ();

***
new BlockPos(x,y,z);
Ну и дальше уже по старинке через коры. Правда, новый BlockPos скорее всего все равно создавать придется. Как вариант, глянуть как он берет координаты, и делать также, тогда новые создавать не придется.
 
476
9
39
В общем вот:
Java:
    public IBlockState getBlockState(World world, int x, int y, int z)
    {
        if (this.isOutsideBuildHeight(y))
        {
            return Blocks.AIR.getDefaultState();
        }
        else
        {
            Chunk chunk = this.getChunkFromBlockCoords(world, x, z);
            return chunk.getBlockState(x, y, z);
        }
    }
  
    public Block getBlock(World world, int x, int y, int z)
    {
        if (this.isOutsideBuildHeight(y))
        {
            return Blocks.AIR.getDefaultState().getBlock();
        }
        else
        {
            Chunk chunk = this.getChunkFromBlockCoords(world, x, z);
            return chunk.getBlockState(x, y, z).getBlock();
        }
    }
  
    public boolean isOutsideBuildHeight(int y)
    {
        return y < 0 || y >= 256;
    }
  
    public Chunk getChunkFromChunkCoords(World world, int chunkX, int chunkZ)
    {
        return world.getChunkProvider().provideChunk(chunkX, chunkZ);
    }
  
    public Chunk getChunkFromBlockCoords(World world, int x, int z)
    {
        return this.getChunkFromChunkCoords(world, x >> 4, z >> 4);
    }
Намутил(изменил пару переменных, оказывается всё легко).
Те кому не нужен BlockPos можете юзать это и всё в целом работает так же, только память не захламляет кучей объектов особенно полезно для рендера. Ну и плюс x,y,z в сумме займут гораздо меньше чем тот же BlockPos.

Методы можно сделать static ничего не поменяется мы же теперь вместо World.getBlockState(...) вызываем getBlockState(world, ...)
 
Последнее редактирование:
476
9
39
Если IBlockAccess instanceof ChunkCache
То код другой уже:
Java:
    public static IBlockState getBlockState(ChunkCache chunkCache, int x, int y, int z)
    {
    
        if (y >= 0 && y < 256)
        {
            int i = (x >> 4) - chunkCache.chunkX;
            int j = (z >> 4) - chunkCache.chunkZ;
        
            if (i >= 0 && i < chunkCache.chunkArray.length && j >= 0 && j < chunkCache.chunkArray[i].length)
            {
                Chunk chunk = chunkCache.chunkArray[i][j];
            
                if (chunk != null)
                {
                    return chunk.getBlockState(x, y, z);
                }
            }
        }
    
        return Blocks.AIR.getDefaultState();
    }
В Access Transformers(для 1.12.2 snapshot_20171003 это три переменных:
Код:
public net.minecraft.world.ChunkCache field_72817_c #chunkArray[][]
public net.minecraft.world.ChunkCache field_72818_a #chunkX
public net.minecraft.world.ChunkCache field_72816_b #chunkZ
 
Последнее редактирование:
Сверху