| 64 | } |
| 65 | |
| 66 | void SLive2DViewerModule::on_load(int argc, char8_t** argv) |
| 67 | { |
| 68 | SKR_LOG_INFO(u8"live2d viewer loaded!"); |
| 69 | |
| 70 | std::error_code ec = {}; |
| 71 | auto resourceRoot = (skr::filesystem::current_path(ec) / "../resources").u8string(); |
| 72 | skr_vfs_desc_t vfs_desc = {}; |
| 73 | vfs_desc.mount_type = SKR_MOUNT_TYPE_CONTENT; |
| 74 | vfs_desc.override_mount_dir = resourceRoot.c_str(); |
| 75 | resource_vfs = skr_create_vfs(&vfs_desc); |
| 76 | |
| 77 | l2d_world = sugoiS_create(); |
| 78 | |
| 79 | auto render_device = skr_get_default_render_device(); |
| 80 | l2d_renderer = skr_create_renderer(render_device, l2d_world); |
| 81 | |
| 82 | auto jobQueueDesc = make_zeroed<skr::JobQueueDesc>(); |
| 83 | jobQueueDesc.thread_count = 2; |
| 84 | jobQueueDesc.priority = SKR_THREAD_ABOVE_NORMAL; |
| 85 | jobQueueDesc.name = u8"Live2DViewer-RAMIOJobQueue"; |
| 86 | io_job_queue = SkrNew<skr::JobQueue>(jobQueueDesc); |
| 87 | |
| 88 | auto ramServiceDesc = make_zeroed<skr_ram_io_service_desc_t>(); |
| 89 | ramServiceDesc.name = u8"Live2DViewer-RAMIOService"; |
| 90 | ramServiceDesc.sleep_time = 1000 / 100; // tick rate: 100 |
| 91 | ramServiceDesc.io_job_queue = io_job_queue; |
| 92 | ramServiceDesc.callback_job_queue = io_job_queue; |
| 93 | ramServiceDesc.awake_at_request = false; // add latency but reduce CPU usage & batch IO requests |
| 94 | ram_service = skr_io_ram_service_t::create(&ramServiceDesc); |
| 95 | ram_service->run(); |
| 96 | |
| 97 | auto vramServiceDesc = make_zeroed<skr_vram_io_service_desc_t>(); |
| 98 | vramServiceDesc.name = u8"Live2DViewer-VRAMIOService"; |
| 99 | vramServiceDesc.awake_at_request = true; |
| 100 | vramServiceDesc.ram_service = ram_service; |
| 101 | vramServiceDesc.callback_job_queue = SLive2DViewerModule::Get()->io_job_queue; |
| 102 | vramServiceDesc.use_dstorage = true; |
| 103 | vramServiceDesc.gpu_device = render_device->get_cgpu_device(); |
| 104 | vram_service = skr_io_vram_service_t::create(&vramServiceDesc); |
| 105 | vram_service->run(); |
| 106 | |
| 107 | #ifdef _WIN32 |
| 108 | skr_win_dstorage_decompress_desc_t decompress_desc = {}; |
| 109 | decompress_desc.job_queue = io_job_queue; |
| 110 | if (auto decompress_service = skr_runtime_create_win_dstorage_decompress_service(&decompress_desc)) |
| 111 | { |
| 112 | skr_win_dstorage_decompress_service_register_callback(decompress_service, |
| 113 | SKR_WIN_DSTORAGE_COMPRESSION_TYPE_IMAGE, |
| 114 | &skr_image_coder_win_dstorage_decompressor, nullptr); |
| 115 | } |
| 116 | #endif |
| 117 | } |
| 118 | |
| 119 | void SLive2DViewerModule::on_unload() |
| 120 | { |
nothing calls this directly
no test coverage detected