乐于分享
好东西不私藏

智能座舱3D HMI:设计服务化渲染-安卓端

智能座舱3D HMI:设计服务化渲染-安卓端

服务化渲染的文章,之前第一篇介绍了 Surface 怎么跨进程上屏;第二篇讲过 URAS 怎么启用、接入和交付。然而,如果你还在用国际版的 Unity或者其他3D引擎,想要自己实现一套服务化渲染,那么从零设计这套架构需要实现什么呢?

本文聚焦 服务化渲染 框架本身的设计,包括客户端怎么持有 Surface、Service 端怎么登记并驱动引擎、3D 引擎厂商提供的 Player/Engine 边界在哪里等等。


引言

如果要自己设计一套 RAS,我们可以先根据对服务化流程的理解,拆解出不同的角色:

角色
职责
备注
View
客户端 UI 容器,产出 Surface
不跑引擎、不持有 .so
Display
引擎内的逻辑渲染目标(displayIndex)
3D引擎内的实现
Monitor
逻辑 Display 到物理输出端的映射
这个角色可有可无,根据多客户端并行情况决定。
Player
根据3D引擎进行封装的播放器
一般引擎的so包提供
Engine
原生运行时(.so),引擎的运行本体
最底层

一、整体拓扑

服务化渲染的进程模型是:一个 Service 进程跑引擎,多个 Client 进程消费画面

无论 Unity 还是 Unreal,Surface 都是跨进程传递的渲染载体。

  • Client 的 RASSurface 拿到 Surface
  • 经 RASClient 跨进程交给 Service 的 ViewRegistry
  • 登记到某个 Display
  • EngineBridge 调引擎 Player
  • Engine 往 Surface 里 queueBuffer。

二、客户端

2.1 View 和 Surface

引擎的输入输出是 Surface,Surface 来自 SurfaceView 或 TextureView 的生命周期回调。

职责
RASView
容器:选 SurfaceView / TextureView,管布局与 Display 切换
RASSurface
Surface 生命周期:创建/销毁/尺寸变化时同步给 Service
RASClient
连接 Service:bind、AIDL 代理、消息缓存、S2C 回调

RASView 只持有 RASSurface 并响应 UI 事件。

RASSurface 只负责 Surface 可用时通知 Service、失效时注销。

2.2 RASView

示例代码:

publicclassRASViewextendsFrameLayout{
publicenum ViewType { SurfaceView, TextureView }

private RASSurface mSurface;
privateint mDisplayIndex = 1;
private ViewType mViewType = ViewType.TextureView;

publicvoidinit(RASClient client, int displayIndex, ViewType type){
        mDisplayIndex = displayIndex;
        mViewType = type;
        mSurface = new RASSurface(client, displayIndex, this);
        recreateInnerView(type);
    }

publicvoidchangeDisplay(int newDisplayIndex){
        mSurface.unregisterFromService();
        mDisplayIndex = newDisplayIndex;
        mSurface.setDisplayIndex(newDisplayIndex);
        mSurface.syncToService();
    }

publicvoidrecreateByType(ViewType type){
        mSurface.unregisterFromService();
        removeAllViews();
        recreateInnerView(type);
        mSurface.reattachToNewHolder();
    }
}
  • displayIndex 在 View 层只是关于我要往引擎哪个逻辑 Display 画的声明,真正登记在 Service 端完成。
  • 切换 View 类型必须先 unregister 旧 Surface,再挂新 Holder,否则 Service 端会持有已失效的 Surface 引用,表现为黑屏或 EGL bad surface。

2.3 RASSurface

它实现 SurfaceHolder.Callback(SurfaceView)或监听 SurfaceTextureListener(TextureView),在回调里调用 Service:

publicclassRASSurfaceimplementsSurfaceHolder.Callback{
privatefinal RASClient mClient;
privateint mDisplayIndex;
privateint mViewToken;  // View 实例标识,对应 URAS 的 viewHashCode

voidsyncToService(){
        Surface surface = obtainValidSurface();
if (surface == null || !surface.isValid()) return;
        mClient.registerView(mViewToken, mDisplayIndex, surface, mFrameInterval);
    }

@Override
publicvoidsurfaceDestroyed(SurfaceHolder holder){
        mClient.unregisterView(mViewToken, mDisplayIndex);
// 可选:触发末帧保留(PersistentSurface)
    }

@Override
publicvoidsurfaceChanged(SurfaceHolder holder, int format, int w, int h){
        mClient.updateResolution(mViewToken, mDisplayIndex, w, h);
    }
}

viewToken:同一 App 里可能有多个 RASView(例如桌面一块、设置页一块)。Service 端用 (pkgName, viewToken, displayIndex) 的组合来区分。

2.4 RASClient

Client 侧不需要知道 Player 和 Engine,职责是:

  1. ensureStarted() — 启动并 bind 前台 Service
  2. registerS2CCallback() — 注册 Service→Client 回调
  3. 把 RASSurface 的 register/unregister/update 转发为 AIDL 调用
  4. 断线缓存与重连
/**
 * Client 侧总线:bind Service、持有 C2S 代理、注册 S2C、转发 Surface 操作。
 * 对应 URAS:TuanjieRenderService
 */
public final class RASClient implements ServiceConnection {
//....
      @Override
    public void onServiceConnected(ComponentName name, IBinder binder) {
        mC2S = IC2SMessenger.Stub.asInterface(binder);
        mC2S.c2sRegisterS2CMessenger(mClientPkg, mS2CStub);  // ① 注册 S2C
        flushPendingCalls();                                // ② 刷缓存
        notifyCallbacksConnected();                         // ③ 通知 RASView 可 sync
    }
    public void registerView(int viewToken, int displayIndex, Surface surface, int interval) {
if (mC2S == null) { enqueue(/* c2sRegisterViewToDisplay */); return; }
        mC2S.c2sRegisterViewToDisplay(mClientPkg, viewToken, displayIndex, surface, interval);
    }
}

三、服务端

3.1 Display

概念
含义
谁创建
引擎 Display
引擎内部的逻辑渲染目标,多Camra渲染用 displayIndex 索引
引擎启动时存在 Display 0(主目标);Client 注册从 index ≥ 1 开始
Android Display
物理屏幕或 VirtualDisplay
系统 DisplayManager
RAS DisplaySlot
Service 端对一个引擎 Display 当前被谁占用的登记项
你的 DisplayRegistry

我们创建的这个逻辑Display的 DisplaySlot 示意代码:

/** 引擎内一个逻辑 Display 的 Service 端状态 */
publicclassDisplaySlot{
publicfinalint displayIndex;
public String ownerPkg;
publicint ownerViewToken;
public Surface boundSurface;      // 可能为 null(无人消费)
publicint frameInterval = 1;
public IS2CCallback ownerCallback;
}

View 与 Display 的关系

  • 一个 RASView(客户端)声明 我要 displayIndex = 2的画面。
  • 服务端的 ViewRegistry 收到 register 后,在 DisplayRegistry 里找到 DisplaySlot(2),写入 ownerPkg / ownerViewToken / boundSurface
  • 同一 displayIndex 同一时刻只有一个 owner,规则为后注册覆盖先注册,并且需要通知前者。

3.2 ViewRegistry

ViewRegistry 是 服务端最核心的业务类,职责是:

职责
说明
登记 / 注销
维护 (pkg, viewToken, displayIndex) → Surface
抢占处理
同 displayIndex 新注册替换旧 owner,发 S2C 通知
死亡清理
DeathRecipient
:Client 进程 crash 时释放其占用的 DisplaySlot
串行入口
所有方法由 IPCGateway 派发到 Service 单线程执行
驱动引擎
登记成功后调 EngineBridge.registerSurface(...)
publicclassViewRegistry{
privatefinal DisplayRegistry mDisplays;
privatefinal EngineBridge mEngine;

voidregisterView(String pkg, int viewToken, int displayIndex,
                      Surface surface, int frameInterval, IS2CCallback s2c)
{
        DisplaySlot slot = mDisplays.slotFor(displayIndex);

if (slot.hasOwner() && !slot.isOwner(pkg, viewToken)) {
            notifyDisplayTakenOver(slot, pkg, viewToken);
        }

        slot.bind(pkg, viewToken, surface, frameInterval, s2c);
        mEngine.registerSurface(displayIndex, surface, /* w, h from slot */);

        s2c.onStartRenderView(viewToken, displayIndex);
    }

voidunregisterView(String pkg, int viewToken, int displayIndex){
        DisplaySlot slot = mDisplays.slotFor(displayIndex);
if (!slot.isOwner(pkg, viewToken)) return;

        slot.unbind();
        mEngine.unregisterSurface(displayIndex);
// 关键:Detach 不 Pause 引擎(见 §3.5)
    }
}

3.3 Monitor

Monitor 不是必须的,需要 Monitor 的场景:一个引擎 Display 要投到 副驾屏、后排屏 或 其他屏体。此时 Monitor 负责维护这个物理屏链路的信息。

/** 物理输出端抽象——不是引擎概念,是 HMI 部署概念 */
publicenum MonitorId {
    MAIN,           // 中控屏 Activity 内嵌
    COPILOT,        // 副驾 android.view.Display
    REAR,           // 后排
    CLUSTER_BRIDGE  // 经 VirtualDisplay / LVDS 到仪表(系列第一篇 §四)
}

publicclassMonitorRegistry{
/** displayIndex → 默认 Monitor;可被 AppView / Presentation 覆盖 */
voidbindDisplayToMonitor(int displayIndex, MonitorId monitor, int androidDisplayId){ ... }
}

3.4 IPCGateway

IPCGateway只做路由,不做渲染业务:

publicclassIPCGatewayextendsIC2S.Stub{
privatefinal Handler mServiceThread;
privatefinal ViewRegistry mViews;

@Override
publicvoidc2sRegisterViewToDisplay(...){
        runOrdered(() -> mViews.registerView(...));
    }

privatevoidrunOrdered(Runnable task){
if (Looper.myLooper() == mServiceThread.getLooper()) {
            task.run();
        } else {
            mServiceThread.post(task);
        }
    }
}

串行调用:register/unregister、binderDied、pause/resume 引擎,否则可能闪黑。

3.5 生命周期

Surface 的 attach/detach 是窗口换绑,不是应用进后台。

事件
错误做法
正确做法
Client unregister Surface
Engine.pause()
仅 unregisterSurface(displayIndex)
最后一个 Client unbind
视配置而定
autoPause=true
 时才 pause 引擎
Client Activity onPause
映射到引擎 pause
不映射
(URAS SDK 对 Activity pause 无操作)

ViewRegistry.unregisterView 里 不要 因为某个 Client 切走就 pause 整个引擎——否则其他 Client 的 Display 会一起停画。


四、Player 与 Engine

4.1 类名理解

Player
Engine
是什么
引擎厂商提供的 Java/JNI 壳
原生运行时(libunity.so / libUnreal.so 等)
维护
引擎 JAR(unity-classes.jar、UE GameActivity)
引擎 SO + 你的游戏/场景 SO

Player 是引擎的 Android 前台接待;Engine 是真正干活的渲染车间。

4.2 EngineBridge

EngineBridge 是引擎适配层, RAS 框架与具体引擎之间的接缝。

publicinterfaceEngineBridge{
/** Service 启动时:引擎 init 必须有 Surface,可用 1×1 占位 Surface */
voidensureEngineStarted(Surface placeholderSurface);

/** Client Surface 注册到指定 displayIndex */
voidregisterSurface(int displayIndex, Surface surface, int width, int height);

/** Client Surface 注销 */
voidunregisterSurface(int displayIndex);

/** 分辨率 / 帧间隔变更 */
voidupdateSurfaceSize(int displayIndex, int width, int height);
voidsetFrameInterval(int displayIndex, int interval);

/** 业务消息转发(可选) */
voidsendMessage(String objectName, String methodName, String payload);

/** 全局 pause/resume(无 Client 或显式调用时) */
voidpauseEngine();
voidresumeEngine();

booleanisEngineReady();
}

4.3 RenderService

RenderService 就是服务端的Service本身,管理 IPCGateway、ViewRegistry 和 EngineBridge:

publicclassRenderServiceextendsService{
private IPCGateway mGateway;
private ViewRegistry mViewRegistry;
private EngineBridge mEngine;

@Override
publicvoidonCreate(){
        startForeground(/* 车机杀进程策略 */);
        mEngine = EngineBridgeFactory.create(this);
        mViewRegistry = new ViewRegistry(new DisplayRegistry(), mEngine);
        mGateway = new IPCGateway(mViewRegistry, mEngine);

        Surface placeholder = createPlaceholderSurface(); // 1×1 SurfaceTexture
        mEngine.ensureEngineStarted(placeholder);
    }

@Override
public IBinder onBind(Intent intent){
return mGateway;
    }
}

五、脚本部署

落地到具体工程文件,推荐部署方案是:

your-ras/
├── render-service/          → 打成 engine-service.aar(或整包 Service APK)
│   ├── RenderService / IPCGateway / ViewRegistry / EngineBridge
│   ├── Player + lib*.so(引擎产物)
│   └── AndroidManifest: 前台 Service 声明

├── render-client-sdk/       → 打成 render-client.aar
│   ├── RASClient / RASView / RASSurface
│   └── AIDL 接口(与 Service 共享同一份 .aidl)

└── launcher/                → 可选 Demo APK
    └── 验证 bind + 单屏渲染

部署模式

模式
Service
Client
跨进程(量产)
独立 APK(如 com.oem.render3d),系统 UID 或 priv-app
业务 App 只依赖 render-client.aarinit(ctx, servicePkg)
同进程(调试)
与 App 同 APK
render-client
 + render-service 同模块;

结语

这里并没有描述引擎端对接 Surface 的部分,因为不同引擎目前在安卓代码上已有的能力不同,比如 Unity 自带注册 Surface 和 displayIndex 的native方法,而 Unreal 却没有这个接口。至于 Godot我也还没有去找。后续计划专门针对自研服务化渲染的引擎部分写一篇。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-04 12:43:50 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/707121.html
  2. 运行时间 : 0.271529s [ 吞吐率:3.68req/s ] 内存消耗:4,750.72kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=641cfd7dfa92e2b9d2ab3984f498a96e
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000967s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001154s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.011307s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.005220s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001149s ]
  6. SELECT * FROM `set` [ RunTime:0.014706s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001300s ]
  8. SELECT * FROM `article` WHERE `id` = 707121 LIMIT 1 [ RunTime:0.020581s ]
  9. UPDATE `article` SET `lasttime` = 1780548230 WHERE `id` = 707121 [ RunTime:0.038861s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.003776s ]
  11. SELECT * FROM `article` WHERE `id` < 707121 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.009012s ]
  12. SELECT * FROM `article` WHERE `id` > 707121 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.019893s ]
  13. SELECT * FROM `article` WHERE `id` < 707121 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001842s ]
  14. SELECT * FROM `article` WHERE `id` < 707121 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001965s ]
  15. SELECT * FROM `article` WHERE `id` < 707121 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001539s ]
0.274414s