• godot引擎学习4


    基本数据结构
    1, SafeNumeric 安全数值类 原子操作
    2,  SafeRefCount 引用计数类,组合SafeNumeric类
    3,mutable变量的值 ,某个常成员函数的调用次数时
    4, next_power_of_2返回大于,并且是2的次幂,如输入17,返回32
    5,CowData 一个数组, 写时复制(copy-on-write),
        指针前一个位置放大小,
        前二个位置存放引用计数,采用定位分配空间   new(args) T
       主要成员:
            Error resize(int p_size);
            Error insert(int p_pos, const T &p_val)
            T *ptrw()
            const T *ptr()
    6 ,  CharProxy,Char16String,CharString,String类,主要是组合CowData
         特殊成员函数
          float String::similarity(const String &p_string) const 相似度
          uint32_t hash() const; /* hash the string */
          uint64_t hash64() const; /* hash the string */
          String md5_text() const;
          String sha1_text() const;
         String sha256_text() const; 
         xml特殊字符处理
         路径判断等
    7,List<>,Vector<>,Map<>,Set<>红黑树
         RingBuffer<>环形缓冲区
         ThreadWorkPool线程池
    8, 
          alignas关键字用来设置内存中对齐方式,最小是8字节对齐,可以是16,32,64,128等。
         Variant可变数据类型,有原子类型,数学类型,混合类型,数组类型
         主要数据成员
         union {
            bool _bool;
            int64_t _int;
            double _float;
            Transform2D *_transform2d;
            ::AABB *_aabb;
            Basis *_basis;
            Transform3D *_transform3d;
            PackedArrayRefBase *packed_array;
            void *_ptr; //generic pointer
            uint8_t _mem[sizeof(ObjData) > (sizeof(real_t) * 4) ? sizeof(ObjData) : (sizeof(real_t) * 4)]{ 0 };    //字符串及其他类型
        } _data alignas(8);
    9,基本函数
        CLAMP(m_a, m_min, m_max),如果小于最小值,返回最小值,如果大于最大值,返回最大值,否则返返回自己
       
    10,SceneTree *sml = Object::cast_to(main_loop);
    return dynamic_cast(p_object);
    dynamic_cast 用于在类的继承层次之间进行类型转换,它既允许向上转型(Upcasting),也允许向下转型(Downcasting)。向上转型是无条件的,不会进行任何检测,所以都能成功;向下转型的前提必须是安全的,要借助 RTTI 进行检测,所有只有一部分能成功。
    向上转型时,只要待转换的两个类型之间存在继承关系,并且基类包含了虚函数(这些信息在编译期间就能确定),就一定能转换成功。因为向上转型始终是安全的,所以 dynamic_cast 不会进行任何运行期间的检查,这个时候的 dynamic_cast 和 static_cast 就没有什么区别了。
    向下转型是有风险的,dynamic_cast 会借助 RTTI 信息进行检测,确定安全的才能转换成功,否则就转换失败。

    系统相关类
       1, Memory内存分配, DefaultAllocator分配器
       2, (1)、std::mutex:该类表示普通的互斥锁, 不能递归使用。
          其中std::mutex就是lock、unlock。std::lock_guard与std::mutex配合使用,把锁放到lock_guard中时,mutex自动上锁,lock_guard析构时,同时把mutex解锁。mutex又称互斥量。
         (2)、std::timed_mutex:该类表示定时互斥锁,不能递归使用。std::time_mutex比std::mutex多了两个成员函数
         (3)、std::recursive_mutex:该类表示递归互斥锁。
         (4)、std::recursive_timed_mutex:带定时的递归互斥锁。
        MutexImpl<>,MutexLock<>对上面封装
    3, 
          std::shared_mutex用于管理可转移和共享所有权的互斥对象,适用场景比较特殊:一个或多个读线程同时读取共享资源,且只有一个写线程来修改这个资源,这种情况下才能从shared_mutex获取性能优势
         shared_timed_mutex 类是能用于保护数据免受多个线程同时访问的同步原语。与其他促进排他性访问的互斥类型相反,拥有二个层次的访问:
          共享 - 多个线程能共享同一互斥的所有权。
          排他性 - 仅一个线程能占有互斥。
          共享互斥通常用于多个读线程能同时访问同一资源而不导致数据竞争,但只有一个写线程能访问的情形。

         shared_lock是read lock。搭配std::shared_mutex使用,被锁后仍允许其他线程执行同样被shared_lock的代码。
         lock_guard和unique_lock是write lock。被锁后不允许其他线程执行被shared_lock或unique_lock的代码。
         
         typedef std::shared_lock ReadLock;
         typedef std::lock_guard WriteLock;

         RWLock读写锁基类,对shared_timed_mutex 封装, RWLockRead,RWLockWrite

    4, std::condition_variable
          条件变量提供了两类操作:wait和notify。这两类操作构成了多线程同步的基础。
         wait是线程的等待动作,直到其它线程将其唤醒后,才会继续往下执行,是堵塞函数
         notify_one 唤醒等待的一个线程,注意只唤醒一个。
         notify_all 唤醒所有等待的线程。使用该函数时应避免出现惊群效应。
         Semaphore 用于线程同步
        
        自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。
        SpinLock,管理std::atomic_flag locked
    5, Thread类
          Thread::start(Thread::Callback p_callback, void *p_user, const Settings &p_settings)
          {
           std::thread new_thread(&Thread::callback, this, p_settings, p_callback, p_user);
           thread.swap(new_thread);
         }
        调用std::thread thread;

    6,OS类,虚基类
         OS_Windows : public OS 
         主要成员:
         HINSTANCE hInstance;
         MainLoop *main_loop;
         HWND main_window;
         主要函数
         open_dynamic_library
         close_dynamic_library
         get_dynamic_library_symbol_handle
          execute(const String &p_path, const List &p_arguments,
          create_process(const String &p_path, const List &p_arguments
         void Run()
         {
          while (!force_quit) {
            DisplayServer::get_singleton()->process_events(); // get rid of pending events
            if (Main::iteration())
                break;
        };
        }
    7,文件访问类
    class FileAccess 抽象类
    class FileAccessCompressed : public FileAccess
    class FileAccessEncrypted : public FileAccess
    class FileAccessMemory : public FileAccess
    class FileAccessNetwork : public FileAccess
    class FileAccessPack : public FileAccess
    class FileAccessZip : public FileAccess
    class FileAccessUnix : public FileAccess
    class FileAccessWindows : public FileAccess   ACCESS_FILESYSTEM
    class FileAccessAndroid : public FileAccess

    FileAccess *FileAccess::create_for_path(const String &p_path) {

        FileAccess *ret = NULL;
        if (p_path.begins_with("res://")) {

            ret = create(ACCESS_RESOURCES);
        } else if (p_path.begins_with("user://")) {

            ret = create(ACCESS_USERDATA);

        } else {

            ret = create(ACCESS_FILESYSTEM);
        }

        return ret;
    }

    8,各种各样的弹出对话框

    9,新增导出类
    一般在core_bind.h实现

    godot定制开发 QQ  38454348

  • 相关阅读:
    CENTOS安装 graylog4.39
    quarkus数据库篇之四:本地缓存
    【C语言 模拟实现strcmp函数】
    谷粒商城13——订单模块完成、分布式事务应用、RabbitMQ、Seata、电商项目订单场景的分析完善
    配置vue3项目的eslint,Git提交时校验
    分布式事务——分布式事务简介、分布式事务框架 Seata(AT模式、Tcc模式、Tcc Vs AT)、分布式事务—MQ
    spring-boot 依赖注入流程
    Vite快速创建Vue3项目
    Job Scheduling简介
    聊聊 C# 中的 Composite 模式
  • 原文地址:https://blog.csdn.net/wenxinfly/article/details/127804349