适应推
This commit is contained in:
+1
-1
@@ -51,7 +51,7 @@ String ptrtow(const QWORD value) { return qwtowb16(value, 16); }
|
|||||||
namespace $LimitedUse {
|
namespace $LimitedUse {
|
||||||
Release::~Release() {
|
Release::~Release() {
|
||||||
delete &gc;
|
delete &gc;
|
||||||
Logger.put(L"--------- Last Check ---------\n");
|
Logger.put(L"--------- Last Check ---------");
|
||||||
for (const auto& [addr, info] : memoryManager.allocated) { Logger.print(L" using", addr, info.size, L"B", info.msg); }
|
for (const auto& [addr, info] : memoryManager.allocated) { Logger.print(L" using", addr, info.size, L"B", info.msg); }
|
||||||
delete &Logger;
|
delete &Logger;
|
||||||
delete &memoryManager;
|
delete &memoryManager;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define __CARLBEKS_DEBUG__
|
#define __CARLBEKS_DEBUG__
|
||||||
#define __CARLBEKS_MEMORY__ 3
|
#define __CARLBEKS_MEMORY__ 2
|
||||||
|
|
||||||
#pragma warning(disable: 4819)
|
#pragma warning(disable: 4819)
|
||||||
|
|
||||||
@@ -69,6 +69,8 @@ using Function = std::function<F>;
|
|||||||
#pragma comment(lib, "Uxtheme.lib")
|
#pragma comment(lib, "Uxtheme.lib")
|
||||||
#pragma comment(lib, "winmm.lib")
|
#pragma comment(lib, "winmm.lib")
|
||||||
|
|
||||||
|
#include "warnings.h"
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
concept Copyable = requires(const T& t) { T(t); };
|
concept Copyable = requires(const T& t) { T(t); };
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@@ -94,7 +96,6 @@ namespace $LimitedUse {
|
|||||||
|
|
||||||
~Release();
|
~Release();
|
||||||
} inline gcRelease_LoggerRelease_memoryManagerRelease;
|
} inline gcRelease_LoggerRelease_memoryManagerRelease;
|
||||||
} // namespace $LimitedUse
|
|
||||||
|
|
||||||
struct MemoryManager {
|
struct MemoryManager {
|
||||||
struct MemoryInfo {
|
struct MemoryInfo {
|
||||||
@@ -103,9 +104,11 @@ struct MemoryManager {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Map<void*, MemoryInfo> allocated{};
|
Map<void*, MemoryInfo> allocated{};
|
||||||
|
std::atomic_bool acquiring = false;
|
||||||
|
|
||||||
constexpr MemoryManager() noexcept = default;
|
constexpr MemoryManager() noexcept = default;
|
||||||
} inline& [[carlbeks::releasedat("def.cpp")]] memoryManager = *new MemoryManager;
|
} inline& [[carlbeks::releasedat("def.cpp")]] memoryManager = *new MemoryManager;
|
||||||
|
}
|
||||||
|
|
||||||
void requireNonnull(const void* value) noexcept(false);
|
void requireNonnull(const void* value) noexcept(false);
|
||||||
void checkAllocation(const void* value) noexcept(false);
|
void checkAllocation(const void* value) noexcept(false);
|
||||||
@@ -123,30 +126,40 @@ extern String atow(const char* chars);
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
T* allocatedFor$(T* value, const String& msg = L"", std::size_t size = sizeof(T)) {
|
T* allocatedFor$(T* value, const String& msg = L"", std::size_t size = sizeof(T)) {
|
||||||
requireNonnull(value);
|
requireNonnull(value);
|
||||||
const auto& k = memoryManager.allocated.emplace(value, MemoryManager::MemoryInfo{L"[" + atow(typeid(T).name()) + L"] " + msg, size}).first;
|
bool expect = false;
|
||||||
#if __CARLBEKS_MEMORY__ > 1
|
while (!$LimitedUse::memoryManager.acquiring.compare_exchange_strong(expect, true)) expect = false;
|
||||||
|
const auto& k = $LimitedUse::memoryManager.allocated.emplace(value, $LimitedUse::MemoryManager::MemoryInfo{L"[" + atow(typeid(T).name()) + L"] " + msg, size}).first;
|
||||||
|
#if __CARLBEKS_MEMORY__ > 2
|
||||||
$LimitedUse::printAllocate(value, k->second.size, k->second.msg);
|
$LimitedUse::printAllocate(value, k->second.size, k->second.msg);
|
||||||
#endif
|
#endif
|
||||||
|
$LimitedUse::memoryManager.acquiring.store(false);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T* deallocating$(T* value, const String& stack) {
|
T* deallocating$(T* value, const String& stack) {
|
||||||
#if __CARLBEKS_MEMORY__ > 1
|
bool expect = false;
|
||||||
const MemoryManager::MemoryInfo* info = nullptr;
|
while (!$LimitedUse::memoryManager.acquiring.compare_exchange_strong(expect, true)) expect = false;
|
||||||
if (memoryManager.allocated.contains(value)) info = &memoryManager.allocated.at(value);
|
#if __CARLBEKS_MEMORY__ > 2
|
||||||
|
const $LimitedUse::MemoryManager::MemoryInfo* info = nullptr;
|
||||||
|
if ($LimitedUse::memoryManager.allocated.contains(value)) info = &$LimitedUse::memoryManager.allocated.at(value);
|
||||||
$LimitedUse::printDeallocate(value, info ? info->size : 0, info ? info->msg : L"???");
|
$LimitedUse::printDeallocate(value, info ? info->size : 0, info ? info->msg : L"???");
|
||||||
#endif
|
#endif
|
||||||
if (value) { if (!memoryManager.allocated.erase(value)) $LimitedUse::printDeallocateWarning(value, L"value not recorded" + stack); }
|
if (value) { if (!$LimitedUse::memoryManager.allocated.erase(value)) $LimitedUse::printDeallocateWarning(value, L"value not recorded" + stack); }
|
||||||
|
$LimitedUse::memoryManager.acquiring.store(false);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __FUNCSIG__
|
||||||
|
#define __FUNCSIG__ __FUNCTION__
|
||||||
|
#endif
|
||||||
|
|
||||||
#if __CARLBEKS_MEMORY__ > 3
|
#if __CARLBEKS_MEMORY__ > 3
|
||||||
#define allocatedFor(val, ...) allocatedFor$(val, L"\n From " __FUNCSIG__ "\n At " __FILE__ ":" _STL_STRINGIZE(__LINE__) __VA_OPT__(,) __VA_ARGS__)
|
#define allocatedFor(val, ...) allocatedFor$(val, L"\n From " __FUNCSIG__ "\n At " __FILE__ ":" _STL_STRINGIZE(__LINE__) __VA_OPT__(,) __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define allocatedFor(val, ...) allocatedFor$(val, L"" __VA_OPT__(,) __VA_ARGS__)
|
#define allocatedFor(val, ...) allocatedFor$(val, L"" __VA_OPT__(,) __VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
#if __CARLBEKS_MEMORY__ > 2
|
#if __CARLBEKS_MEMORY__ > 1
|
||||||
#define deallocating(val) deallocating$(val, L"\n From " __FUNCSIG__ "\n At " __FILE__ ":" _STL_STRINGIZE(__LINE__))
|
#define deallocating(val) deallocating$(val, L"\n From " __FUNCSIG__ "\n At " __FILE__ ":" _STL_STRINGIZE(__LINE__))
|
||||||
#else
|
#else
|
||||||
#define deallocating(val) deallocating$(val)
|
#define deallocating(val) deallocating$(val)
|
||||||
|
|||||||
+4
-4
@@ -4,10 +4,10 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../utils/gc.h"
|
// #include "..\utils\gc.h"
|
||||||
#include "../ui/Hud.h"
|
#include "..\ui\Hud.h"
|
||||||
#include "../utils/Task.h"
|
#include "..\utils\Task.h"
|
||||||
#include "../ui/Window.h"
|
#include "..\ui\Window.h"
|
||||||
|
|
||||||
class [[carlbeks::predecl, carlbeks::defineat("World.h")]] WorldManager;
|
class [[carlbeks::predecl, carlbeks::defineat("World.h")]] WorldManager;
|
||||||
class [[carlbeks::predecl, carlbeks::defineat("Entity.h")]] EntityManager;
|
class [[carlbeks::predecl, carlbeks::defineat("Entity.h")]] EntityManager;
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ public:
|
|||||||
block->onRemove();
|
block->onRemove();
|
||||||
}
|
}
|
||||||
gc.submit<World>(this);
|
gc.submit<World>(this);
|
||||||
|
Logger.debug(L"World::onRemove() called");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,22 +2,12 @@
|
|||||||
|
|
||||||
#include "def.h"
|
#include "def.h"
|
||||||
|
|
||||||
inline BOOL NewProcess(const String& cmdline) noexcept {
|
|
||||||
STARTUPINFOW si = {
|
|
||||||
sizeof(si), nullptr, nullptr, nullptr, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr, nullptr
|
|
||||||
};
|
|
||||||
PROCESS_INFORMATION pi{
|
|
||||||
nullptr, nullptr, 0, 0
|
|
||||||
};
|
|
||||||
return CreateProcessW(nullptr, const_cast<wchar*>(cmdline.c_str()), nullptr, nullptr, 0, 0, nullptr, nullptr, &si, &pi);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline HRESULT RemoveDefaultCaption(const HWND hWnd, const MARGINS* p) noexcept { return DwmExtendFrameIntoClientArea(hWnd, p); }
|
inline HRESULT RemoveDefaultCaption(const HWND hWnd, const MARGINS* p) noexcept { return DwmExtendFrameIntoClientArea(hWnd, p); }
|
||||||
|
|
||||||
inline bool ShowConsoleIO() noexcept {
|
inline bool ShowConsoleIO() noexcept {
|
||||||
AllocConsole();
|
AllocConsole();
|
||||||
freopen("CONOUT$", "w", stdout);
|
freopen("CONOUT$", "w", stdout);
|
||||||
freopen("CONOUT$", "r+", stdin);
|
freopen("CONIN$", "r+", stdin);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+20
-17
@@ -494,13 +494,16 @@ void renderThread() {
|
|||||||
using Time = time_point<system_clock>;
|
using Time = time_point<system_clock>;
|
||||||
renderer.initialize();
|
renderer.initialize();
|
||||||
Time lastRender = system_clock::now();
|
Time lastRender = system_clock::now();
|
||||||
|
// bool _TestFlag = false;
|
||||||
while (isRunning) {
|
while (isRunning) {
|
||||||
const Time thisTime = system_clock::now();
|
const Time thisTime = system_clock::now();
|
||||||
if (thisTime - lastRender < milliseconds(interactSettings.constants.msPerRender)) {
|
if (thisTime - lastRender < milliseconds(interactSettings.constants.msPerRender)) {
|
||||||
Sleep(1);
|
Sleep(1);
|
||||||
|
// if (_TestFlag) _TestFlag = false, Logger.debug(L"Render Test: " + std::to_wstring((thisTime - lastRender) / milliseconds(1)));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
game.render(nRange(static_cast<double>((thisTime - lastTick).count()) / interactSettings.constants.msPerRender, 0.0, 1.0));
|
// _TestFlag = true;
|
||||||
|
game.render(nRange(static_cast<double>((thisTime - lastTick).count()) / static_cast<double>(interactSettings.constants.msPerRender), 0.0, 1.0));
|
||||||
lastRender = thisTime;
|
lastRender = thisTime;
|
||||||
}
|
}
|
||||||
} catch (const Exception& e) { Logger.log(L"Render thread exception: " + e.getMessage()); }
|
} catch (const Exception& e) { Logger.log(L"Render thread exception: " + e.getMessage()); }
|
||||||
@@ -516,7 +519,7 @@ int __stdcall wWinMain(const HINSTANCE hInstance, const HINSTANCE, [[maybe_unuse
|
|||||||
SetUnhandledExceptionFilter(UnhandledExceptionFilter);
|
SetUnhandledExceptionFilter(UnhandledExceptionFilter);
|
||||||
translator.initialize();
|
translator.initialize();
|
||||||
Logger.info(L"--------Program Start--------");
|
Logger.info(L"--------Program Start--------");
|
||||||
for (const auto& [addr, info] : memoryManager.allocated) { Logger.print(L" using", addr, info.size, L"B", info.msg); }
|
for (const auto& [addr, info] : $LimitedUse::memoryManager.allocated) { Logger.print(L" using", addr, info.size, L"B", info.msg); }
|
||||||
WNDCLASSEX wc = {};
|
WNDCLASSEX wc = {};
|
||||||
wc.cbSize = sizeof(WNDCLASSEX);
|
wc.cbSize = sizeof(WNDCLASSEX);
|
||||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||||
@@ -541,26 +544,26 @@ int __stdcall wWinMain(const HINSTANCE hInstance, const HINSTANCE, [[maybe_unuse
|
|||||||
.cyBottomHeight = 0
|
.cyBottomHeight = 0
|
||||||
};
|
};
|
||||||
RemoveDefaultCaption(MainWindowHandle, &margins);
|
RemoveDefaultCaption(MainWindowHandle, &margins);
|
||||||
int a = -40;
|
|
||||||
game.tasks.pushNewed(new Task([&a](Task& self) {
|
|
||||||
if (a) {
|
|
||||||
++a;
|
|
||||||
SetLayeredWindowAttributes(MainWindowHandle, 0xffffff, static_cast<BYTE>(0xff * (40 + a) / 40), LWA_COLORKEY | LWA_ALPHA);
|
|
||||||
} else {
|
|
||||||
SetLayeredWindowAttributes(MainWindowHandle, 0xffffff, 0xff, LWA_COLORKEY | LWA_ALPHA);
|
|
||||||
self.schedulePop(true);
|
|
||||||
SetWindowLongW(MainWindowHandle, GWL_EXSTYLE, GetWindowLongW(MainWindowHandle, GWL_EXSTYLE) & ~WS_EX_LAYERED);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}));
|
|
||||||
SetWindowLongW(MainWindowHandle, GWL_EXSTYLE, GetWindowLongW(MainWindowHandle, GWL_EXSTYLE) | WS_EX_LAYERED);
|
SetWindowLongW(MainWindowHandle, GWL_EXSTYLE, GetWindowLongW(MainWindowHandle, GWL_EXSTYLE) | WS_EX_LAYERED);
|
||||||
SetLayeredWindowAttributes(MainWindowHandle, 0xffffff, 0xe0, LWA_COLORKEY | LWA_ALPHA);
|
// SetLayeredWindowAttributes(MainWindowHandle, 0xffffff, 0xe0, LWA_COLORKEY | LWA_ALPHA);
|
||||||
|
SetLayeredWindowAttributes(MainWindowHandle, 0xffffff, 0, LWA_COLORKEY);
|
||||||
ShowWindow(MainWindowHandle, nShowCmd);
|
ShowWindow(MainWindowHandle, nShowCmd);
|
||||||
const HHOOK hook = SetWindowsHookW(WH_GETMESSAGE, HookProc);
|
const HHOOK hook = SetWindowsHookW(WH_GETMESSAGE, HookProc);
|
||||||
const HACCEL hAccelTable = LoadAcceleratorsW(hInstance, MAKEINTRESOURCE(109));
|
const HACCEL hAccelTable = LoadAcceleratorsW(hInstance, MAKEINTRESOURCE(109));
|
||||||
if (!hook) Logger.error(Logger.of(L"SetWindowsHookW failed. LastError:", GetLastError()));
|
if (!hook) Logger.error(Logger.of(L"SetWindowsHookW failed. LastError:", GetLastError()));
|
||||||
test();
|
test();
|
||||||
{
|
{
|
||||||
|
// int a = -40;
|
||||||
|
// game.tasks.pushNewed(allocatedFor(new Task([&a](Task& self) {
|
||||||
|
// if (a) SetLayeredWindowAttributes(MainWindowHandle, 0xffffff, static_cast<BYTE>(0xff * (40 + ++a) / 40), LWA_COLORKEY | LWA_ALPHA);
|
||||||
|
// else {
|
||||||
|
// SetLayeredWindowAttributes(MainWindowHandle, 0xffffff, 0xff, LWA_COLORKEY | LWA_ALPHA);
|
||||||
|
// self.schedulePop(true);
|
||||||
|
// SetWindowLongW(MainWindowHandle, GWL_EXSTYLE, GetWindowLongW(MainWindowHandle, GWL_EXSTYLE) & ~WS_EX_LAYERED);
|
||||||
|
// }
|
||||||
|
// return 0;
|
||||||
|
// })
|
||||||
|
// ));
|
||||||
game.initialize();
|
game.initialize();
|
||||||
interactManager.initialize();
|
interactManager.initialize();
|
||||||
World* w = StartWorld::create();
|
World* w = StartWorld::create();
|
||||||
@@ -584,10 +587,10 @@ int __stdcall wWinMain(const HINSTANCE hInstance, const HINSTANCE, [[maybe_unuse
|
|||||||
DestroyAcceleratorTable(hAccelTable);
|
DestroyAcceleratorTable(hAccelTable);
|
||||||
UnhookWindowsHookEx(hook);
|
UnhookWindowsHookEx(hook);
|
||||||
Logger.info(L"------- Program End --------");
|
Logger.info(L"------- Program End --------");
|
||||||
for (const auto& [addr, info] : memoryManager.allocated) { Logger.print(L" using", addr, info.size, L"B", info.msg); }
|
for (const auto& [addr, info] : $LimitedUse::memoryManager.allocated) { Logger.print(L" using", addr, info.size, L"B", info.msg); }
|
||||||
_wsystem(L"pause");
|
|
||||||
{
|
{
|
||||||
fontManager.finalize(); // 似乎GDI有终止自动回收,所以此代码需要提前
|
fontManager.finalize(); // 似乎GDI有终止自动回收,所以此代码需要提前
|
||||||
}
|
}
|
||||||
|
_wsystem(L"pause");
|
||||||
return static_cast<int>(msg.wParam);
|
return static_cast<int>(msg.wParam);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ public:
|
|||||||
virtual void onMouseUp(const MouseButtonCode code) noexcept {
|
virtual void onMouseUp(const MouseButtonCode code) noexcept {
|
||||||
if (mouseUp) mouseUp(*this, code);
|
if (mouseUp) mouseUp(*this, code);
|
||||||
if (hasMouseTrigger) onMouseClick(code);
|
if (hasMouseTrigger) onMouseClick(code);
|
||||||
|
hasMouseTrigger = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void onMouseLeave(const MouseButtonCode value) noexcept {
|
virtual void onMouseLeave(const MouseButtonCode value) noexcept {
|
||||||
|
|||||||
+5
-5
@@ -108,11 +108,11 @@ static constexpr wchar Table16[17] = L"0123456789ABCDEF";
|
|||||||
[[nodiscard]] inline String qwtowb10(QWORD value, const unsigned int fills = 1) noexcept {
|
[[nodiscard]] inline String qwtowb10(QWORD value, const unsigned int fills = 1) noexcept {
|
||||||
static constexpr wchar Table10[11] = L"0123456789";
|
static constexpr wchar Table10[11] = L"0123456789";
|
||||||
static constexpr QWORD Compare10[20] = {
|
static constexpr QWORD Compare10[20] = {
|
||||||
0, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
|
0ull, 10ull, 100ull, 1000ull, 10000ull, 100000ull, 1000000ull, 10000000ull,
|
||||||
100000000, 1000000000, 10000000000, 100000000000,
|
100000000ull, 1000000000ull, 10000000000ull, 100000000000ull,
|
||||||
1000000000000, 10000000000000, 100000000000000,
|
1000000000000ull, 10000000000000ull, 100000000000000ull,
|
||||||
1000000000000000, 10000000000000000, 100000000000000000,
|
1000000000000000ull, 10000000000000000ull, 100000000000000000ull,
|
||||||
1000000000000000000, 10000000000000000000
|
1000000000000000000ull, 10000000000000000000ull
|
||||||
};
|
};
|
||||||
String ret;
|
String ret;
|
||||||
if (value < Compare10[fills]) {
|
if (value < Compare10[fills]) {
|
||||||
|
|||||||
@@ -6,4 +6,5 @@
|
|||||||
|
|
||||||
#pragma warning(disable: 4554)
|
#pragma warning(disable: 4554)
|
||||||
#pragma warning(default: 4555)
|
#pragma warning(default: 4555)
|
||||||
|
#pragma warning(disable: 4996)
|
||||||
#pragma warning(disable: 5030)
|
#pragma warning(disable: 5030)
|
||||||
|
|||||||
Reference in New Issue
Block a user