Comments (13)
Ah, I'm sorry. I forgot, that one timer gets created on top-level. Try this instead:
Create a file "fixPerformance.js" (name it whatever you like) with the 2 code lines above, then import that file before you import @box2d/core
.
from box2d.ts.
Hi @8Observer8, sorry for the delay, life kept me busy.
What exactly do you mean by adding it to the NPM package?
- perf_hooks is a node API and box2d.ts should be usable from the browser, so I can't just add it by default, as it will then fail in the browser.
- I guess I could make something like a submodule import. For example:
import '@box2d/core/global-performance'
, is that what you'd want? - Alternatively, I've just read about the browser field in package.json, which might be usable for this, but I'd have to do a little more research, if this is actually supported by all major bundlers: https://github.com/defunctzombie/package-browser-field-spec
Solution 2 will work for everyone, but it still requires a manual import by you. Solution 3 is more convenient, but also might break in some bundling scenarios.
from box2d.ts.
I don't understand 3) but 2) is better than now. I think it must be in the documentation here: https://lusito.github.io/box2d.ts/docs/guide/ on the left side panel, for example, the Server
section after Particels
and Controller
sections.
from box2d.ts.
You can check how the CLI benchmark does it: https://github.com/Lusito/box2d.ts/blob/master/packages/benchmark/src/cli/index.ts
import { performance } from "perf_hooks";
global.performance = performance as any;
from box2d.ts.
Sorry, I don't understand what should I change to fix it. I use JavaScript instead of TypeScript.
from box2d.ts.
Somewhere in your server-side code, add the import and the global.performance assignment. Just make sure, the assignment happens before you work with box2d.
JavaScript version:
import { performance } from "perf_hooks";
global.performance = performance;
from box2d.ts.
import { performance } from "perf_hooks";
global.performance = performance;
import { b2World } from "@box2d/core";
const world = b2World.Create({ x: 0, y: -9.8 });
console.log("ok");
E:\_Projects\Physics\box2d-core\server-side-box2dcore-webgl-js>node src/server/app.js
E:\_Projects\node_modules\@box2d\core\dist\common\b2_timer.js:27
this.m_start = performance.now();
^
ReferenceError: performance is not defined
at new b2Timer (E:\_Projects\node_modules\�[4m@box2d�[24m\core\dist\common\b2_timer.js:27:24)
at Object.<anonymous> (E:\_Projects\node_modules\�[4m@box2d�[24m\core\dist\collision\b2_time_of_impact.js:230:32)
�[90m at Module._compile (internal/modules/cjs/loader.js:1072:14)�[39m
�[90m at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)�[39m
�[90m at Module.load (internal/modules/cjs/loader.js:937:32)�[39m
�[90m at Function.Module._load (internal/modules/cjs/loader.js:778:12)�[39m
�[90m at Module.require (internal/modules/cjs/loader.js:961:19)�[39m
�[90m at require (internal/modules/cjs/helpers.js:92:18)�[39m
at Object.<anonymous> (E:\_Projects\node_modules\�[4m@box2d�[24m\core\dist\index.js:46:14)
�[90m at Module._compile (internal/modules/cjs/loader.js:1072:14)�[39m
from box2d.ts.
Thank you very much!
fix-performance.js
import { performance } from "perf_hooks";
global.performance = performance;
app.js
import "./fix-performance.js";
import { b2World } from "@box2d/core";
const world = b2World.Create({ x: 0, y: -9.8 });
console.log(`gravity = ${world.GetGravity().y}`);
Output: gravity = -9.8
from box2d.ts.
I have reopened this issue because I think the solution above should be added to the NPM package.
from box2d.ts.
I see that it is impossible. I just wanted to make it more user friendly. I mean user installs npm i @box2d/core
and just uses it on the server side. I thought I can be solved. Thank you for your time to explain this clearly.
from box2d.ts.
Maybe I wrote this a bit confusing.. Only the first of the 3 approaches above is impossible. The other two are possible, but each have their downsides. I was hoping you would tell me your opinion on the last 2 approaches.
from box2d.ts.
I just noticed, that I don't get the error anymore and checked: performance.now is globally available since Node 16, so it's no longer needed to have this fix. I wrote the fix when I was still using Node 12.
Are you sure you still need this fix? I think we can drop support for Node 12 by now.
from box2d.ts.
It works! I have moved my example on the Glitch hosting: https://glitch.com/edit/#!/box2d-core-on-the-server-side-js
import { b2World } from "@box2d/core";
const world = b2World.Create({ x: 0, y: -9.8 });
const gravity = world.GetGravity();
console.log(`gravity = (${gravity.x}, ${gravity.y})`);
You can see an output result of the program if you press "LOGS" at the bottom:
I have add the required Node.js (>=16) version to package.json
:
{
"name": "box2d-core-on-the-server-side-js",
"version": "1.0.0",
"description": "",
"type": "module",
"engines": {
"node": ">=16.0.0"
},
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server/app.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@box2d/core": "^0.10.0"
}
from box2d.ts.
Related Issues (20)
- As a project developer, I want to be able to render the world to a canvas using a function HOT 7
- wasm builds of box2d and liquidfun HOT 2
- [Solved] Constructor of class 'b2World' is private and only accessible within the class declaration HOT 2
- [Solved] b2_island.d.ts:3:10 - error TS2305: Module '"./b2_contact_solver"' has no exported member 'b2ContactVelocityConstraint'. HOT 6
- Hasn't the DebugDraw() method been implemented? HOT 2
- [Solved] Where can I find the demo source code for the official @box2d/core examples? HOT 2
- Hello World example HOT 2
- Testbed a little too fast
- Hacktoberfest
- Plz make little note in guide HOT 2
- Feature Request: Implementation of b2Draw, SetDebugDraw and DebugDraw HOT 19
- [Solved] The requested module '@box2d/core' does not provide an export named 'b2Draw' HOT 2
- [Solved] `DrawSolidPolygon` gets wrong collider position HOT 6
- Rotation problem with box2d-core and WebGL HOT 12
- Feature Request: Add the ESM button to jsDelivr HOT 2
- Feature Request: Add an information to jsDelivr that @box2d/core is JavaScript port too HOT 1
- Drawing colliders for box2d-core using Pixi.js HOT 10
- Links in documentation don't work on local server HOT 2
- An error occurs when using the SetTransformXY method HOT 6
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from box2d.ts.