Minecraft Fabric模组开发:如何仅为单个类提高Tick速率?
我刚接触Minecraft模组开发,正在使用Fabric API编写客户端模组。已经实现了手持物品的移动与旋转逻辑,但即使使用de Casteljau算法计算位置,动画仍显得卡顿。想请教是否能让处理该动画的代码执行速率高于每秒20次(1tick/次),比如每秒40次(半tick/次)或更高?
当前动画效果:
(若图片无法加载,可查看备用动画演示)
解决方法:绑定渲染帧更新,同步客户端帧率
Minecraft客户端的Tick固定为每秒20次,但渲染线程的帧率通常远高于20FPS,把动画逻辑绑定到渲染帧的更新回调上,就能让动画更新频率和客户端帧率同步,从根源解决卡顿问题。
具体实现步骤
注册渲染帧回调
使用Fabric提供的RenderTickCallback.EVENT,这个回调会在每帧渲染前触发,频率等于客户端当前的帧率。示例代码:import net.fabricmc.fabric.api.client.rendering.v1.RenderTickCallback; import net.minecraft.client.MinecraftClient; public class YourModClient implements ClientModInitializer { @Override public void onInitializeClient() { RenderTickCallback.EVENT.register(tickDelta -> { // 传入tickDelta做平滑插值计算 updateHeldItemAnimation(tickDelta); }); } private void updateHeldItemAnimation(float tickDelta) { // 获取当前手持物品 MinecraftClient client = MinecraftClient.getInstance(); if (client.player != null && !client.player.getMainHandStack().isEmpty()) { // 结合tickDelta执行你的移动、旋转逻辑 // 比如用de Casteljau算法计算位置时,加入tickDelta做帧间插值 } } }利用tickDelta实现平滑过渡
回调中的tickDelta是当前帧与上一Tick的时间插值(范围0.0~1.0),比如客户端60FPS时,每帧的tickDelta会逐步从0.0递增到1.0,每20次帧更新对应一个完整Tick。用这个值计算物品的中间状态,能让动画在Tick之间也有连续的过渡,彻底消除卡顿感。优化计算性能
渲染线程对延迟敏感,复杂计算(比如de Casteljau算法的预计算)可以放在Client Tick事件中完成,渲染回调里只做最终的插值和变换应用,避免拖慢帧率。
备选方案:手动拆分Tick逻辑(不推荐)
如果不想绑定渲染帧,也可以在Client Tick事件中每次执行多次动画更新,模拟更高的频率,但这种方式无法适配客户端帧率变化,平滑度不如渲染帧回调:
// 注册Client Tick结束事件 @SubscribeEvent public void onClientTickEnd(ClientTickEvent.End event) { // 每次Tick执行两次更新,模拟40次/秒 updateHeldItemAnimation(0.5f); updateHeldItemAnimation(1.0f); }
内容的提问来源于stack exchange,提问作者DerDane


