26 minutes ago, Magogan said:
I personally didn't experience any crash with any of the released versions of my game.
This usually tells you very little in terms of compatibility. Generally the only time this kind of info is useful is programming for fixed hardware / environment, such as a console. You might for example have loads of errors and your particular system is recovering from them for you, or be using features that are only present / work in that way on your particular system.
It would probably be useful to know what platform / APIs (graphics / sound etc) you are using to start with. Am guessing DX11 from your other posts. There may be some kind of reference / debug implementation that will help flag up errors (I haven't used directx for years).
Part of the reason game engines (unity, unreal etc) are so successful is that they do a lot of this compatibility testing for you (unless you are doing something particularly funky).
I am no expert on the subject but this is just some general thoughts:
On a PC or phones / tablets etc reasons for crashes / slowdowns can be a multitude of different things, you need to test on loads of different systems (combinations of OS, OS patches, GPU, drivers, anti virus etc etc), as well as provide means to provide a log from a customer machine so you can get some environment info if they are having a problem, and identify patterns (although don't collect this info without their permission, data protection...). Also code defensively, check return values for calls to APIs, check memory allocations for failure, and in all cases provide meaningful error messages with code location etc, don't just crash. Have non-time critical asserts present in release builds.
You may be able to pay a company to do some compatibility testing for you, and / or utilize virtual machines. Big companies often have rooms full of different hardware / configurations to test on. It can be a nightmare, but my advice is to work out your lowest spec target and work to that to start with. Often there will be low hanging fruit, easy fixes which cure problems for a large percentage of machines. Other times you might need separate code paths for different environments.