diff --git a/Extra2D/include/extra2d/app/application.h b/Extra2D/include/extra2d/app/application.h index 088ca22..9e26492 100644 --- a/Extra2D/include/extra2d/app/application.h +++ b/Extra2D/include/extra2d/app/application.h @@ -60,10 +60,10 @@ private: AppConfig config_; - UniquePtr window_; - UniquePtr renderer_; - UniquePtr eventQueue_; - UniquePtr eventDispatcher_; + Unique window_; + Unique renderer_; + Unique eventQueue_; + Unique eventDispatcher_; bool initialized_ = false; bool running_ = false; diff --git a/Extra2D/include/extra2d/core/types.h b/Extra2D/include/extra2d/core/types.h index ee93b7d..02327bd 100644 --- a/Extra2D/include/extra2d/core/types.h +++ b/Extra2D/include/extra2d/core/types.h @@ -3,7 +3,6 @@ #include #include #include -#include namespace extra2d { @@ -12,9 +11,9 @@ namespace extra2d { // --------------------------------------------------------------------------- template using Ptr = std::shared_ptr; -template using UniquePtr = std::unique_ptr; +template using Unique = std::unique_ptr; -template using WeakPtr = std::weak_ptr; +template using Weak = std::weak_ptr; /// 创建 shared_ptr 的便捷函数 template inline Ptr shared(Args &&...args) { @@ -23,7 +22,7 @@ template inline Ptr shared(Args &&...args) { /// 创建 unique_ptr 的便捷函数 template -inline UniquePtr unique(Args &&...args) { +inline Unique unique(Args &&...args) { return std::make_unique(std::forward(args)...); } diff --git a/Extra2D/include/extra2d/resource/resource_manager.h b/Extra2D/include/extra2d/resource/resource_manager.h index 4b59853..1c28a47 100644 --- a/Extra2D/include/extra2d/resource/resource_manager.h +++ b/Extra2D/include/extra2d/resource/resource_manager.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -7,15 +8,15 @@ #include #include #include -#include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include +#include #include + namespace extra2d { // ============================================================================ @@ -25,14 +26,14 @@ namespace extra2d { // 纹理格式枚举 enum class TextureFormat { - Auto = 0, // 自动选择最佳格式 - RGBA8, // 32位 RGBA - RGB8, // 24位 RGB - DXT1, // BC1/DXT1 压缩(1 bit alpha) - DXT5, // BC3/DXT5 压缩(完整 alpha) - ETC2, // ETC2 压缩(移动平台) - ASTC4x4, // ASTC 4x4 压缩(高质量) - ASTC8x8, // ASTC 8x8 压缩(高压缩率) + Auto = 0, // 自动选择最佳格式 + RGBA8, // 32位 RGBA + RGB8, // 24位 RGB + DXT1, // BC1/DXT1 压缩(1 bit alpha) + DXT5, // BC3/DXT5 压缩(完整 alpha) + ETC2, // ETC2 压缩(移动平台) + ASTC4x4, // ASTC 4x4 压缩(高质量) + ASTC8x8, // ASTC 8x8 压缩(高压缩率) }; // ============================================================================ @@ -40,9 +41,9 @@ enum class TextureFormat { // ============================================================================ struct TextureCacheEntry { Ptr texture; - size_t size = 0; // 纹理大小(字节) - float lastAccessTime = 0.0f; // 最后访问时间 - uint32_t accessCount = 0; // 访问次数 + size_t size = 0; // 纹理大小(字节) + float lastAccessTime = 0.0f; // 最后访问时间 + uint32_t accessCount = 0; // 访问次数 }; // 异步加载回调类型 @@ -61,18 +62,21 @@ public: /// 加载纹理(带缓存) Ptr loadTexture(const std::string &filepath); - + /// 加载纹理(指定是否异步) Ptr loadTexture(const std::string &filepath, bool async); - + /// 加载纹理(完整参数:异步 + 压缩格式) - Ptr loadTexture(const std::string &filepath, bool async, TextureFormat format); - + Ptr loadTexture(const std::string &filepath, bool async, + TextureFormat format); + /// 异步加载纹理(带回调) - void loadTextureAsync(const std::string &filepath, TextureLoadCallback callback); - + void loadTextureAsync(const std::string &filepath, + TextureLoadCallback callback); + /// 异步加载纹理(指定格式 + 回调) - void loadTextureAsync(const std::string &filepath, TextureFormat format, TextureLoadCallback callback); + void loadTextureAsync(const std::string &filepath, TextureFormat format, + TextureLoadCallback callback); /// 加载纹理并生成Alpha遮罩(用于不规则形状图片) Ptr loadTextureWithAlphaMask(const std::string &filepath); @@ -146,7 +150,8 @@ public: /// @param filepath 文件路径 /// @param encoding 文件编码(默认 UTF-8) /// @return 文件内容字符串 - std::string loadTextFile(const std::string &filepath, const std::string &encoding); + std::string loadTextFile(const std::string &filepath, + const std::string &encoding); /// 通过key获取已缓存的文本内容 std::string getTextFile(const std::string &key) const; @@ -249,16 +254,18 @@ private: // 生成字体缓存key std::string makeFontKey(const std::string &filepath, int fontSize, bool useSDF) const; - + // 内部加载实现 - Ptr loadTextureInternal(const std::string &filepath, TextureFormat format); - + Ptr loadTextureInternal(const std::string &filepath, + TextureFormat format); + // 选择最佳纹理格式 TextureFormat selectBestFormat(TextureFormat requested) const; - + // 压缩纹理数据 - std::vector compressTexture(const uint8_t* data, int width, int height, - int channels, TextureFormat format); + std::vector compressTexture(const uint8_t *data, int width, + int height, int channels, + TextureFormat format); // 互斥锁保护缓存 mutable std::mutex textureMutex_; @@ -268,8 +275,8 @@ private: mutable std::mutex jsonFileMutex_; // 资源缓存 - 使用弱指针实现自动清理 - std::unordered_map> fontCache_; - std::unordered_map> soundCache_; + std::unordered_map> fontCache_; + std::unordered_map> soundCache_; // 文本文件缓存 - 使用强引用(字符串值类型) std::unordered_map textFileCache_; @@ -282,31 +289,31 @@ private: // LRU链表节点 struct LRUNode { std::string key; - uint32_t prev = 0; // 数组索引,0表示无效 - uint32_t next = 0; // 数组索引,0表示无效 + uint32_t prev = 0; // 数组索引,0表示无效 + uint32_t next = 0; // 数组索引,0表示无效 bool valid = false; }; // 纹理缓存配置 - size_t maxCacheSize_ = 64 * 1024 * 1024; // 最大缓存大小 (64MB) - size_t maxTextureCount_ = 256; // 最大纹理数量 - float unloadInterval_ = 30.0f; // 自动清理间隔 (秒) + size_t maxCacheSize_ = 64 * 1024 * 1024; // 最大缓存大小 (64MB) + size_t maxTextureCount_ = 256; // 最大纹理数量 + float unloadInterval_ = 30.0f; // 自动清理间隔 (秒) // 纹理缓存 - 使用强指针保持引用 std::unordered_map textureCache_; // 侵入式LRU链表 - 使用数组索引代替指针,提高缓存局部性 std::vector lruNodes_; - uint32_t lruHead_ = 0; // 最近使用 - uint32_t lruTail_ = 0; // 最久未使用 - uint32_t freeList_ = 0; // 空闲节点链表 + uint32_t lruHead_ = 0; // 最近使用 + uint32_t lruTail_ = 0; // 最久未使用 + uint32_t freeList_ = 0; // 空闲节点链表 // 统计 size_t totalTextureSize_ = 0; uint64_t textureHitCount_ = 0; uint64_t textureMissCount_ = 0; float autoUnloadTimer_ = 0.0f; - + // 异步加载相关 struct AsyncLoadTask { std::string filepath; @@ -314,14 +321,14 @@ private: TextureLoadCallback callback; std::promise> promise; }; - + std::queue asyncTaskQueue_; std::mutex asyncQueueMutex_; std::condition_variable asyncCondition_; std::unique_ptr asyncThread_; std::atomic asyncRunning_{false}; std::atomic pendingAsyncLoads_{0}; - + void asyncLoadLoop(); // ============================================================================ diff --git a/Extra2D/include/extra2d/scene/node.h b/Extra2D/include/extra2d/scene/node.h index 8924e12..be426e5 100644 --- a/Extra2D/include/extra2d/scene/node.h +++ b/Extra2D/include/extra2d/scene/node.h @@ -80,7 +80,7 @@ public: * @brief 设置颜色 * @param color RGB颜色 */ - void setColor(const Color3B& color); + void setColor(const Color3B &color); Color3B getColor() const { return color_; } /** @@ -163,7 +163,7 @@ public: * @param action 动作指针(所有权转移) * @return 动作指针 */ - Action* runAction(Action* action); + Action *runAction(Action *action); /** * @brief 停止所有动作 @@ -174,7 +174,7 @@ public: * @brief 停止指定动作 * @param action 动作指针 */ - void stopAction(Action* action); + void stopAction(Action *action); /** * @brief 根据标签停止动作 @@ -193,7 +193,7 @@ public: * @param tag 标签值 * @return 动作指针,未找到返回 nullptr */ - Action* getActionByTag(int tag); + Action *getActionByTag(int tag); /** * @brief 获取运行中的动作数量 @@ -243,62 +243,62 @@ protected: private: // ========================================================================== // 成员变量按类型大小降序排列,减少内存对齐填充 - // 64位系统对齐:std::string(32) > glm::mat4(64) > std::vector(24) > + // 64位系统对齐:std::string(32) > glm::mat4(64) > std::vector(24) > // double(8) > float(4) > int(4) > bool(1) // ========================================================================== // 1. 大块内存(64字节) - mutable glm::mat4 localTransform_; // 64 bytes - mutable glm::mat4 worldTransform_; // 64 bytes + mutable glm::mat4 localTransform_; // 64 bytes + mutable glm::mat4 worldTransform_; // 64 bytes // 2. 字符串和容器(24-32字节) - std::string name_; // 32 bytes - std::vector> children_; // 24 bytes + std::string name_; // 32 bytes + std::vector> children_; // 24 bytes // 3. 子节点索引(加速查找) - std::unordered_map> nameIndex_; // 56 bytes - std::unordered_map> tagIndex_; // 56 bytes + std::unordered_map> nameIndex_; // 56 bytes + std::unordered_map> tagIndex_; // 56 bytes // 4. 事件分发器 - EventDispatcher eventDispatcher_; // 大小取决于实现 + EventDispatcher eventDispatcher_; // 大小取决于实现 // 5. 父节点引用 - WeakPtr parent_; // 16 bytes + Weak parent_; // 16 bytes // 7. 变换属性(按访问频率分组) - Vec2 position_ = Vec2::Zero(); // 8 bytes - Vec2 scale_ = Vec2(1.0f, 1.0f); // 8 bytes - Vec2 anchor_ = Vec2(0.5f, 0.5f); // 8 bytes - Vec2 skew_ = Vec2::Zero(); // 8 bytes + Vec2 position_ = Vec2::Zero(); // 8 bytes + Vec2 scale_ = Vec2(1.0f, 1.0f); // 8 bytes + Vec2 anchor_ = Vec2(0.5f, 0.5f); // 8 bytes + Vec2 skew_ = Vec2::Zero(); // 8 bytes // 8. 边界框(用于空间索引) - Rect lastSpatialBounds_; // 16 bytes + Rect lastSpatialBounds_; // 16 bytes // 9. 浮点属性 - float rotation_ = 0.0f; // 4 bytes - float opacity_ = 1.0f; // 4 bytes + float rotation_ = 0.0f; // 4 bytes + float opacity_ = 1.0f; // 4 bytes // 10. 颜色属性 Color3B color_ = Color3B(255, 255, 255); // 3 bytes // 11. 整数属性 - int zOrder_ = 0; // 4 bytes - int tag_ = -1; // 4 bytes + int zOrder_ = 0; // 4 bytes + int tag_ = -1; // 4 bytes // 12. 布尔属性 - bool flipX_ = false; // 1 byte - bool flipY_ = false; // 1 byte + bool flipX_ = false; // 1 byte + bool flipY_ = false; // 1 byte // 11. 场景指针 - Scene *scene_ = nullptr; // 8 bytes + Scene *scene_ = nullptr; // 8 bytes // 12. 布尔标志(打包在一起) - mutable bool transformDirty_ = true; // 1 byte - mutable bool worldTransformDirty_ = true; // 1 byte - bool childrenOrderDirty_ = false; // 1 byte - bool visible_ = true; // 1 byte - bool running_ = false; // 1 byte - bool spatialIndexed_ = true; // 1 byte + mutable bool transformDirty_ = true; // 1 byte + mutable bool worldTransformDirty_ = true; // 1 byte + bool childrenOrderDirty_ = false; // 1 byte + bool visible_ = true; // 1 byte + bool running_ = false; // 1 byte + bool spatialIndexed_ = true; // 1 byte // 填充 2 bytes 到 8 字节对齐 }; diff --git a/Extra2D/include/extra2d/utils/data.h b/Extra2D/include/extra2d/utils/data.h index 212400b..2f2ce1a 100644 --- a/Extra2D/include/extra2d/utils/data.h +++ b/Extra2D/include/extra2d/utils/data.h @@ -202,7 +202,7 @@ public: private: class Impl; - UniquePtr impl_; + Unique impl_; std::string filename_; std::string mountName_; UserId defaultUserId_; diff --git a/Extra2D/include/extra2d/window/window.h b/Extra2D/include/extra2d/window/window.h index 2e13314..758c09b 100644 --- a/Extra2D/include/extra2d/window/window.h +++ b/Extra2D/include/extra2d/window/window.h @@ -1,10 +1,11 @@ #pragma once -#include -#include #include +#include +#include #include + #include namespace extra2d { @@ -12,57 +13,57 @@ namespace extra2d { class Input; struct WindowConfig { - std::string title = "Extra2D Application"; - int width = 1280; - int height = 720; - bool fullscreen = true; - bool resizable = false; - bool vsync = true; - int msaaSamples = 0; - bool centerWindow = true; + std::string title = "Extra2D Application"; + int width = 1280; + int height = 720; + bool fullscreen = true; + bool resizable = false; + bool vsync = true; + int msaaSamples = 0; + bool centerWindow = true; }; class Window { public: - Window(); - ~Window(); + Window(); + ~Window(); - bool create(const WindowConfig& config); - void destroy(); + bool create(const WindowConfig &config); + void destroy(); - void pollEvents(); - void swapBuffers(); - bool shouldClose() const; - void setShouldClose(bool close); + void pollEvents(); + void swapBuffers(); + bool shouldClose() const; + void setShouldClose(bool close); - void setTitle(const std::string& title); - void setSize(int width, int height); - void setFullscreen(bool fullscreen); - void setVSync(bool enabled); + void setTitle(const std::string &title); + void setSize(int width, int height); + void setFullscreen(bool fullscreen); + void setVSync(bool enabled); - int getWidth() const { return width_; } - int getHeight() const { return height_; } - bool isFullscreen() const { return fullscreen_; } - bool isVSync() const { return vsync_; } + int getWidth() const { return width_; } + int getHeight() const { return height_; } + bool isFullscreen() const { return fullscreen_; } + bool isVSync() const { return vsync_; } - SDL_Window* getSDLWindow() const { return sdlWindow_; } - SDL_GLContext getGLContext() const { return glContext_; } + SDL_Window *getSDLWindow() const { return sdlWindow_; } + SDL_GLContext getGLContext() const { return glContext_; } - Input* getInput() const { return input_.get(); } + Input *getInput() const { return input_.get(); } private: - SDL_Window* sdlWindow_; - SDL_GLContext glContext_; + SDL_Window *sdlWindow_; + SDL_GLContext glContext_; - int width_; - int height_; - bool vsync_; - bool shouldClose_; - bool fullscreen_; - UniquePtr input_; + int width_; + int height_; + bool vsync_; + bool shouldClose_; + bool fullscreen_; + Unique input_; - bool initSDL(const WindowConfig& config); - void deinitSDL(); + bool initSDL(const WindowConfig &config); + void deinitSDL(); }; } // namespace extra2d diff --git a/README.md b/README.md index 2deb948..3814b99 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ mindmap 颜色 Color 大小 Size 类型系统 - 智能指针 Ptr/UniquePtr + 智能指针 Ptr/Unique 字符串 String 平台抽象层 窗口管理 Window