开发2D版Minecraft时Thread调用start后未执行run方法问题排查
核心问题
你创建Thread对象时没有传入实现了Runnable接口的当前Minecraft实例,导致线程启动后执行的是Thread类自带的空run()方法,不会触发你编写的游戏循环逻辑。
修复步骤
- 修改
init()方法中的线程初始化代码,将当前类实例作为参数传入Thread构造方法:
private void init(){ window = new Window("Minecraft 1.17.1", 800, 600); // 传入this(即当前Minecraft实例,它实现了Runnable接口) thread = new Thread(this); thread.start(); }
- 补充渲染逻辑的缺失部分,否则画面无法正常显示:
private void render(){ BufferStrategy bs = getBufferStrategy(); if(bs == null){ this.createBufferStrategy(3); return; } Graphics g = bs.getDrawGraphics(); // 清屏操作,避免上一帧画面残留 g.fillRect(0, 0, getWidth(), getHeight()); g2d = (Graphics2D) g; addImage("../../assets/dirt.png",0,0,g,0,0, false); // 释放图形资源 g.dispose(); // 将缓冲区内容输出到窗口 bs.show(); }
- 需将当前Canvas实例添加到你封装的Window窗口中,否则画面不会挂载到窗口显示,你可以在init方法创建Window后补充对应逻辑,比如:
window.add(this); // 可选:触发窗口重绘 window.setVisible(true);
其他注意事项
- 游戏循环建议增加帧率控制,避免无限制占用CPU资源,可以在循环中增加固定时间的sleep逻辑,或者通过时间差计算实现稳定FPS。
- 图片加载建议提前在初始化阶段完成,不要在每次render的时候都读本地文件,会严重拖慢渲染性能。
内容的提问来源于stack exchange,提问作者user15428862
相关产品推荐
相关产品推荐

