下面是我在一个活动的onResume()部分将SurfaceTextureListener附加到TextureView的实验.
新开始:表面纹理可用("onSurfaceTextureAvailable")
取向变化:正如我所料,表面纹理被破坏("onSurfaceTextureDestroyed"),然后表面纹理可用("onSurfaceTextureAvailable").
现在,这让我感到惊讶:
在这些条件下,我保证旧的SurfaceTexture是否有效?如何确保我确实知道我的SurfaceTexture何时可用?为什么方向更改与任务切换不同,我应该如何知道?
public class MainActivity extends AppCompatActivity {
private final String TAG = "MainActivity";
TextureView mTextureView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextureView = (TextureView) findViewById(R.id.textureView);
}
@Override
public void onResume() {
super.onResume();
mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Log.d(TAG, "onSurfaceTextureAvailable");
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
Log.d(TAG, "onSurfaceTextureSizeChanged");
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
Log.d(TAG, "onSurfaceTextureDestroyed");
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我\xc2\xb4d 说这不是问题,也不是“正常”或“预期”的行为。它与设备的硬件以及系统如何处理资源使用或硬件更改中的过载有很大关系。
\n\n如果您的设备具有非常灵活的图形加速器,那么您的表面可能会在方向变化时幸存下来。请注意,当设备标题时,视频模式会完全更改,并记住在视频模式从桌面窗口更改为全屏或在视频模式更改后必须重新创建所有 DirectX 表面(表面是视频内存)时,为桌面设备编程的情况。反之亦然。
\n\n同样的事情也会发生,也许你的应用程序是一个资源使用量很大的游戏,\xc2\xb4s 耗尽了纹理或后缓冲区表面的所有视频内存量,等等......如果你切换到另一个应用程序,而这个新应用程序需要表面空间,您的部分或全部视频内存应该被杀死才能使这个新屏幕正常工作。
\n\n因此...您看到了吗?...可能会发生这样的情况:您\xc2\xb4 没有用完全部视频内存,或者只是您\xc2\xb4 拥有一台配备最新软件的坏设备,可以同时处理这两种情况轻微或温和的变化不会破坏您的资源。
\n\n我的演讲的寓意是,您必须处理销毁,以防它被销毁,即使它从未在您的设备中发生,否则您将遇到很多尝试锁定画布或渲染为空的异常。
\n