我的项目基于surfaceView,直到现在我已经在onDraw中完成了所有渲染,而我已经覆盖了.一切似乎都没问题.
但是,我刚刚更新了我的SDK,现在它给了我一个错误告诉我:
可疑方法电话; 应该叫"画"而不是"onDraw"
有人可以解释这两者之间的区别吗?
我已经在网上阅读了一些类似的问题,但我没有找到我理解的解释.
谢谢
我正在考虑投资Google Nexus 10作为我测试我的应用程序的首选平板电脑 - 我只是想知道是否有可能模仿其他设备的屏幕分辨率?由于nexus 10具有如此高的分辨率和DPI,我希望能够在其上运行我的应用程序,例如800 x 480屏幕等...
如果可能的话,我想这样做,因为它比使用模拟器更快,并且支持多点触控.这看起来很简单,但实际上可能吗?
即将推出的Google政策更改,迫使我们实施一个对话框,通知欧盟用户有关广告和分析的Cookie /设备标识符使用情况.我想只向欧盟用户展示此对话框.我不想使用其他权限(例如android.permission.ACCESS_COARSE_LOCATION).因此我创建了一个测试欧盟用户的功能:
Android的
boolean showCookieHint()
{
final SharedPreferences settings = getSharedPreferences("localPreferences", Context.MODE_PRIVATE);
if (settings.getBoolean("termsAccepted", true) == false) return false;
List<String> list = new ArrayList<String>();
list.add("AT"); //Austria
list.add("BE"); //Belgium
list.add("BG"); //Bulgaria
list.add("HR"); //Croatia
list.add("CY"); //Cyprus
list.add("CZ"); //Czech Republic
list.add("DK"); //Denmark
list.add("EE"); //Estonia
list.add("FI"); //Finland
list.add("FR"); //France
list.add("GF"); //French Guiana
list.add("PF"); //French Polynesia
list.add("TF"); //French Southern Territories
list.add("DE"); //Germany
list.add("GR"); //Greece
list.add("HU"); //Hungary
list.add("IE"); //Ireland
list.add("IT"); //Italy
list.add("LV"); //Latvia
list.add("LT"); //Lithuania
list.add("LU"); //Luxembourg
list.add("MT"); //Malta
list.add("NL"); //Netherlands
list.add("PL"); //Poland
list.add("PT"); …Run Code Online (Sandbox Code Playgroud) 如果我的自定义类中有2个构造函数,并且其中一个构造函数需要一个额外的参数并完成第一个构造函数,但只需要一行代码(并且这个额外的行使用额外的参数),如何在没有它的情况下处理这个问题.必须复制第一个构造函数中的所有代码?
示例代码
public myConstuctor(int number, int number2){
int result = (number + number2);
int result2 = (number2 - number1)
//Etc
//Etc
//Etc
//Etc
}
public myConstructor(int number1, int number2, int number 3){
int result = (number + number2);
int result2 = (number2 - number1)
//Etc
//Etc
//Etc
//Etc
int result3 = (result + result2 + number3)
}
Run Code Online (Sandbox Code Playgroud) 概观
在我的(Android)Java游戏中,我有一个名为resources的类.顾名思义,这个班级掌握了游戏的资源.我在这里创建了所有的OpenGL对象(Sprite)
它看起来像下面的内容(显然,这是一个简化的版本,与真实项目中出现的版本相比):
public class Resources {
Hero hero;
Enemy enemy;
MenuButtons mainMenuButtons;
Background background;
Scene mainMenu;
public void createObjects(){
hero = new Hero();
enemy = new Enemy();
mainMenuButtons = new MenuButtons();
background = new Background();
mainMenu = new Scene(this);
}
}
Run Code Online (Sandbox Code Playgroud)
所以,在我的mainMenu场景中,我需要访问我的对象,所以我们可能会看到这样的东西:
public class mainMenu implements Scene {
Resources resources;
public mainMenu(Resources resources){
this.resources = resources;
}
@Override
public void render(){
resources.background.draw();
resources.hero.draw();
resources.enemy.draw();
mainMenuButtons.draw();
}
@Override
public void updateLogic(){
resources.hero.move();
resources.enemy.move();
resources.mainMenubuttons.animate();
}
} …Run Code Online (Sandbox Code Playgroud) 一段时间以来,我经历了一段间歇性的"口吃",即在我的Android游戏中运行的精灵.这是一款非常简单的2D OpenGL ES 2.0游戏.(这是一个持续存在的问题,我多次重访过).
在我的游戏循环中,我有2个'定时器' - 一个用于记录前一秒的帧数,另一个用于计算从当前onDrawFrame迭代结束到下一个开始的时间(以毫秒为单位).
这就是我发现的:
当不渲染任何东西时,我得到60fps(大部分),并且每次调用onDrawFrame时,它报告自己需要更长的16.667ms.现在,如果我渲染一些东西(无论是1个四边形还是100个四边形,结果是相同的),我得到60fps(大部分)但是现在,只有大约20%的onDrawFrame调用报告自己需要更长的时间比上次通话时的16.667毫秒.
我真的不明白为什么会发生这种情况,首先,为什么当onDrawFrame没有做任何事情时,它被称为"慢慢" - 更重要的是,为什么任何GL调用(一个简单的四边形),仍然需要时间onDrawFrame调用超过16.667ms(尽管频率低得多).
我应该说当onDrawFrame报告从最后一次迭代开始超过16.667ms时,它几乎总是伴随着FPS下降(到58或59),但并非所有时间,有时候,FPS保持不变.相反,有时当FPS下降时,onDrawFrame在最后一次迭代完成的16.667ms内被调用.
所以......
我正在尝试修复我的游戏循环并根除这些"口吃" - 其他一些注意事项:
我显然是在误解某些东西,所以我们将不胜感激.
OnDrawFrame
@Override
public void onDrawFrame(GL10 gl) {
startTime = System.nanoTime();
fps++;
totalTime = System.nanoTime() - timeSinceLastCalled;
if (totalTime > 16667000) {
Log.v("Logging","Time between onDrawFrame calls: " + (totalTime /(double)1000000));
}
//Grab time
newTime = System.currentTimeMillis() * 0.001;
frameTime = newTime - currentTime; //Time the last frame took
if (frameTime > 0.25)
frameTime = 0.25;
currentTime = …Run Code Online (Sandbox Code Playgroud) 如果我的代码中有这样的东西:
String line = r.readLine(); //Where r is a bufferedReader
Run Code Online (Sandbox Code Playgroud)
如果下一行是文件的结尾,我该如何避免崩溃?(即null)
我需要阅读下一行,因为可能有一些我需要处理的东西,但如果没有代码只是崩溃.
如果有什么东西那么一切都没问题,但我无法保证那里会有东西.
所以,如果我做了类似的事情:(伪代码):
if (r.readLine is null)
//End code
else {check line again and excecute code depending on what the next line is}
Run Code Online (Sandbox Code Playgroud)
我遇到类似这样的问题是,当我检查该行反对null时,它已经移动到下一行,所以我该如何再次检查它?
我没有找到办法做到这一点 - 任何建议都会有很大的帮助.
简单的问题,不确定是否有一个简单的答案!!
我能做些什么来加速我的surfaceview绘图?
我正在使用这样的东西:
c.drawBitmap(scaledSprite, X, Y, redPaint);
Run Code Online (Sandbox Code Playgroud)
我正在使用的方法必须在屏幕上绘制大约25个这些精灵,所以我使用for循环,这意味着它必须在一帧中显示25.
现在,这在我测试过的3款手机上运行得非常好,但在平板电脑上,它只是放慢速度.我已经评论了所有其他的绘图方法,只留下了这一个,这绝对是减缓游戏速度的原因.
是否有任何聪明的提示可以让我加快速度?
我知道开放GL是一种可能性,但现在大部分游戏都已编写好,所以如果我能帮助的话,我现在并不想做任何重大改变.
简单的问题 - 您可以在Google Play的Alpha和Beta测试期间使用实时AdMob广告(即不在测试模式下)吗?
我有一个启用了Proguard的应用程序(minifyenabled true),最近在Google Play开发者控制台中收到了崩溃报告.当我看着它时,我看到了以下内容:
当Proguard启用时,我很惊讶地看到第1行中的完整类和方法名称.我以前总是看到这样的事情:
在com.myname.myapp.cf(未知来源)
我也很好奇线号是如何出现的,因为我没有在我的Proguard配置文件中保留行号(因此,为什么我通常在我的堆栈跟踪中看到'未知来源').
我反编译我的.apk,偷看了classes.dex文件,看起来一切都很好.我找到了堆栈跟踪的第1行中引用的类,并且类名确实是模糊的,方法名称也是如此.
现在,'MyActivity'(stacktrace的第2行)是我的应用程序的启动Activity,因此在Manifest中声明,所以我理解为什么它的名称没有被混淆,'onConnected'方法不是我的(它来自谷歌Play游戏服务),所以,再次,这是好的.
"MyMethodName"从所谓的内 onConnected像这样:
@Override
public void onConnected(Bundle arg0) {
myClassObject.myMethodName(); //Where myClassObject is an instance of MyClassName
}
Run Code Online (Sandbox Code Playgroud)
在我的build.gradle文件中将Debug设置为disabled.
我没有将mapping.txt文件上传到Play控制台,我手动运行回扫以查看我的去混淆堆栈跟踪.
如果有人能帮助我理解为什么我在这里看到我的全班和方法名,我会很感激?我可以/应该做些什么来防止这种情况发生?
android ×8
java ×3
admob ×2
google-play ×2
performance ×2
tablet ×2
accessor ×1
adsense ×1
constructor ×1
cookies ×1
dpi ×1
draw ×1
duplicates ×1
emulation ×1
file-io ×1
frame-rate ×1
game-loop ×1
ondraw ×1
overloading ×1
policy ×1
proguard ×1
readline ×1
resolution ×1
resources ×1
sprite ×1
surfaceview ×1