void SurfaceFlinger::setDesiredActiveMode(const ActiveModeInfo& info) { ATRACE_CALL(); if (!info.mode) { ALOGW("requested display mode is null"); return; } auto display = getDisplayDeviceLocked(info.mode->getPhysicalDisplayId()); if (!display) { ALOGW("%s: display is no longer valid", __func__); return; }其中!dispaly和!info.mode的意思什么?为什么不直接用dispaly和info.mode判断?
时间: 2024-03-28 13:36:48 浏览: 160
在这段代码中,"!"符号表示逻辑非,即将一个为真的条件变为假,将一个为假的条件变为真。所以, "!display" 的意思是如果 `display` 为空指针,则条件为真。同样的, "!info.mode" 的意思是如果 `info.mode` 为空指针,则条件为真。
在这段代码中,如果 `display` 或 `info.mode` 为空,则会打印警告信息并返回。使用逻辑非来判断这些条件是否为空,是为了避免空指针引用错误,因为如果我们尝试使用空指针来访问对象或成员,程序就会崩溃。
相关问题
Android中的函数void SurfaceFlinger::setDesiredActiveMode(const ActiveModeInfo& info)作用是什么?
函数void SurfaceFlinger::setDesiredActiveMode(const ActiveModeInfo& info)的作用是设置SurfaceFlinger的活动显示模式。其中,ActiveModeInfo包含了所需的显示模式、分辨率、刷新率、像素格式等信息。SurfaceFlinger会根据ActiveModeInfo中的信息,选择最佳的显示模式和分辨率,并将其应用到屏幕上。这个函数在SurfaceFlinger初始化时会被调用,并且在屏幕显示模式变化时也会被调用。
void SurfaceFlinger::syncToDisplayHardware() NO_THREAD_SAFETY_ANALYSIS { ATRACE_CALL(); const uint32_t layerStackId = getDefaultDisplayDeviceLocked()->getLayerStack().id; if (SmomoIntf *smoMo = getSmomoInstance(layerStackId)) { nsecs_t timestamp = 0; bool needResync = smoMo->SyncToDisplay(previousFrameFence().fence, ×tamp); ALOGV("needResync = %d, timestamp = %" PRId64, needResync, timestamp); } }Android中这段代码的作用什么并且逐行分析一下这段代码?
这段代码是 Android 系统中 SurfaceFlinger 的一部分,用于将当前帧同步到显示硬件上。下面是逐行分析:
1. `ATRACE_CALL()`:使用 Atrace 进行跟踪分析。
2. 获取主显示设备的图层栈 ID。
```
const uint32_t layerStackId = getDefaultDisplayDeviceLocked()->getLayerStack().id;
```
3. 如果存在 Smomo 实例,则将当前帧同步到显示硬件上,并获取同步时间戳。
```
if (SmomoIntf *smoMo = getSmomoInstance(layerStackId)) {
nsecs_t timestamp = 0;
bool needResync = smoMo->SyncToDisplay(previousFrameFence().fence, ×tamp);
ALOGV("needResync = %d, timestamp = %" PRId64, needResync, timestamp);
}
```
1. `getSmomoInstance(layerStackId)`:获取指定图层栈 ID 对应的 Smomo 实例。
2. `previousFrameFence().fence`:获取前一帧的同步信号量。
3. `smoMo->SyncToDisplay(previousFrameFence().fence, ×tamp)`:将当前帧同步到显示硬件上,并将同步时间戳存储在 `timestamp` 变量中。
4. `ALOGV("needResync = %d, timestamp = %" PRId64, needResync, timestamp)`:打印同步结果和时间戳。
阅读全文