From ed49c9f7765ea6e5c8c9827bed7e6638ab583b36 Mon Sep 17 00:00:00 2001 From: LabyStudio Date: Tue, 1 Feb 2022 08:30:51 +0100 Subject: [PATCH] implement stats.min.js, improve fps --- libraries/stats.min.js | 5 +++ src/js/net/minecraft/client/GameWindow.js | 9 ++++- src/js/net/minecraft/client/Minecraft.js | 38 +++++++++++-------- .../minecraft/client/render/BlockRenderer.js | 5 --- .../minecraft/client/render/Tessellator.js | 16 ++++++-- .../minecraft/client/world/ChunkSection.js | 7 ++++ src/start.js | 1 + 7 files changed, 56 insertions(+), 25 deletions(-) create mode 100644 libraries/stats.min.js diff --git a/libraries/stats.min.js b/libraries/stats.min.js new file mode 100644 index 0000000..4ba9e35 --- /dev/null +++ b/libraries/stats.min.js @@ -0,0 +1,5 @@ +// stats.js - http://github.com/mrdoob/stats.js +(function(f,e){"object"===typeof exports&&"undefined"!==typeof module?module.exports=e():"function"===typeof define&&define.amd?define(e):f.Stats=e()})(this,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d=g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/ + 1048576,d.jsHeapSizeLimit/1048576)}return c},update:function(){k=this.end()},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v); + b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return{dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p))}}};return f}); \ No newline at end of file diff --git a/src/js/net/minecraft/client/GameWindow.js b/src/js/net/minecraft/client/GameWindow.js index d6ce5b4..92b2cd8 100644 --- a/src/js/net/minecraft/client/GameWindow.js +++ b/src/js/net/minecraft/client/GameWindow.js @@ -8,9 +8,16 @@ window.GameWindow = class { this.mouseMotionY = 0; this.mouseLocked = false; + let wrapper = document.getElementById(this.canvasWrapperId); + + // Stats + this.stats = new Stats() + this.stats.showPanel(1); + wrapper.appendChild(this.stats.dom); + // Add web renderer canvas to wrapper let canvas = renderer.canvasElement; - document.getElementById(this.canvasWrapperId).appendChild(canvas); + wrapper.appendChild(canvas); // Init this.onResize(); diff --git a/src/js/net/minecraft/client/Minecraft.js b/src/js/net/minecraft/client/Minecraft.js index 5908eac..92a31f0 100644 --- a/src/js/net/minecraft/client/Minecraft.js +++ b/src/js/net/minecraft/client/Minecraft.js @@ -42,6 +42,8 @@ window.Minecraft = class { } onLoop() { + this.window.stats.begin(); + // Update the timer this.timer.advanceTime(); @@ -63,6 +65,8 @@ window.Minecraft = class { this.lastTime += 1000; this.frames = 0; } + + this.window.stats.end(); } onRender(partialTicks) { @@ -84,27 +88,29 @@ window.Minecraft = class { } onMouseClicked(button) { - let hitResult = this.player.rayTrace(5, this.timer.partialTicks); + if (this.window.mouseLocked) { + let hitResult = this.player.rayTrace(5, this.timer.partialTicks); - // Destroy block - if (button === 0) { - if (hitResult != null) { - this.world.setBlockAt(hitResult.x, hitResult.y, hitResult.z, 0); + // Destroy block + if (button === 0) { + if (hitResult != null) { + this.world.setBlockAt(hitResult.x, hitResult.y, hitResult.z, 0); + } } - } - // Place block - if (button === 2) { - if (hitResult != null) { - let x = hitResult.x + hitResult.face.x; - let y = hitResult.y + hitResult.face.y; - let z = hitResult.z + hitResult.face.z; + // Place block + if (button === 2) { + if (hitResult != null) { + let x = hitResult.x + hitResult.face.x; + let y = hitResult.y + hitResult.face.y; + let z = hitResult.z + hitResult.face.z; - let placedBoundingBox = new BoundingBox(x, y, z, x + 1, y + 1, z + 1); + let placedBoundingBox = new BoundingBox(x, y, z, x + 1, y + 1, z + 1); - // Don't place blocks if the player is standing there - if (!placedBoundingBox.intersects(this.player.boundingBox)) { - this.world.setBlockAt(x, y, z, 1); + // Don't place blocks if the player is standing there + if (!placedBoundingBox.intersects(this.player.boundingBox)) { + this.world.setBlockAt(x, y, z, 1); + } } } } diff --git a/src/js/net/minecraft/client/render/BlockRenderer.js b/src/js/net/minecraft/client/render/BlockRenderer.js index 4e953aa..837c708 100644 --- a/src/js/net/minecraft/client/render/BlockRenderer.js +++ b/src/js/net/minecraft/client/render/BlockRenderer.js @@ -16,14 +16,9 @@ window.BlockRenderer = class { // Check if face is hidden by other block if (block.shouldRenderFace(world, x, y, z, face)) { - // Start drawing - this.tessellator.startDrawing(); // Render face this.renderFace(world, block, boundingBox, face, x, y, z); - - // Draw - this.tessellator.draw(group); } } } diff --git a/src/js/net/minecraft/client/render/Tessellator.js b/src/js/net/minecraft/client/render/Tessellator.js index 6bb0cde..464817b 100644 --- a/src/js/net/minecraft/client/render/Tessellator.js +++ b/src/js/net/minecraft/client/render/Tessellator.js @@ -6,8 +6,6 @@ window.Tessellator = class { side: THREE.BackSide, transparent: true }); - - this.index = new THREE.BufferAttribute(new Uint32Array([0, 2, 1, 0, 3, 2]), 1); } bindTexture(texture) { @@ -50,7 +48,19 @@ window.Tessellator = class { geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(this.vertices), 3)); geometry.setAttribute('color', new THREE.BufferAttribute(new Float32Array(this.colors), 3)); geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(this.uv), 2)); - geometry.setIndex(this.index); + + // Create index array + let index = []; + let verticesPerFace = 4; + for (let i = 0; i < this.addedVertices / verticesPerFace; i++) { + index.push(i * verticesPerFace + 0); + index.push(i * verticesPerFace + 2); + index.push(i * verticesPerFace + 1); + index.push(i * verticesPerFace + 0); + index.push(i * verticesPerFace + 3); + index.push(i * verticesPerFace + 2); + } + geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(index), 1)); let mesh = new THREE.Mesh(geometry, this.material); group.matrixAutoUpdate = false; diff --git a/src/js/net/minecraft/client/world/ChunkSection.js b/src/js/net/minecraft/client/world/ChunkSection.js index 532f0c3..bb87cc8 100644 --- a/src/js/net/minecraft/client/world/ChunkSection.js +++ b/src/js/net/minecraft/client/world/ChunkSection.js @@ -26,6 +26,10 @@ window.ChunkSection = class { this.dirty = false; this.group.clear(); + // Start drawing chunk section + let tessellator = renderer.blockRenderer.tessellator; + tessellator.startDrawing(); + for (let x = 0; x < ChunkSection.SIZE; x++) { for (let y = 0; y < ChunkSection.SIZE; y++) { for (let z = 0; z < ChunkSection.SIZE; z++) { @@ -42,6 +46,9 @@ window.ChunkSection = class { } } } + + // Draw chunk section + tessellator.draw(this.group); } getBlockAt(x, y, z) { diff --git a/src/start.js b/src/start.js index 036ab47..9ce744e 100644 --- a/src/start.js +++ b/src/start.js @@ -45,6 +45,7 @@ function updatePreStatus(message) { loadScripts([ // Dependencies "libraries/three.min.js", + "libraries/stats.min.js", // Minecraft Source "src/js/net/minecraft/util/EnumBlockFace.js",