Demos update

-added functionality to detect host CPU threads count
-fixed some memory leaks
-now textures free memory corectly
-added support for up to 32 threads
This commit is contained in:
Mergul 2020-05-13 15:34:24 +02:00
parent dd491302af
commit 3647fa4b86
6 changed files with 98 additions and 16 deletions

View file

@ -810,6 +810,46 @@ private:
JobData[4] resumeJobs; /// Dummu jobs to resume some thread JobData[4] resumeJobs; /// Dummu jobs to resume some thread
public: public:
static int getCPUCoresCount()
{
version(Windows)
{
import core.sys.windows.winbase : SYSTEM_INFO, GetSystemInfo;
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
return sysinfo.dwNumberOfProcessors;
}
else version (linux)
{
version(D_BetterC)
{
import core.sys.posix.unistd : _SC_NPROCESSORS_ONLN, sysconf;
return cast(int)sysconf(_SC_NPROCESSORS_ONLN);
}
else
{
import core.sys.linux.sched : CPU_COUNT, cpu_set_t, sched_getaffinity;
import core.sys.posix.unistd : _SC_NPROCESSORS_ONLN, sysconf;
cpu_set_t set = void;
if (sched_getaffinity(0, cpu_set_t.sizeof, &set) == 0)
{
int count = CPU_COUNT(&set);
if (count > 0)
return cast(uint) count;
}
return cast(int)sysconf(_SC_NPROCESSORS_ONLN);
}
}
else version(Posix)
{
import core.sys.posix.unistd;
return cast(int)sysconf(_SC_NPROCESSORS_ONLN);
}
else return -1;
}
int jobsDoneCount() int jobsDoneCount()
{ {
int sum; int sum;

View file

@ -58,7 +58,7 @@ struct Launcher
uint style = 3; uint style = 3;
uint entities_count; uint entities_count;
bool multithreading; bool multithreading;
int threads; int threads = 1;
ulong timer_freq; ulong timer_freq;
double delta_time; double delta_time;
uint fps; uint fps;
@ -103,6 +103,14 @@ struct Launcher
manager.update("clean"); manager.update("clean");
manager.end(); manager.end();
foreach(system; manager.systems)
{
if(system.id != CountSystem.system_id && system.id != CleanSystem.system_id)system.disable();
}
/*launcher.manager.getSystem(CountSystem.system_id).enable();
launcher.manager.getSystem(CleanSystem.system_id).enable();//*/
if(start)start(); if(start)start();
this.loop = loop; this.loop = loop;
this.end = end; this.end = end;
@ -316,11 +324,19 @@ void mainLoop(void* arg)
if(igMenuItemBool("Multithreading", null, launcher.multithreading, true)) if(igMenuItemBool("Multithreading", null, launcher.multithreading, true))
{ {
launcher.multithreading = !launcher.multithreading; launcher.multithreading = !launcher.multithreading;
if(launcher.multithreading)
{
launcher.job_updater.pool.setThreadsNum(launcher.threads);
}
else
{
launcher.job_updater.pool.setThreadsNum(1);
}
} }
igSetNextItemWidth(0); igSetNextItemWidth(0);
igLabelText("Threads:",null); igLabelText("Threads:",null);
igSameLine(0,4); igSameLine(0,4);
if(igSliderInt("##Threads",&launcher.threads, 1, 12, null))//"Multithreading", null, launcher.multithreading, true)) if(igSliderInt("##Threads",&launcher.threads, 1, 32, null))//"Multithreading", null, launcher.multithreading, true))
{ {
launcher.job_updater.pool.setThreadsNum(launcher.threads); launcher.job_updater.pool.setThreadsNum(launcher.threads);
//launcher.threads = !launcher.multithreading; //launcher.threads = !launcher.multithreading;
@ -547,13 +563,13 @@ void mainLoop(void* arg)
launcher.renderer.clear(); launcher.renderer.clear();
double loop_time = launcher.getTime(); double loop_time = launcher.getTime();
launcher.job_updater.pool.tryWaitCount = 5000; launcher.job_updater.pool.tryWaitCount = 10000;
if(launcher.loop && !launcher.loop()) if(launcher.loop && !launcher.loop())
{ {
quit(); quit();
*cast(bool*)arg = false; *cast(bool*)arg = false;
} }
launcher.job_updater.pool.tryWaitCount = 10; launcher.job_updater.pool.tryWaitCount = 0;
loop_time = launcher.getTime() - loop_time; loop_time = launcher.getTime() - loop_time;
@ -697,10 +713,10 @@ int main(int argc, char** argv)
setStyle(3); setStyle(3);
launcher.job_updater = Mallocator.make!ECSJobUpdater(12); launcher.job_updater = Mallocator.make!ECSJobUpdater(1);
//launcher.job_updater.onCreate(); //launcher.job_updater.onCreate();
EntityManager.initialize(12); EntityManager.initialize(32);
launcher.manager = EntityManager.instance; launcher.manager = EntityManager.instance;
//launcher.manager.m_thread_id_func = &launcher.job_updater.getThreadID; //launcher.manager.m_thread_id_func = &launcher.job_updater.getThreadID;
@ -720,6 +736,10 @@ int main(int argc, char** argv)
launcher.renderer.initialize(); launcher.renderer.initialize();
import mmutils.thread_pool : ThreadPool;
launcher.threads = ThreadPool.getCPUCoresCount();
if(launcher.threads < 2)launcher.threads = 2;
launcher.gui_manager = Mallocator.make!GUIManager(); launcher.gui_manager = Mallocator.make!GUIManager();
{ {
@ -752,6 +772,8 @@ int main(int argc, char** argv)
} }
} }
EntityManager.destroy();
return 0; return 0;
} }

View file

@ -90,6 +90,16 @@ struct Snake
MapElement[map_size * map_size] map; MapElement[map_size * map_size] map;
~this() @nogc nothrow
{
if(snake_destroy_particle_frames)Mallocator.dispose(snake_destroy_particle_frames);
if(smoke_frames)Mallocator.dispose(smoke_frames);
if(apple_tmpl)launcher.manager.freeTemplate(apple_tmpl);
if(snake_tmpl)launcher.manager.freeTemplate(snake_tmpl);
if(snake_destroy_particle)launcher.manager.freeTemplate(snake_destroy_particle);
texture.destory();
}
MapElement element(ivec2 pos) MapElement element(ivec2 pos)
{ {
uint index = pos.x + pos.y * map_size; uint index = pos.x + pos.y * map_size;
@ -805,9 +815,9 @@ void snakeStart()
snake.addApple(); snake.addApple();
} }
launcher.gui_manager.addTemplate(snake.snake_tmpl, "Snake"); launcher.gui_manager.addTemplate(launcher.manager.allocateTemplate(snake.snake_tmpl), "Snake");
launcher.gui_manager.addTemplate(snake.apple_tmpl, "Apple"); launcher.gui_manager.addTemplate(launcher.manager.allocateTemplate(snake.apple_tmpl), "Apple");
launcher.gui_manager.addTemplate(snake.snake_destroy_particle, "Particle"); launcher.gui_manager.addTemplate(launcher.manager.allocateTemplate(snake.snake_destroy_particle), "Particle");
MoveSystem* move_system = launcher.manager.getSystem!MoveSystem(); MoveSystem* move_system = launcher.manager.getSystem!MoveSystem();
move_system.setTemplates(); move_system.setTemplates();

View file

@ -48,6 +48,10 @@ struct SpaceInvaders
~this() @nogc nothrow ~this() @nogc nothrow
{ {
if(shoot_grid)Mallocator.dispose(shoot_grid); if(shoot_grid)Mallocator.dispose(shoot_grid);
launcher.manager.freeTemplate(enemy_tmpl);
launcher.manager.freeTemplate(ship_tmpl);
launcher.manager.freeTemplate(laser_tmpl);
texture.destory();
} }
} }
@ -337,7 +341,7 @@ struct ShootGridCleaner
struct ShootGridManager struct ShootGridManager
{ {
mixin ECS.System!32; mixin ECS.System!128;
mixin ECS.WritableDependencies!(ShootGridDependency); mixin ECS.WritableDependencies!(ShootGridDependency);
@ -793,7 +797,7 @@ struct MovementSystem
} }
} }
import core.stdc.math; extern(C) float sqrtf(float x) @nogc nothrow @system;
/** /**
*System is responsible for movement of objects with CInput component. *System is responsible for movement of objects with CInput component.
@ -893,6 +897,8 @@ void spaceInvadersStart()
launcher.manager.beginRegister(); launcher.manager.beginRegister();
launcher.manager.registerDependency(ShootGridDependency);
launcher.manager.registerComponent!CLocation; launcher.manager.registerComponent!CLocation;
launcher.manager.registerComponent!CTexture; launcher.manager.registerComponent!CTexture;
launcher.manager.registerComponent!CInput; launcher.manager.registerComponent!CInput;
@ -1009,10 +1015,10 @@ void spaceInvadersStart()
enemy_tmpl = launcher.manager.allocateTemplate(enemy_id); enemy_tmpl = launcher.manager.allocateTemplate(enemy_id);
grouped_tmpl = launcher.manager.allocateTemplate(grouped_id); grouped_tmpl = launcher.manager.allocateTemplate(grouped_id);
launcher.gui_manager.addTemplate(space_invaders.ship_tmpl,"Ship"); launcher.gui_manager.addTemplate(launcher.manager.allocateTemplate(space_invaders.ship_tmpl),"Ship");
launcher.gui_manager.addTemplate(enemy_tmpl,"Enemy"); launcher.gui_manager.addTemplate(enemy_tmpl,"Enemy");
launcher.gui_manager.addTemplate(grouped_tmpl,"Grouped enemy"); launcher.gui_manager.addTemplate(grouped_tmpl,"Grouped enemy");
launcher.gui_manager.addTemplate(space_invaders.laser_tmpl,"Laser"); launcher.gui_manager.addTemplate(launcher.manager.allocateTemplate(space_invaders.laser_tmpl),"Laser");
} }
@ -1023,8 +1029,9 @@ void spaceInvadersEnd()
launcher.manager.getSystem(LaserShootingSystem.system_id).disable(); launcher.manager.getSystem(LaserShootingSystem.system_id).disable();
launcher.manager.getSystem(MovementSystem.system_id).disable(); launcher.manager.getSystem(MovementSystem.system_id).disable();
launcher.manager.getSystem(ClampPositionSystem.system_id).disable(); launcher.manager.getSystem(ClampPositionSystem.system_id).disable();
launcher.manager.getSystem(ShootGridCleaner.system_id).disable();
launcher.manager.freeTemplate(space_invaders.enemy_tmpl); //launcher.manager.freeTemplate(space_invaders.enemy_tmpl);
Mallocator.dispose(space_invaders); Mallocator.dispose(space_invaders);
} }

View file

@ -230,7 +230,7 @@ struct Renderer
block_stack_mutex.initialize(); block_stack_mutex.initialize();
threads = Mallocator.makeArray!Thread(12); threads = Mallocator.makeArray!Thread(32);
foreach(ref Thread thread;threads) foreach(ref Thread thread;threads)
{ {
thread.block = getBlock(); thread.block = getBlock();

View file

@ -54,6 +54,8 @@ struct Texture
data.data = Mallocator.makeArray!ubyte(surf.w*surf.h*surf.format.BytesPerPixel); data.data = Mallocator.makeArray!ubyte(surf.w*surf.h*surf.format.BytesPerPixel);
data.data[0..$] = (cast(ubyte*)surf.pixels)[0..data.data.length]; data.data[0..$] = (cast(ubyte*)surf.pixels)[0..data.data.length];
SDL_FreeSurface(surf);
glGenTextures(1, &data.gl_handle); glGenTextures(1, &data.gl_handle);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,data.gl_handle); glBindTexture(GL_TEXTURE_2D,data.gl_handle);
@ -78,11 +80,12 @@ struct Texture
glBindTexture(GL_TEXTURE_2D, data.gl_handle); glBindTexture(GL_TEXTURE_2D, data.gl_handle);
} }
void destory() void destory() @nogc nothrow
{ {
if(data) if(data)
{ {
glDeleteTextures(1, &data.gl_handle); glDeleteTextures(1, &data.gl_handle);
if(data.data)Mallocator.dispose(data.data);
Mallocator.dispose(data); Mallocator.dispose(data);
data = null; data = null;
} }