Skip to content

README.md 描述的 drcqOut_.consume() 函数逻辑和实际调用不一致 #1

@MojoisMojo

Description

@MojoisMojo

描述

我发现 README.md 中关于 drcqOut_.consume() 函数的描述与实际代码逻辑存在不一致。这可能导致读者对项目的有序提交(in-order commit)和 AABB 检查逻辑产生误解。


具体不一致之处:

README.md 中有如下描述:

In-order commit also takes place at the `void RenderWorkerPool::renderAll(...)` function. ... The core chain and AABB checking logic is in `drcqOut_.consume()`; which then calls `bool DrawResource::canCollect(uint32_t currTaskDone, DrawTaskList *drawTaskList)`.

然而,在 Spars 项目的 drcqOut_.consume() 函数的最新实现中,并未调用 bool DrawResource::canCollect(...) 函数。该函数在 Spars/prf/app/src/main/cpp/engine2d/DrawResource.cpp 中似乎已被注释或移除。


实际代码逻辑:

drcqOut_.consume() 函数当前采用的是一段内联的 AABB 检查和任务收集逻辑。以下是相关的代码片段:

            // 有后续已渲染完成任务,可以考虑提前。在已经堆积太多时不考虑
            uint32_t taskRendered = taskRendered_.load();
            if (taskRendered > priorityReturned_ && taskRendered <= priorityReturned_ + MAX_COLLECT_REORDER) {
                std::vector<Rect> bbxs; // 所有需要检查的bbx
                for (uint32_t i = priorityReturned_; i < priorityReturned_ + MAX_COLLECT_REORDER; i++) {
                    // 提前失败
                    if (i >= drawTaskList_->getTaskNum()) {
                        break;
                    }

                    DrawResourceStatus curr = statusList_[i].load();

                    // 试图让该节点提前收集
                    if (curr == DrawResourceStatus::RENDERED) {
                        bool canCollectNow = true;
                        for(Rect bbx : bbxs) {
                            if (isOverlap(bbx, drawTaskList_->getDrawTask(i)->boundingBox_)) {
                                canCollectNow = false;
                                break; // 一旦有重叠就不能提前收集
                            }
                        }
                        // 可以提前
                        if (canCollectNow) {
                            statusList_[i].store(DrawResourceStatus::COLLECTED);
                            return drawResourceQueue_[i]; // 不必去管priorityReturned_
                        } else {
                            break; // 提前失败
                        }
                    }
                    // 这是个需要被检查的bbx
                    else {
                        bbxs.push_back(drawTaskList_->getDrawTask(i)->boundingBox_);
                    }
                }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions