下面是我在一个活动的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) {
}
});
}
}
答案 0 :(得分:0)
我说这不是一个问题,它不是“正常”或“预期成为”的行为。它与您设备的硬件以及系统如何处理资源使用或硬件更改的过载有很大关系。
如果您的设备具有非常灵活的图形加速器,那么您的表面可能会在方向更改后继续存在。当设备被标题化时,视频模式会完全改变并记住桌面设备的编程时间,当所有DirectX表面(表面都是视频内存)都必须在视频模式更改后重新创建,如从桌面窗口切换到全屏或反之亦然。
同样的事情发生时,也许你的应用程序是一个沉重的资源使用游戏,用尽所有的视频内存量,如纹理或后台缓冲区的表面,或者等等...如果你切换到另一个应用程序和这个新的需要表面空间,应该杀死部分或全部视频内存,以使这个新屏幕正常工作。
因此......你明白了吗?...可能会发生这样的情况:你没有用完全部的视频内存,或者只是你已经拥有了一台带有可以处理两者的最新软件的badass设备< em> light 或 soft 更改不会破坏您的资源。
我的,否则无用的演讲的道德是你必须处理毁灭,以防万一它被破坏,即使它永远不会发生在你的设备中,或者你会有很多异常试图锁定画布或渲染空。