mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-06 08:38:30 +09:00
q&d hack to circumvent the dangling pointer issue #26
This commit is contained in:
@@ -32,12 +32,16 @@ class UnsafePtr(val ptr: Long, val allocSize: Long) {
|
|||||||
fun destroy() {
|
fun destroy() {
|
||||||
if (!destroyed) {
|
if (!destroyed) {
|
||||||
UnsafeHelper.unsafe.freeMemory(ptr)
|
UnsafeHelper.unsafe.freeMemory(ptr)
|
||||||
|
|
||||||
|
println("[UnsafePtr] Destroying pointer $this; called from:")
|
||||||
|
Thread.currentThread().stackTrace.forEach { println("[UnsafePtr] $it") }
|
||||||
|
|
||||||
destroyed = true
|
destroyed = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inline fun checkNullPtr(index: Long) {
|
private inline fun checkNullPtr(index: Long) {
|
||||||
if (destroyed) throw NullPointerException("The pointer is already destroyed (0x${ptr.toString(16)})")
|
if (destroyed) throw NullPointerException("The pointer is already destroyed ($this)")
|
||||||
|
|
||||||
// OOB Check: debugging purposes only -- comment out for the production
|
// OOB Check: debugging purposes only -- comment out for the production
|
||||||
//if (index !in 0 until allocSize) throw IndexOutOfBoundsException("Index: $index; alloc size: $allocSize")
|
//if (index !in 0 until allocSize) throw IndexOutOfBoundsException("Index: $index; alloc size: $allocSize")
|
||||||
@@ -67,4 +71,5 @@ class UnsafePtr(val ptr: Long, val allocSize: Long) {
|
|||||||
UnsafeHelper.unsafe.setMemory(ptr, allocSize, byte)
|
UnsafeHelper.unsafe.setMemory(ptr, allocSize, byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun toString() = "0x${ptr.toString(16)} with size $allocSize"
|
||||||
}
|
}
|
||||||
@@ -253,7 +253,9 @@ class TitleScreen(val batch: SpriteBatch) : Screen {
|
|||||||
gdxClearAndSetBlend(.64f, .754f, .84f, 1f)
|
gdxClearAndSetBlend(.64f, .754f, .84f, 1f)
|
||||||
|
|
||||||
|
|
||||||
IngameRenderer.invoke(gamePaused = false, world = demoWorld, uisToDraw = uiContainer)
|
if (!demoWorld.disposed) { // FIXME q&d hack to circumvent the dangling pointer issue #26
|
||||||
|
IngameRenderer.invoke(gamePaused = false, world = demoWorld, uisToDraw = uiContainer)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
batch.inUse {
|
batch.inUse {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import net.torvald.terrarum.AppLoader.printdbg
|
|||||||
*/
|
*/
|
||||||
open class BlockLayer(val width: Int, val height: Int) : Disposable {
|
open class BlockLayer(val width: Int, val height: Int) : Disposable {
|
||||||
|
|
||||||
|
// using unsafe pointer gets you 100 fps, whereas using directbytebuffer gets you 90
|
||||||
private val ptr = UnsafeHelper.allocate(width * height * BYTES_PER_BLOCK)
|
private val ptr = UnsafeHelper.allocate(width * height * BYTES_PER_BLOCK)
|
||||||
|
|
||||||
//private val directByteBuffer: ByteBuffer
|
//private val directByteBuffer: ByteBuffer
|
||||||
|
|||||||
@@ -93,6 +93,9 @@ open class GameWorld : Disposable {
|
|||||||
var generatorSeed: Long = 0
|
var generatorSeed: Long = 0
|
||||||
internal set
|
internal set
|
||||||
|
|
||||||
|
var disposed = false
|
||||||
|
private set
|
||||||
|
|
||||||
|
|
||||||
constructor(worldIndex: Int, width: Int, height: Int, creationTIME_T: Long, lastPlayTIME_T: Long, totalPlayTime: Int) {
|
constructor(worldIndex: Int, width: Int, height: Int, creationTIME_T: Long, lastPlayTIME_T: Long, totalPlayTime: Int) {
|
||||||
if (width <= 0 || height <= 0) throw IllegalArgumentException("Non-positive width/height: ($width, $height)")
|
if (width <= 0 || height <= 0) throw IllegalArgumentException("Non-positive width/height: ($width, $height)")
|
||||||
@@ -461,6 +464,8 @@ open class GameWorld : Disposable {
|
|||||||
layerWall.dispose()
|
layerWall.dispose()
|
||||||
layerTerrain.dispose()
|
layerTerrain.dispose()
|
||||||
//nullWorldInstance?.dispose() // must be called ONLY ONCE; preferably when the app exits
|
//nullWorldInstance?.dispose() // must be called ONLY ONCE; preferably when the app exits
|
||||||
|
|
||||||
|
disposed = true
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
Reference in New Issue
Block a user