草庐IT

android - 在 Android 上上传纹理时避免停顿

coder 2023-12-04 原文

我们的游戏要求我们不断加载和创建新图像,我们将这些图像放到纹理页面上,然后用于渲染。我们使用 glTexSubImage2d 上传来修改部分纹理页面。我们不保留系统拷贝。每当我们这样做时,我们在 glTexSubImage2d 调用中都会有六帧延迟。我们确实会在游戏开始前将大部分图像加载到纹理上,但有些东西必须是动态的。

我假设整个渲染管线,无论是双重缓冲还是三重缓冲,都被刷新了,因为我想修改它正在使用或有引用的纹理。即便如此,六帧加(0.1 秒)似乎过多。我们在 IOS 上做的完全一样,您几乎不会注意到修改纹理时有任何延迟。游戏通常运行 1 或 2 帧。

有人知道发生了什么事吗?这是在 Samsung Galaxy Note GTN7000 上运行的。我们正在使用 SurfaceView 类。你能“关掉这个摊位”吗?我知道这可能意味着渲染可能没有更新纹理的帧左右的 Artifact 。

此外,任何想法如何知道或设置其内部是双缓冲还是三缓冲。

我还了解到,大多数桌面/PC OpenGL 驱动程序通过拥有两个或三个纹理拷贝并仅更新当前未使用的纹理,然后适时更新拷贝来解决此问题。我们根本没有那个内存!

谢谢

肖恩

最佳答案

Mali GPU(在 N7000 中使用)是此类纹理上传停顿最差的 GPU。其他 GPU 处理得更好(或者至少驱动程序处理得更好)。

我遇到过与您描述的完全相同的问题,对我来说唯一的解决方案是保留纹理数据的 CPU 拷贝,并对纹理进行三重缓冲。每当我修改纹理时,我只修改 CPU 拷贝,并将纹理标记为脏的。在每一帧的开始,如果缓冲区已更新,我循环三个纹理并对其中一个执行 glTexSubImage2D,然后它成为 Activity 纹理。

如果您使用的纹理少于三个,或者如果您犯了任何错误并且在最后两帧中使用了您执行 glTexSubImage2D 的纹理,它仍然会停止。

我只在检测到 Mali GPU 时才这样做(检查驱动程序 GL 字符串)。对于其他 GPU 和 iOS,驱动程序足够好,不需要三重缓冲(因此我也不必保留数据的 CPU 拷贝)。我确实在 Arm/Mali 开发者论坛上查看过这个问题,他们推荐了三重缓冲。不过,您不需要超过三个。

另一个我取得了一些有限成功的解决方法是在 Mali GPU 上始终使用 glTexImage2D 而不是 glTexSubImage2D。这需要保留纹理数据的 CPU 端拷贝。它在我的测试中执行得非常快,大概是因为在驱动程序中它正在制作纹理的新拷贝,因此如果以前的纹理仍在使用中则不必停止。

还有另一种可能的解决方案,我也实现了但不再使用。您可以使用 Android GraphicBuffers。有关一些基本信息,请参阅此链接:Using Direct Textures on Android 这种方法让您可以毫无停顿地写入纹理,但是,它不是官方支持的 API,我只能让它在 Mali 上工作,而且需要付出很多努力。它本身并不能完全解决问题,因为您仍然需要自己进行同步控制,否则您的应用程序可能会在使用纹理数据时覆盖它,最终导致屏幕出现一些损坏。

关于android - 在 Android 上上传纹理时避免停顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20931700/

有关android - 在 Android 上上传纹理时避免停顿的更多相关文章

  1. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. ruby - 在 Ruby 中为变量赋值时如何避免控制台输出 - 2

    赋值时是否可以避免这种影响:irb(main):584:0>a=true=>trueirb(main):584:0>我有一个代码有很多赋值,当我试图测试它时,由于所有这些返回值,我看不到结果:truefalsetruefalsetruetrue.. 最佳答案 您可以启动irb或附加--noecho选项的控制台。$irb--noecho2.0.0p353:001>true2.0.0p353:002>否则,如果控制台由另一个进程启动,只需设置conf.echo=false$irb2.0.0p353:001>true=>true2.0.0

  4. ruby-on-rails - Rails - 如何避免在 View 中使用 hidden_​​fields 将值传递给 Controller ​​? - 2

    有没有一种方法可以避免hidden_​​field方法将View中的值传递给Controller​​?出于安全原因,我更喜欢Controller方法。不幸的是,strong_parameters不支持值对@variables。EDIT6/181:00PMESTI'verenamedmygaragescontrollertoappointmentscars_controllernolongercreatesanewappointment(formallygarages).Anewappointmentiscreatedintheappointments_controller我目前的结构路

  5. ruby - 如何使用 ruby​​ fibers 避免阻塞 IO - 2

    我需要将目录中的一堆文件上传到S3。由于上传所需的90%以上的时间都花在了等待http请求完成上,所以我想以某种方式同时执行其中的几个。Fibers能帮我解决这个问题吗?它们被描述为解决此类问题的一种方法,但我想不出在http调用阻塞时我可以做任何工作的任何方法。有什么方法可以在没有线程的情况下解决这个问题? 最佳答案 我没有使用1.9中的纤程,但是1.8.6中的常规线程可以解决这个问题。尝试使用队列http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html查看文

  6. ruby - 阅读用户输入时如何避免回显换行符? - 2

    我正在用Ruby编写类似curses的程序,我正在使用stty和ansi转义字符来实现我想要的。当我想获得用户输入时,我的问题就出现了。像许多基于控制台的程序一样,我想从终端底部获取用户输入。因此,我将光标放在屏幕底部并调用Readline.readline(或任何获取用户输入的方法)。像往常一样,它会读取所有内容,直到我按下回车键,并打印一个换行符。由于光标位于终端的最后一行,它会滚动一行,这会弄乱屏幕。我怎样才能避免这种情况?我试图使用stty来停止回显换行符,但我没有成功。也许可以使用stty来阻止终端滚动?当然,我可以编写自己的方法来通过一次读取一个字符(并捕获“返回”)来捕获

  7. ruby-on-rails - 如何避免法拉第请求编码获取参数? - 2

    我有以下代码conn=Faraday.new(:url=>'http://www.mapquestapi.com')do|faraday|faraday.response:logger#logrequeststoSTDOUTfaraday.adapterFaraday.default_adapter#makerequestswithNet::HTTPfaraday.options.params_encoder=Faraday::FlatParamsEncoderendresponse=conn.getdo|req|req.url'/geocoding/v1/batch'req.para

  8. ruby-on-rails - 访问嵌套哈希时如何避免 nil 元素的 NoMethodError? - 2

    这个问题在这里已经有了答案:RubyStyle:Howtocheckwhetheranestedhashelementexists(16个答案)HowtoavoidNoMethodErrorformissingelementsinnestedhashes,withoutrepeatednilchecks?(16个答案)关闭7年前。如果我尝试访问不存在的哈希元素,我会收到NoMethodError:undefinedmethod'[]'fornil:NilClass。但是,我无法预测会出现哪些元素。@param_info={}@param_info["drug"]["name"]#=>N

  9. ruby - 在控制台执行命令后避免打印 - 2

    我正在打开非常大的YAML文件。这需要一段时间。但在打开它之后,它正在打印所有内容-并且它花费了很多倍的时间。那么如何避免在Ruby控制台中打印结果:data=YAML.load_file(...)#some1GBdatafile. 最佳答案 我假设您是在控制台中执行此操作。如果我不想看到输出,我通常只添加“;:ok”。data=YAML.load_file(...);:ok 关于ruby-在控制台执行命令后避免打印,我们在StackOverflow上找到一个类似的问题:

  10. ruby - 我应该如何避免内存导致 Ruby 中的错误? - 2

    是否已就如何避免因可变状态导致的记忆化错误达成共识?在此示例中,缓存结果的状态发生了变化,因此在第二次调用时给出了错误的结果。classGreeterdefinitialize@greeting_cache={}enddefexpensive_greeting_calculation(formality)caseformalitywhen:casualthen"Hi"when:formalthen"Hello"endenddefgreeting(formality)unless@greeting_cache.has_key?(formality)@greeting_cache[form

随机推荐