我刚才一直在看角色控制器的文档和API,整得我有点蒙了,现在只能临时解决了,办法是监听Stay,然后加一个flag标志,只在第一次Stay触发时有效,当做是Enter触发
可以参考这个解决方案:onControllerTriggerEnter can not be triggered · Issue #17615 · cocos/cocos-engine · GitHub
mask.on( NodeEventType.TOUCH_START , (event:EventTouch)=>
{
const pos = event.getLocation()
// 先加上 event.windowId 参数绕过这个问题吧。
const hit = icon.getComponent(UITransform).hitTest( pos, event.windowId )
if( hit )
{
log("点中了")
}
正常构建和只构建Bundle同一个项目出来的结果不一样,正常构建的项目优先级低的bundle中不会再注册同一个类型,但是选项为只构建Bundle的时候优先级低的bundle会把使用到优先级高Bundle中使用的脚本再注册一次,这样在热更单独bundle时候classid会不一致,获取组件也会有问题,这个有计划处理吗?还是我的使用方法有问题?能否保持让只构建Bundle和正常构建的结果保持一致呢?下图是只构建Bundle出来的结果,ModuleSubsystem.ts脚本在main中被注册了,而后又在hall这个bundle中又注册了一次
这样会影响到帧率?在安卓原生测试时,present耗时40+ms,在web上耗时不到1ms,有点疑惑
因为 web 和小游戏平台上,真实的 present 行为是浏览器或小游戏自己处理的,引擎里面封装的 gfx.Device.preset 只是复位一些状态,实际上并没有做 present
的行为,平台也没有暴露 present 的方法,所以基本不耗时。而原生上是有 swapBuffer (内部会等待 GPU 执行完成和垂直同步)。
所以左下角调试信息中,在 web 平台上 present 的数值是无意义的。
public present (): void {
const queue = (this._queue as WebGLQueue);
this._numDrawCalls = queue.numDrawCalls;
this._numInstances = queue.numInstances;
this._numTris = queue.numTris;
queue.clear();
}
那在项目中渲染数据比较少(不能删减),present耗时比较高时,有什么优化方案么?
原生平台上,present 耗时高,很大概率是因为 GPU 渲染压力大,这个还需要具体情况具体分析,可以用 snapdragon、renderdoc 等抓帧工具,排查一下每帧的 Graphic API 的调用情况,snapdragon 还能够更细化的分析具体的瓶颈点在哪里。
引擎组是否能考虑, 就是当有多个摄像机的时候, 有 2d, 3d 等其他的摄像机存在, 这个时候存在一个层级问题, 就比如有些需要显示在3d 上层, 有些需要显示在3d 下层, 对于一些 2d 项目处理起来有点不太好, 是否能让摄像机也服从场景节点树深度显示,而不是需要调整各个摄像机的渲染顺序,这种情况就需要多加个摄像机
或者有什么更好的处理方式也可以
这个射线检测问题解决了,可以更新第三方库:https://github.com/cocos/cocos-engine-external/pull/459 。
如果对原因感兴趣的话可以看:PhysicsSystem.raycastClosest() can not work correctly in bullet · Issue #17629 · cocos/cocos-engine · GitHub
深度那边把less改成always,这时候渲染层就会根据画家算法,不过得在引擎得管线把排序得相关逻辑注释掉,要完全达到你得要求有点难,因为3d项目你最后还是得深度测试,而且不排序,对性能有很大影响,这个需求我们内部会讨论下哈
改了。谢谢。
好的,感谢回复
嗯嗯,好的,感谢
不客气,我也是读着不太通顺顺便提一嘴