小编Bro*_*ek3的帖子

在 opengl 缓冲区上创建一个池有意义吗?

假设一个场景最多可以有 1024 个点光源。通常情况下会更少,但最坏的情况是 1024。它们将在一段时间内或在某个操作之后动态添加和删除。

1024 * sizeof(PointLight)分配一个 size 的统一缓冲区,在开头映射缓冲区并对其进行池化是否有意义?或者更好的想法是创建一个 CPU 侧池,然后使用glNamedBufferSubData每一帧将 CPU 侧数据提交到缓冲区?

像这样的事情非常简单,没有考虑统一的缓冲区对齐,因为它与问题无关。

template<typename T, size_t MAX_SIZE>
    struct GPUPool
    {
        GPUPool()
        {
            glCreateBuffers(1, &ubo);
            glNamedBufferStorage(ubo, MAX_SIZE * sizeof(T), nullptr, GL_MAP_WRITE_BIT | GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT);
            memory = (T*)glMapNamedBufferRange(ubo, 0, MAX_SIZE * sizeof(T), GL_MAP_WRITE_BIT | GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT);
        }

        ~GPUPool()
        {
            glDeleteBuffers(1, &ubo);
        }

        [[nodiscard]] inline uint32_t insert(const T& element)
        {
            if (!freeIndexes.empty()) {
                auto index = freeIndexes.back();
                freeIndexes.pop_back();

                memcpy(add(memory, index), &element, sizeof(element));

                ++size;

                return index;
            }

            memcpy(add(memory, …
Run Code Online (Sandbox Code Playgroud)

c++ memory opengl

5
推荐指数
0
解决办法
203
查看次数

标签 统计

c++ ×1

memory ×1

opengl ×1