请教下作者关于使用的问题 #520
-
你好,我正在用tgfx 在鸿蒙上构造一套弹幕的场景,单个item第一次 通过tgfx::Surface::Make(grContext, width, height, false) (目前测试场景所有的item的surface复用一个),获取的canvas,生成Image,后面进行Image的平移,测试后(测试case:1秒10条,每条10个字符左右),发现每帧的提交上屏context->flushAndSubmit(); |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 42 replies
-
tgfx 是main 分支 2月17号之前的版本,目前跟踪了下 entry/src/main/cpp/third_party/tgfx/src/gpu/tasks/TextureUploadTask.cpp#onMakeResource# decoder->decode() 这一句比较耗时 |
Beta Was this translation helpful? Give feedback.
-
你这个主要是自身业务逻辑问题。你的判断条件是移动一整批弹幕出屏幕,然后就集中在一次渲染帧里生成了10个新的弹幕的截图缓存,这一帧的压力当然就非常大。其他帧就只是常规移动然后绘制这些缓存的截图,那些开销极低基本可以忽略。正常的弹幕逻辑应该也不是你这样的情况,可以分散点创建,比如每帧新增一个弹幕缓存,然后移动。或者移出一个到屏幕外后,就再补充创建另一个。不要扎堆创建就好了。另外有一个是跟用法有关系的问题,生成截图缓存的地方,不要去复用同一个Surface,这个毫无复用必要,因为你创建的Surface是要生成截图的,如果复用了会导致下次调用Surface的绘制是产生一次像素拷贝,性能就更低了。这种创建截图缓存的场合,每次使用独立的新的Surface就行。 |
Beta Was this translation helpful? Give feedback.
我们定位出问题原因了,是鸿蒙设备上开启了多线程后,子线程可能强制被运行在了效能核心上,相同的任务比主线程慢10倍。我们已经和华为反馈了这个问题,看看他们那边怎么解决。等解决之后会再提交最终的修复,目前暂时可以通过屏蔽多线程渲染的方法规避这个问题。更新main分支最新代码会有一个禁用多线程的编译开关:TGFX_USE_THREADS,编译的时候传递参数:-DTGFX_USE_THREADS=OFF 就行。